From d0730c0d643738ac683d1b5c19b117893e3b2049 Mon Sep 17 00:00:00 2001
From: Scott Murray <scott.murray@konsulko.com>
Date: Tue, 11 Oct 2022 15:28:07 -0400
Subject: [PATCH 2/2] dbc2val: usability improvements

Changes:
- Tweaked default configuration file search path to better match
  Linux FHS and kuksa-val-server.  First look for a config.ini in
  /etc/kuksa-dbc-feeder, then /etc/dbc_feeder.ini.
- Add catching of exceptions around CAN device opening so that the
  script can exit cleanly with an error message if the device is
  not available.
- Fixed shutdown behavior with some tweaks to actually stop the
  reader and KUKSA.val client library threads.  This makes the
  script actually exit on SIGTERM as opposed to hanging.

Upstream-Status: pending

Signed-off-by: Scott Murray <scott.murray@konsulko.com>
---
 dbc2val/dbcfeeder.py | 21 +++++++++++++++------
 dbc2val/dbcreader.py | 12 ++++++++----
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/dbc2val/dbcfeeder.py b/dbc2val/dbcfeeder.py
index 7daaa2b..33c2212 100755
--- a/dbc2val/dbcfeeder.py
+++ b/dbc2val/dbcfeeder.py
@@ -93,6 +93,7 @@ class Feeder:
         self._connected = False
         self._registered = False
         self._can_queue = queue.Queue()
+        self.kuksa = None
 
     def start(
         self,
@@ -134,7 +135,11 @@ class Feeder:
         else:
             # use socketCAN
             log.info("Using socket CAN device '%s'", canport)
-            self._reader.start_listening(bustype="socketcan", channel=canport)
+            try:
+                self._reader.start_listening(bustype="socketcan", channel=canport)
+            except:
+                log.error("Could not open {}, exiting".format(canport))
+                sys.exit(-1)
        
         # databroker related
         if USE_CASE=="databroker":
@@ -151,6 +156,8 @@ class Feeder:
         log.info("Shutting down...")
         self._shutdown = True
         # Tell others to stop
+        if USE_CASE=="kuksa" and self.kuksa is not None:
+            self.kuksa.stop()
         if self._reader is not None:
             self._reader.stop()
         if self._player is not None:
@@ -204,9 +211,10 @@ class Feeder:
         # kuksa related
         if USE_CASE=="kuksa":
             global kuksaconfig
-            kuksa = KuksaClientThread(kuksaconfig)
-            kuksa.start()
-            kuksa.authorize()
+            self.kuksa = KuksaClientThread(kuksaconfig)
+            self.kuksa.start()
+            if "token" in kuksaconfig:
+                self.kuksa.authorize(kuksaconfig["token"])
         
         while self._shutdown is False:
             # databroker related
@@ -255,7 +263,7 @@ class Feeder:
                             self._provider.update_datapoint(target, value)
                         # kuksa related
                         elif USE_CASE=="kuksa":
-                            resp=json.loads(kuksa.setValue(target, str(value)))
+                            resp=json.loads(self.kuksa.setValue(target, str(value)))
                             if "error" in resp:
                                 if "message" in resp["error"]: 
                                    log.error("Error setting {}: {}".format(target, resp["error"]["message"]))
@@ -282,8 +290,9 @@ def parse_config(filename):
         configfile = filename
     else:
         config_candidates = [
-            "/config/dbc_feeder.ini",
+            "/etc/kuksa-dbc-feeder/config.ini",
             "/etc/dbc_feeder.ini",
+            "/config/dbc_feeder.ini",
             "config/dbc_feeder.ini",
         ]
         configfile = None
diff --git a/dbc2val/dbcreader.py b/dbc2val/dbcreader.py
index 2500832..b537a4d 100644
--- a/dbc2val/dbcreader.py
+++ b/dbc2val/dbcreader.py
@@ -54,8 +54,8 @@ class DBCReader:
             Bitrate in bit/s.
         """
         self.bus = can.interface.Bus(*args, **kwargs)
-        rxThread = threading.Thread(target=self.rxWorker)
-        rxThread.start()
+        self.rxThread = threading.Thread(target=self.rxWorker)
+        self.rxThread.start()
 
     def get_whitelist(self):
         log.info("Collecting signals, generating CAN ID whitelist")
@@ -83,7 +83,10 @@ class DBCReader:
     def rxWorker(self):
         log.info("Starting Rx thread")
         while self.run:
-            msg = self.bus.recv(timeout=1)
+            try:
+                msg = self.bus.recv(timeout=1)
+            except Exception:
+                break
             if msg and msg.arbitration_id in self.canidwl:
                 try:
                     decode = self.db.decode_message(msg.arbitration_id, msg.data)
@@ -105,4 +108,5 @@ class DBCReader:
 
     def stop(self):
         self.run = False
-
+        self.bus.shutdown()
+        self.rxThread.join()
-- 
2.37.3