Read each device in a background thread
A failed JBD read retried forever inside a client request and blocked every other device and client. The server now starts one polling thread for each device, and a request returns the last snapshot. Only the first request after startup waits, until each device completes one read attempt. One lock makes sure that only one Bluetooth collection runs at a time. A serial BMS retries a failed read after 1 second and keeps its last snapshot for 30 seconds. An error in a collection does not end the polling of that device.
This commit is contained in:
+18
-1
@@ -11,7 +11,17 @@ import serial
|
||||
|
||||
from bmspy.classes import BMSScalarField, BMSInfoField, UPS
|
||||
from bmspy.jbd_bms import JBDBMS
|
||||
from bmspy.server import DeviceState, parse_device, read_request, send_response
|
||||
from bmspy.server import (
|
||||
DeviceState, collect_device_data, parse_device, read_request, send_response,
|
||||
)
|
||||
|
||||
|
||||
def _poll_once(devices, stop, debug=0):
|
||||
"""Collect once in the server thread. main() stops its polling threads only
|
||||
at process exit, so real ones would outlive a test and call later mocks."""
|
||||
for device in devices.values():
|
||||
device.data = collect_device_data(device, debug)
|
||||
device.polled.set()
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -340,6 +350,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=True), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
@@ -525,6 +536,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=True), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
@@ -576,6 +588,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=False), \
|
||||
@@ -686,6 +699,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=True), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
@@ -777,6 +791,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=False), \
|
||||
patch("bmspy.server.os.makedirs"), \
|
||||
@@ -838,6 +853,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=JBDBMS()), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=True), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
@@ -901,6 +917,7 @@ class TestServerMain:
|
||||
patch("bmspy.server.signal.signal"), \
|
||||
patch("bmspy.server.initialise_serial", return_value=MagicMock()), \
|
||||
patch("bmspy.server.collect_data", return_value=fake_bms), \
|
||||
patch("bmspy.server.start_polling", _poll_once), \
|
||||
patch("bmspy.server.time.sleep"), \
|
||||
patch("bmspy.server.os.path.isdir", return_value=True), \
|
||||
patch("bmspy.server.os.path.exists", return_value=False), \
|
||||
|
||||
Reference in New Issue
Block a user