diff --git a/aprsd/client/drivers/aprsis.py b/aprsd/client/drivers/aprsis.py index c0319b2..37a1898 100644 --- a/aprsd/client/drivers/aprsis.py +++ b/aprsd/client/drivers/aprsis.py @@ -32,8 +32,12 @@ class APRSISDriver: connected = False def __init__(self): - max_timeout = {'hours': 0.0, 'minutes': 2, 'seconds': 0} - self.max_delta = datetime.timedelta(**max_timeout) + # Use configurable stale_timeout, defaulting to 120 seconds if not set + try: + stale_timeout = CONF.aprs_network.stale_timeout + except (cfg.NoSuchOptError, cfg.NoSuchGroupError): + stale_timeout = 120 # Default to 2 minutes for backward compatibility + self.max_delta = datetime.timedelta(seconds=stale_timeout) self.login_status = { 'success': False, 'message': None, diff --git a/aprsd/conf/client.py b/aprsd/conf/client.py index ac0e025..a26a5f2 100644 --- a/aprsd/conf/client.py +++ b/aprsd/conf/client.py @@ -47,6 +47,14 @@ aprs_opts = [ default=14580, help='APRS-IS port', ), + cfg.IntOpt( + 'stale_timeout', + default=120, + help='Seconds without receiving data before connection is considered stale. ' + 'When a connection goes stale, it will be automatically reconnected. ' + 'Lower values detect dead connections faster but may cause unnecessary ' + 'reconnects during brief network hiccups. Default is 120 seconds (2 minutes).', + ), ] kiss_serial_opts = [ diff --git a/tests/client/drivers/test_aprsis_driver.py b/tests/client/drivers/test_aprsis_driver.py index d024d4d..c65ad87 100644 --- a/tests/client/drivers/test_aprsis_driver.py +++ b/tests/client/drivers/test_aprsis_driver.py @@ -24,6 +24,7 @@ class TestAPRSISDriver(unittest.TestCase): self.mock_conf.aprs_network.password = '12345' self.mock_conf.aprs_network.host = 'rotate.aprs.net' self.mock_conf.aprs_network.port = 14580 + self.mock_conf.aprs_network.stale_timeout = 120 # Default 2 minutes # Mock APRS Lib Client self.aprslib_patcher = mock.patch('aprsd.client.drivers.aprsis.APRSLibClient') @@ -71,11 +72,23 @@ class TestAPRSISDriver(unittest.TestCase): def test_init(self): """Test initialization sets default values.""" self.assertIsInstance(self.driver.max_delta, datetime.timedelta) - self.assertEqual(self.driver.max_delta, datetime.timedelta(minutes=2)) + # Default stale_timeout is 120 seconds (2 minutes) + self.assertEqual(self.driver.max_delta, datetime.timedelta(seconds=120)) self.assertFalse(self.driver.login_status['success']) self.assertIsNone(self.driver.login_status['message']) self.assertIsNone(self.driver._client) + def test_init_custom_stale_timeout(self): + """Test initialization with custom stale_timeout.""" + # Set a custom stale_timeout + self.mock_conf.aprs_network.stale_timeout = 60 # 1 minute + + # Create a new driver instance with custom timeout + driver = APRSISDriver.__new__(APRSISDriver) + driver.__init__() + + self.assertEqual(driver.max_delta, datetime.timedelta(seconds=60)) + def test_is_enabled_true(self): """Test is_enabled returns True when APRS-IS is enabled.""" self.mock_conf.aprs_network.enabled = True