Add web toggle for Bluetooth discoverable window

The board stays hidden by default, so new phones could only pair via an
SSH session. Add 'radxa-audio discoverable on|off' backed by a transient
radxa-bt-pairing unit that auto-approves and trusts devices pairing in
the window, expires on its own, and expose it in the web mixer with a
countdown.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jsahn
2026-10-12 20:20:06 +09:00
co-authored by Claude Opus 5.5
parent 7ac8cd1dbb
commit 655fbc1d29
8 changed files with 150 additions and 9 deletions
+17
View File
@@ -50,6 +50,23 @@ class InputTests(unittest.TestCase):
class WebTests(unittest.TestCase):
def test_discoverable_toggle_is_allowlisted(self):
self.assertEqual(w.validate_action({'action':'discoverable','on':True,'seconds':300}),
['discoverable','on','--seconds','300'])
self.assertEqual(w.validate_action({'action':'discoverable','on':False}),['discoverable','off'])
for data in [{'action':'discoverable','on':True,'seconds':3600},{'action':'discoverable','on':True,'seconds':'300'},
{'action':'discoverable','on':'yes','seconds':300},{'action':'discoverable','on':True,'seconds':True}]:
with self.subTest(data=data), self.assertRaises(ValueError): w.validate_action(data)
def test_pairing_state_reports_remaining_only_when_discoverable(self):
adapter={'/org/bluez/hci0':{'org.bluez.Adapter1':{'Discoverable':True,'Alias':'Radxa Audio Bluetooth'}}}
with patch.object(a,'objects',return_value=adapter), patch.object(a,'PAIRING_UNTIL') as until, \
patch.object(a.time,'time',return_value=1000.0):
until.read_text.return_value='1120.0'
self.assertEqual(a.pairing(),{'discoverable':True,'remaining':120,'alias':'Radxa Audio Bluetooth'})
adapter['/org/bluez/hci0']['org.bluez.Adapter1']['Discoverable']=False
self.assertEqual(a.pairing()['remaining'],0)
def test_dac_selection_is_one_atomic_cli_command(self):
self.assertEqual(w.validate_action({'action':'output','mode':'dac','pcm':'hw:CARD=Audio,DEV=0'}),
['output','dac','--pcm','hw:CARD=Audio,DEV=0'])