+
+bool application_t::is_engine_on()
+{
+ struct utils::signals_found sf;
+ openxc_DynamicField search_key = build_DynamicField("engine.speed");
+ sf = utils::signals_manager_t::instance().find_signals(search_key);
+ bool engine_on = false;
+ uint64_t last_timestamp_in_s;
+
+ if(sf.signals.size() == 1)
+ {
+ last_timestamp_in_s = sf.signals.front()->get_last_value_with_timestamp().second
+ / MICROSECONDS_IN_SECOND;
+
+ if(sf.signals.front()->get_last_value_with_timestamp().first > 0 &&
+ std::difftime(std::time(nullptr), last_timestamp_in_s) < ENGINE_VALUE_TIMEOUT)
+ {
+ engine_on = true;
+ }
+ else
+ {
+ AFB_NOTICE("is_engine_on: engine.speed CAN signal found, but engine seems off");
+ }
+ }
+ else
+ {
+ AFB_NOTICE("is_engine_on: Can't identify a useable engine.speed CAN signal");
+ }
+
+ if(sf.diagnostic_messages.size() == 1)
+ {
+ last_timestamp_in_s = sf.diagnostic_messages.front()->get_last_value_with_timestamp().second
+ / MICROSECONDS_IN_SECOND;
+
+ if(sf.diagnostic_messages.front()->get_last_value_with_timestamp().first > 0 &&
+ std::difftime(std::time(nullptr), last_timestamp_in_s) < ENGINE_VALUE_TIMEOUT)
+ {
+ engine_on = true;
+ }
+ else
+ {
+ AFB_NOTICE("is_engine_on: engine.speed diagnostic message found, but engine seems off");
+ }
+ }
+ else
+ {
+ AFB_NOTICE("is_engine_on: Can't identify a useable engine.speed diagnostic message");
+ }
+
+ return engine_on;
+}
+
+void application_t::set_parents(std::shared_ptr<message_set_t> new_message_set)
+{
+ vect_ptr_msg_def_t messages_definition = new_message_set->get_messages_definition();
+ for(std::shared_ptr<message_definition_t> cmd : messages_definition)
+ {
+ cmd->set_parent(new_message_set);
+ std::vector<std::shared_ptr<signal_t>> signals = cmd->get_signals();
+ for(std::shared_ptr<signal_t> sig: signals)
+ sig->set_parent(cmd);
+ }
+
+ std::vector<std::shared_ptr<diagnostic_message_t>> diagnostic_messages = new_message_set->get_diagnostic_messages();
+ for(std::shared_ptr<diagnostic_message_t> dm : diagnostic_messages)
+ dm->set_parent(new_message_set);
+}
+
+#ifdef USE_FEATURE_J1939
+std::shared_ptr<utils::socketcan_t> application_t::get_socket_address_claiming()
+{
+ return subscription_address_claiming_->get_socket();
+}
+
+std::shared_ptr<low_can_subscription_t> application_t::get_subscription_address_claiming()
+{
+ return subscription_address_claiming_;
+}
+
+
+void application_t::set_subscription_address_claiming(std::shared_ptr<low_can_subscription_t> new_subscription)
+{
+ subscription_address_claiming_ = new_subscription;
+}
+
+#endif