Fixing typos made in comments
[apps/agl-service-can-low-level.git] / low-can-binding / diagnostic / diagnostic-manager.cpp
index 0454a7e..bc335df 100644 (file)
@@ -49,8 +49,8 @@ diagnostic_manager_t::~diagnostic_manager_t()
        }
 }
 
-/// @brief Diagnostic manager isn't initialized at launch but after
-///  CAN bus devices initialization. For the moment, it is only possible
+/// @brief Diagnostic manager is not initialized at launch but after
+///  the initialization of CAN bus devices. For the moment, it is only possible
 ///  to have 1 diagnostic bus which are the first bus declared in the JSON
 ///  description file. Configuration instance will return it.
 ///
@@ -149,10 +149,6 @@ void diagnostic_manager_t::shims_logger(const char* format, ...)
        va_end(args);
 }
 
-/// @brief The type signature for a... OpenXC TODO: not used yet.
-void diagnostic_manager_t::shims_timer()
-{}
-
 const std::string diagnostic_manager_t::get_bus_name() const
 {
        return bus_;
@@ -272,8 +268,7 @@ active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(Diagno
 ///
 /// @param[in] request - The parameters for the request.
 /// @param[in] name - Human readable name this response, to be used when
-///      publishing received responses. TODO: If the name is NULL, the published output
-///      will use the raw OBD-II response format.
+///      publishing received responses.
 /// @param[in] wait_for_multiple_responses - If false, When any response is received
 ///      for this request it will be removed from the active list. If true, the
 ///      request will remain active until the timeout clock expires, to allow it
@@ -286,8 +281,7 @@ active_diagnostic_request_t* diagnostic_manager_t::find_recurring_request(Diagno
 ///      response is received for this request.
 ///
 /// @return true if the request was added successfully. Returns false if there
-/// wasn't a free active request entry, if the frequency was too high or if the
-/// CAN acceptance filters could not be configured,
+/// wasn't a free active request entry.
 active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest* request, const std::string& name,
        bool wait_for_multiple_responses, const DiagnosticResponseDecoder decoder,
        const DiagnosticResponseCallback callback)
@@ -298,22 +292,20 @@ active_diagnostic_request_t* diagnostic_manager_t::add_request(DiagnosticRequest
 
        if (non_recurring_requests_.size() <= MAX_SIMULTANEOUS_DIAG_REQUESTS)
        {
-               // TODO: implement Acceptance Filter
-               //      if(updateRequiredAcceptanceFilters(bus, request)) {
-                       active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name,
-                                       wait_for_multiple_responses, decoder, callback, 0);
-                       entry->set_handle(shims_, request);
+               active_diagnostic_request_t* entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name,
+                               wait_for_multiple_responses, decoder, callback, 0, false);
+               entry->set_handle(shims_, request);
 
-                       char request_string[128] = {0};
-                       diagnostic_request_to_string(&entry->get_handle()->request, request_string,
-                                       sizeof(request_string));
+               char request_string[128] = {0};
+               diagnostic_request_to_string(&entry->get_handle()->request, request_string,
+                               sizeof(request_string));
 
-                       // Erase any existing request not already cleaned.
-                       cleanup_request(entry, true);
-                       AFB_DEBUG("Added one-time diagnostic request on bus %s: %s",
-                                       bus_.c_str(), request_string);
+               // Erase any existing request not already cleaned.
+               cleanup_request(entry, true);
+               AFB_DEBUG("Added one-time diagnostic request on bus %s: %s",
+                               bus_.c_str(), request_string);
 
-                       non_recurring_requests_.push_back(entry);
+               non_recurring_requests_.push_back(entry);
        }
        else
        {
@@ -364,11 +356,10 @@ bool diagnostic_manager_t::validate_optional_request_attributes(float frequencyH
 ///      function return false.
 ///
 /// @return true if the request was added successfully. Returns false if there
-/// was too much already running requests, if the frequency was too high TODO:or if the
-/// CAN acceptance filters could not be configured,
+/// was too much already running requests, or if the frequency was too high.
 active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(DiagnosticRequest* request, const char* name,
                bool wait_for_multiple_responses, const DiagnosticResponseDecoder decoder,
-               const DiagnosticResponseCallback callback, float frequencyHz)
+               const DiagnosticResponseCallback callback, float frequencyHz, bool permanent)
 {
        active_diagnostic_request_t* entry = nullptr;
 
@@ -382,7 +373,7 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
                if(recurring_requests_.size() <= MAX_SIMULTANEOUS_DIAG_REQUESTS)
                {
                        entry = new active_diagnostic_request_t(bus_, request->arbitration_id, name,
-                                       wait_for_multiple_responses, decoder, callback, frequencyHz);
+                                       wait_for_multiple_responses, decoder, callback, frequencyHz, permanent);
                        recurring_requests_.push_back(entry);
 
                        entry->set_handle(shims_, request);
@@ -405,10 +396,14 @@ active_diagnostic_request_t* diagnostic_manager_t::add_recurring_request(Diagnos
 /// @param[in] response - The response to decode from which the Vehicle message will be built and returned
 ///
 /// @return A filled openxc_VehicleMessage or a zeroed struct if there is an error.
-openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response)
+openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_diagnostic_request_t* adr, const DiagnosticResponse& response, const uint64_t timestamp)
 {
        openxc_VehicleMessage message = build_VehicleMessage();
        float value = (float)diagnostic_payload_to_integer(&response);
+
+       struct utils::signals_found found_signals;
+       found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField((double) adr->get_pid()));
+
        if(adr->get_decoder() != nullptr)
        {
                value = adr->get_decoder()(&response, value);
@@ -434,8 +429,6 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
        // If not success but completed then the pid isn't supported
        if(!response.success)
        {
-               struct utils::signals_found found_signals;
-               found_signals = utils::signals_manager_t::instance().find_signals(build_DynamicField(adr->get_name()));
                found_signals.diagnostic_messages.front()->set_supported(false);
                cleanup_request(adr, true);
                AFB_NOTICE("PID not supported or ill formed. Please unsubscribe from it. Error code : %d", response.negative_response_code);
@@ -449,6 +442,20 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_response(active_dia
 
        // Reset the completed flag handle to make sure that it will be reprocessed the next time.
        adr->get_handle()->success = false;
+
+       // Save value and timestamp of diagnostic message
+       if(!found_signals.diagnostic_messages.empty())
+       {
+               // Then, for each diag_message found
+               for(const auto& diag_mess: found_signals.diagnostic_messages)
+               {
+                       // Save value and timestamp for this message
+                       diag_mess->set_received(true);
+                       diag_mess->set_last_value(value);
+                       diag_mess->set_timestamp(timestamp);
+               }
+       }
+
        return message;
 }
 
@@ -466,7 +473,7 @@ openxc_VehicleMessage diagnostic_manager_t::relay_diagnostic_handle(active_diagn
        if(response.completed && entry->get_handle()->completed)
        {
                if(entry->get_handle()->success)
-                       return relay_diagnostic_response(entry, response);
+                       return relay_diagnostic_response(entry, response, cm.get_timestamp());
        }
        else if(!response.completed && response.multi_frame)
        {