Vector of shared_ptr is made to shared ownership about object around project.
This is the default returned value by getter methods when lookup and manipulating
them.
Change-Id: Id37947bb5994b629f4bf3faecc5ffac81c55e1e6
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
, diagnostic_messages_
{
{
- {
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
4,
"engine.load",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
5,
"engine.coolant.temperature",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
10,
"fuel.pressure",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
11,
"intake.manifold.pressure",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
12,
"engine.speed",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
13,
"vehicle.speed",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
15,
"intake.air.temperature",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
16,
"mass.airflow",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
17,
"throttle.position",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
31,
"running.time",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
45,
"EGR.error",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
47,
"fuel.level",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
51,
"barometric.pressure",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
76,
"commanded.throttle.position",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
82,
"ethanol.fuel.percentage",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
90,
"accelerator.pedal.position",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
91,
"hybrid.battery-pack.remaining.life",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
92,
"engine.oil.temperature",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
94,
"engine.fuel.rate",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- },
- {
+ })},
+ {std::make_shared<diagnostic_message_t>(diagnostic_message_t{
99,
"engine.torque",
0,
decoder_t::decode_obd2_response,
nullptr,
true
- }
+ })}
}
}
{}
return can_message_set_[active_message_set_].get_can_signals();
}
-std::vector<diagnostic_message_t>& configuration_t::get_diagnostic_messages()
+std::vector<std::shared_ptr<diagnostic_message_t> > configuration_t::get_diagnostic_messages()
{
return diagnostic_messages_[active_message_set_];
}
}
-diagnostic_message_t* configuration_t::get_diagnostic_message(std::string message_name) const
+std::shared_ptr<diagnostic_message_t> configuration_t::get_diagnostic_message(std::string message_name) const
{
struct utils::signals_found found;
found = utils::signals_manager_t::instance().find_signals(build_DynamicField(message_name));
DiagnosticRequest* configuration_t::get_request_from_diagnostic_message(std::string message_name) const
{
- diagnostic_message_t* diag_msg = get_diagnostic_message(message_name);
+ std::shared_ptr<diagnostic_message_t> diag_msg = get_diagnostic_message(message_name);
if( diag_msg != nullptr && diag_msg->get_supported())
return new DiagnosticRequest(diag_msg->build_diagnostic_request());
return nullptr;
std::vector<can_message_set_t> can_message_set_; ///< Vector holding all message set from JSON signals description file
//std::vector<std::vector<can_message_definition_t>> can_message_definition_; ///< Vector of vector holding all can message definition from JSON signals description file. This describe a CAN message. First vector map to message set
//std::vector<std::vector<can_signal_t>> can_signals_; ///< Vector of vector holding all can signasl from JSON signals description file. A CAN signal is a part of a CAN message. First vector map to message set
- std::vector<std::vector<diagnostic_message_t>> diagnostic_messages_; ///< Vector of vector holding all diagnostics messages from JSON signals description file. First vector map to message set
+ std::vector<std::vector<std::shared_ptr<diagnostic_message_t> > > diagnostic_messages_; ///< Vector of vector holding all diagnostics messages from JSON signals description file. First vector map to message set
configuration_t(); ///< Private constructor with implementation generated by the AGL generator.
std::vector<std::shared_ptr<can_signal_t> > get_can_signals();
- std::vector<diagnostic_message_t>& get_diagnostic_messages();
+ std::vector<std::shared_ptr<diagnostic_message_t> > get_diagnostic_messages();
const std::vector<std::string>& get_signals_prefix() const;
void set_active_message_set(uint8_t id);
- diagnostic_message_t* get_diagnostic_message(std::string message_name) const;
+ std::shared_ptr<diagnostic_message_t> get_diagnostic_message(std::string message_name) const;
DiagnosticRequest* get_request_from_diagnostic_message(std::string message_name) const;
/*
/// TODO: implement this function as method into can_bus class
return -1;
}
struct sd_event_source* e_source;
- sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read, sig);
+ sd_event_add_io(afb_daemon_get_event_loop(binder_interface->daemon), &e_source, sig->get_socket().socket(), EPOLLIN, read, sig.get());
rets++;
DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
}
/// always succeeds.
///
openxc_DynamicField decoder_t::noopDecoder(can_signal_t& signal,
- const std::vector<can_signal_t>& signals, float value, bool* send)
+ const std::vector<std::shared_ptr<can_signal_t> > signals, float value, bool* send)
{
openxc_DynamicField decoded_value = build_DynamicField(value);
/// decoder always succeeds.
///
openxc_DynamicField decoder_t::booleanDecoder(can_signal_t& signal,
- const std::vector<can_signal_t>& signals, float value, bool* send)
+ const std::vector<std::shared_ptr<can_signal_t> > signals, float value, bool* send)
{
openxc_DynamicField decoded_value = build_DynamicField(value == 0.0 ? false : true);
/// @return Return value is undefined.
///
openxc_DynamicField decoder_t::ignoreDecoder(can_signal_t& signal,
- const std::vector<can_signal_t>& signals, float value, bool* send)
+ const std::vector<std::shared_ptr<can_signal_t> > signals, float value, bool* send)
{
if(send)
*send = false;
/// return value is undefined.
///
openxc_DynamicField decoder_t::stateDecoder(can_signal_t& signal,
- const std::vector<can_signal_t>& signals, float value, bool* send)
+ const std::vector<std::shared_ptr<can_signal_t> > signals, float value, bool* send)
{
const std::string signal_state = signal.get_states((uint8_t)value);
openxc_DynamicField decoded_value = build_DynamicField(signal_state);
/// string or boolean.
///
openxc_DynamicField decoder_t::translateSignal(can_signal_t& signal, const can_message_t& message,
- const std::vector<std::shared_ptr<can_signal_t> >& signals, bool* send)
+ const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send)
{
float value = decoder_t::parseSignalBitfield(signal, message);
DEBUG(binder_interface, "%s: Decoded message from parseSignalBitfield: %f", __FUNCTION__, value);
*send = false;
}
signal.set_last_value(value);
- signal.get_message().set_last_value(message);
+ signal.get_message()->set_last_value(message);
return decoded_value;
}
/// string or boolean. If 'send' is false, the return value is undefined.
///
openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
- float value, const std::vector<can_signal_t>& signals, bool* send)
+ float value, const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send)
{
SignalDecoder decoder = signal.get_decoder() == nullptr ?
noopDecoder : signal.get_decoder();
/// not be decoded.
///
openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
- const can_message_t& message, const std::vector<can_signal_t>& signals, bool* send)
+ const can_message_t& message, const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send)
{
float value = parseSignalBitfield(signal, message);
return decodeSignal(signal, value, signals, send);
public:
static float parseSignalBitfield(can_signal_t& signal, const can_message_t& message);
- static openxc_DynamicField stateDecoder(can_signal_t& signal, const std::vector<can_signal_t>& signals,
+ static openxc_DynamicField stateDecoder(can_signal_t& signal, const std::vector<std::shared_ptr<can_signal_t> > signals,
float value, bool* send);
- static openxc_DynamicField booleanDecoder(can_signal_t& signal, const std::vector<can_signal_t>& signals,
+ static openxc_DynamicField booleanDecoder(can_signal_t& signal, const std::vector<std::shared_ptr<can_signal_t> > signals,
float value, bool* send);
- static openxc_DynamicField ignoreDecoder(can_signal_t& signal, const std::vector<can_signal_t>& signals,
+ static openxc_DynamicField ignoreDecoder(can_signal_t& signal, const std::vector<std::shared_ptr<can_signal_t> > signals,
float value, bool* send);
- static openxc_DynamicField noopDecoder(can_signal_t& signal, const std::vector<can_signal_t>& signals,
+ static openxc_DynamicField noopDecoder(can_signal_t& signal, const std::vector<std::shared_ptr<can_signal_t> > signals,
float value, bool* send);
static openxc_DynamicField translateSignal(can_signal_t& signal, const can_message_t& message,
- const std::vector<std::shared_ptr<can_signal_t> >& signals, bool* send);
+ const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send);
static openxc_DynamicField decodeSignal(can_signal_t& signal, const can_message_t& message,
- const std::vector<can_signal_t>& signals, bool* send);
+ const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send);
static openxc_DynamicField decodeSignal(can_signal_t& signal, float value,
- const std::vector<can_signal_t>& signals, bool* send);
+ const std::vector<std::shared_ptr<can_signal_t> > signals, bool* send);
static float decode_obd2_response(const DiagnosticResponse* response, float parsed_payload);
{
for(auto& sig: can_signals_)
{
- sig->set_parent(std::make_shared<can_signal_t>(this));
+ sig->set_parent(std::make_shared<can_message_definition_t>(*this));
}
}
{
for(auto& cmd : can_messages_definition_)
{
- cmd->set_parent(std::make_shared<can_message_set_t>(this));
+ cmd->set_parent(std::make_shared<can_message_set_t>(*this));
}
}
void can_signal_t::set_parent(std::shared_ptr<can_message_definition_t> parent)
{
- parent_(parent);
+ parent_ = parent;
}
void can_signal_t::set_prefix(std::string val)
// Make sure that socket has been opened.
if(! socket_)
socket_.open(
- get_message().get_bus_name());
+ get_message()->get_bus_name());
- uint32_t can_id = get_message().get_id();
+ uint32_t can_id = get_message()->get_id();
struct utils::simple_bcm_msg bcm_msg;
struct can_frame cfd;
/// @return a decoded value in an openxc_DynamicField struct.
///
typedef openxc_DynamicField (*SignalDecoder)(can_signal_t& signal,
- const std::vector<can_signal_t>& signals, float value, bool* send);
+ const std::vector<std::shared_ptr<can_signal_t> > signals, float value, bool* send);
///
/// @brief: The type signature for a CAN signal encoder.
{
struct signals_found
{
- std::vector<can_signal_t*> can_signals;
- std::vector<diagnostic_message_t*> diagnostic_messages;
+ std::vector<std::shared_ptr<can_signal_t> > can_signals;
+ std::vector<std::shared_ptr<diagnostic_message_t> > diagnostic_messages;
};
class signals_manager_t
std::map<std::string, struct afb_event>& get_subscribed_signals();
struct signals_found find_signals(const openxc_DynamicField &key);
- void find_diagnostic_messages(const openxc_DynamicField &key, std::vector<diagnostic_message_t*>& found_signals);
- void find_can_signals(const openxc_DynamicField &key, std::vector<can_signal_t*>& found_signals);
+ void find_diagnostic_messages(const openxc_DynamicField &key, std::vector<std::shared_ptr<diagnostic_message_t> >& found_signals);
+ void find_can_signals(const openxc_DynamicField &key, std::vector<std::shared_ptr<can_signal_t> >& found_signals);
template <typename T>
- void lookup_signals_by_name(const std::string& key, std::vector<T>& signals, std::vector<T*>& found_signals)
+ void lookup_signals_by_name(const std::string& key, std::vector<std::shared_ptr<T> > signals, std::vector<std::shared_ptr<T> > found_signals)
{
- for(T& s : signals)
+ for(std::shared_ptr<T> s : signals)
{
- if(::fnmatch(key.c_str(), s.get_generic_name().c_str(), FNM_CASEFOLD) == 0)
- found_signals.push_back(&s);
- else if(::fnmatch(key.c_str(), s.get_name().c_str(), FNM_CASEFOLD) == 0)
- found_signals.push_back(&s);
+ if(::fnmatch(key.c_str(), s->get_generic_name().c_str(), FNM_CASEFOLD) == 0)
+ found_signals.push_back(s);
+ else if(::fnmatch(key.c_str(), s->get_name().c_str(), FNM_CASEFOLD) == 0)
+ found_signals.push_back(s);
}
}
template <typename T>
- void lookup_signals_by_id(const double key, std::vector<T>& signals, std::vector<T*>& found_signals)
+ void lookup_signals_by_id(const double key, std::vector<std::shared_ptr<T> > signals, std::vector<std::shared_ptr<T> > found_signals)
{
- for(T& s : signals)
+ for(std::shared_ptr<T> s : signals)
{
- if(configuration_t::instance().get_signal_id(s) == key)
+ if(configuration_t::instance().get_signal_id(*s) == key)
{
- found_signals.push_back(&s);
+ found_signals.push_back(s);
}
}
}