Make template from similar writing stream operations.
[apps/low-level-can-service.git] / CAN-binder / low-can-binding / low-can-binding.cpp
index d6e1944..e6af92c 100644 (file)
@@ -124,12 +124,11 @@ static int subscribe_unsubscribe_signal(struct afb_req request, bool subscribe,
 }
 
 ///
-/// @fn static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe, const std::vector<can_signal_t>& signals)
 /// @brief subscribe to all signals in the vector signals
 ///
 /// @param[in] afb_req request : contain original request use to subscribe or unsubscribe
 /// @param[in] subscribe boolean value used to chose between a subscription operation or an unsubscription
-/// @param[in] can_signal_t  vector with can_signal_t to subscribe
+/// @param[in] signals -  struct containing vectors with can_signal_t and diagnostic_messages to subscribe
 ///
 /// @return Number of correctly subscribed signal
 ///
@@ -143,22 +142,23 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
 
        for(const auto& sig : signals.diagnostic_messages)
        {
+               diagnostic_manager_t& diag_m = conf.get_diagnostic_manager();
                DiagnosticRequest* diag_req = conf.get_request_from_diagnostic_message(sig->get_name());
 
-               // If the requested diagnostic message isn't supported by the car then unssubcribe.
+               // If the requested diagnostic message isn't supported by the car then unsubcribe it
                // no matter what we want, worse case will be a fail unsubscription but at least we don't
                // poll a PID for nothing.
                if(sig->get_supported() && subscribe)
                {
                                float frequency = sig->get_frequency();
-                               subscribe = conf.get_diagnostic_manager().add_recurring_request(
+                               subscribe = diag_m.add_recurring_request(
                                        diag_req, sig->get_name().c_str(), false, sig->get_decoder(), sig->get_callback(), (float)frequency);
                                        //TODO: Adding callback requesting ignition status:     diag_req, sig.c_str(), false, diagnostic_message_t::decode_obd2_response, diagnostic_message_t::check_ignition_status, frequency);
                }
                else
                {
-                       conf.get_diagnostic_manager().cleanup_request(
-                               conf.get_diagnostic_manager().find_recurring_request(diag_req), true);
+                       diag_m.cleanup_request(
+                               diag_m.find_recurring_request(diag_req), true);
                        WARNING(binder_interface, "%s: signal: %s isn't supported. Canceling operation.", __FUNCTION__, sig->get_name().c_str());
                        return -1;
                }
@@ -172,16 +172,18 @@ static int subscribe_unsubscribe_signals(struct afb_req request, bool subscribe,
 
        for(const auto& sig: signals.can_signals)
        {
-               ret = subscribe_unsubscribe_signal(request, subscribe, sig->get_name());
-               if(ret <= 0)
-                       return ret;
-               rets++;
-               DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
+               if(conf.get_can_bus_manager().create_rx_filter(*sig) <= 0 && 
+               subscribe_unsubscribe_signal(request, subscribe, sig->get_name()) <= 0)
+               {
+                       return -1;
+                       rets++;
+                       DEBUG(binder_interface, "%s: signal: %s subscribed", __FUNCTION__, sig->get_name().c_str());
+               }
        }
        return rets;
 }
 
-static const std::vector<std::string> parse_signals_from_request(struct afb_req request, bool subscribe)
+static const std::vector<std::string> parse_args_from_request(struct afb_req request, bool subscribe)
 {
        int i, n;
        std::vector<std::string> ret;
@@ -214,13 +216,14 @@ extern "C"
 {
        static void subscribe(struct afb_req request)
        {
-               std::vector<std::string> signals;
+               std::vector<std::string> args;
                struct utils::signals_found sf;
                int ok = 0, total = 0;
+               bool subscribe = true;
 
-               signals = parse_signals_from_request(request, true);
+               args = parse_args_from_request(request, subscribe);
 
-               for(const auto& sig: signals)
+               for(const auto& sig: args)
                {
                        openxc_DynamicField search_key = build_DynamicField(sig);
                        sf = utils::signals_manager_t::instance().find_signals(search_key);
@@ -241,7 +244,7 @@ extern "C"
 
        static void unsubscribe(struct afb_req request)
        {
-               parse_signals_from_request(request, false);
+               parse_args_from_request(request, false);
        }
 
        static const struct afb_verb_desc_v1 verbs[]=