aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audiomixer.py6
-rw-r--r--bluetooth.py42
-rw-r--r--test_bluetooth.py50
-rw-r--r--test_gps.py12
4 files changed, 93 insertions, 17 deletions
diff --git a/audiomixer.py b/audiomixer.py
index 3d61c10..e594471 100644
--- a/audiomixer.py
+++ b/audiomixer.py
@@ -28,11 +28,11 @@ class AudioMixerService(AGLBaseService):
async def list_controls(self):
return await self.request('list_controls')
- async def volume(self, value=None):
+ async def volume(self, control='Master', value=None):
if value is not None:
- return await self.request('volume', {'control': 'Master', 'value': value})
+ return await self.request('volume', {'control': control, 'value': value})
else:
- return await self.request('volume', {'control': 'Master'})
+ return await self.request('volume', {'control': control})
async def mute(self, value=None):
return await self.request('mute', {'control': 'Master', 'value': value})
diff --git a/bluetooth.py b/bluetooth.py
index a4bbac3..658d2e7 100644
--- a/bluetooth.py
+++ b/bluetooth.py
@@ -1,14 +1,29 @@
-from aglbaseservice import AGLBaseService
+from aglbaseservice import AGLBaseService, AFBResponse
import asyncio
import os
Verbs = ['subscribe', 'unsubscribe', 'managed_objects', 'adapter_state', 'default_adapter', 'avrcp_controls',
'connect', 'disconnect', 'pair', 'cancel_pairing', 'confirm_pairing', 'remove_device']
AdapterStateParams = ['discovery', 'discoverable', 'powered', ]
+
BTEventType = ['adapter_changes', 'device_changes', 'media', 'agent']
class BluetoothService(AGLBaseService):
+ service = 'agl-service-bluetooth'
+ parser = AGLBaseService.getparser()
+ parser.add_argument('--default_adapter', help='Get default bluetooth adapter', action='store_true')
+ parser.add_argument('--managed_objects', help='Get managed objects', action='store_true')
+ parser.add_argument('--adapter', help='Select remote adapter', required=False, default='hci0')
+ parser.add_argument('--adapter_state')
+ parser.add_argument('--connect', help='Connect to device', metavar='dev_88_0F_10_96_D3_20')
+ parser.add_argument('--disconnect', help='Disconnect from device', metavar='dev_88_0F_10_96_D3_20')
+ parser.add_argument('--pair', help='Pair with a device', metavar='dev_88_0F_10_96_D3_20')
+ parser.add_argument('--cancel_pairing', help='Cancel ongoing pairing')
+ parser.add_argument('--confirm_pairing', metavar='pincode')
+ parser.add_argument('--remove_device', metavar='dev_88_0F_10_96_D3_20', help='Remove paired device')
+
+
def __init__(self, ip, port=None, service='agl-service-bluetooth'):
super().__init__(api='Bluetooth-Manager', ip=ip, port=port, service=service)
@@ -53,13 +68,24 @@ class BluetoothService(AGLBaseService):
pass
async def main(loop):
- addr = os.environ.get('AGL_TGT_IP', 'localhost')
- port = os.environ.get('AGL_TGT_PORT', None)
- BTS = await BluetoothService(ip=addr, service='agl-service-bluetooth', port=port)
- listener = loop.create_task(BTS.listener())
- await BTS.subscribe()
- BTS.logger.debug(await BTS.adapter_state('hci0', {'uuids': ['0000110e-0000-1000-8000-00805f9b34fb']}))
- await listener
+ args = BluetoothService.parser.parse_args()
+ bts = await BluetoothService(ip=args.ipaddr, port=args.port)
+
+ if args.default_adapter:
+ id = await bts.default_adapter()
+ print(f'Requesting default adapter with id {id}')
+ r = AFBResponse(await bts.response())
+ print(r)
+
+ if args.adapter_state:
+ pass
+
+ if args.listener:
+ for response in bts.listener():
+ print(response)
+
+ bts.logger.debug(await bts.adapter_state('hci0', {'uuids': ['0000110e-0000-1000-8000-00805f9b34fb']}))
+
if __name__ == '__main__':
diff --git a/test_bluetooth.py b/test_bluetooth.py
index e69de29..1ccf499 100644
--- a/test_bluetooth.py
+++ b/test_bluetooth.py
@@ -0,0 +1,50 @@
+import asyncio
+import os
+import pytest
+from bluetooth import BluetoothService as BTS
+import logging
+from aglbaseservice import AFBResponse, AFBT
+
+logger = logging.getLogger(f'pytest-{BTS.service}')
+logger.setLevel(logging.DEBUG)
+pytestmark = pytest.mark.asyncio
+
+
+@pytest.fixture(scope="module")
+def event_loop():
+ loop = asyncio.get_event_loop()
+ yield loop
+ loop.close()
+
+
+@pytest.fixture(scope='module')
+async def service():
+ address = os.environ.get('AGL_TGT_IP', 'localhost')
+ port = os.environ.get('AGL_TGT_PORT', None)
+
+ bts = await BTS(ip=address, port=port)
+ yield bts
+ await bts.websocket.close()
+
+
+async def test_default_adapter(event_loop, service: BTS):
+ id = await service.default_adapter()
+ resp = AFBResponse(await service.response())
+ assert resp.status == 'success', resp
+ assert 'adapter' in resp.data.keys()
+ assert resp.data['adapter'] == 'hci0'
+
+
+async def test_managed_objects(event_loop, service: BTS):
+ id = await service.managed_objects()
+ resp = AFBResponse(await service.response())
+ assert resp.status == 'success', str(resp)
+
+
+async def test_has_single_adapter(event_loop, service: BTS):
+ id = await service.managed_objects()
+ resp = AFBResponse(await service.response())
+ assert len(resp.data['adapters']) == 1, \
+ f'Detected {len(resp.data["adapters"])} adapters. Multiple adapters may also break testing'
+
+
diff --git a/test_gps.py b/test_gps.py
index a3b59c7..e1ad15e 100644
--- a/test_gps.py
+++ b/test_gps.py
@@ -1,7 +1,7 @@
import asyncio
import os
import pytest
-from gps import GPSService
+from gps import GPSService as GPS
import logging
from aglbaseservice import AFBResponse, AFBT
@@ -18,7 +18,7 @@ def event_loop():
@pytest.fixture(scope='module')
async def service():
address = os.environ.get('AGL_TGT_IP', 'localhost')
- gpss = await GPSService(ip=address)
+ gpss = await GPS(ip=address)
yield gpss
await gpss.websocket.close()
@@ -28,24 +28,24 @@ async def service():
# yield _response
@pytest.mark.xfail # expecting this to fail because of "No 3D GNSS fix" and GPS is unavailable
-async def test_location(event_loop, service: GPSService):
+async def test_location(event_loop, service: GPS):
id = await service.location()
resp = AFBResponse(await service.response())
assert resp.status == 'success'
-async def test_subscribe_location(event_loop, service: GPSService):
+async def test_subscribe_location(event_loop, service: GPS):
id = await service.subscribe('location')
resp = AFBResponse(await service.response())
assert resp.msgid == id
assert resp.status == 'success'
-async def test_unsubscribe(event_loop, service: GPSService):
+async def test_unsubscribe(event_loop, service: GPS):
id = await service.unsubscribe('location')
resp = AFBResponse(await service.response())
assert resp.msgid == id
assert resp.status == 'success'
-async def test_location_events(event_loop, service: GPSService):
+async def test_location_events(event_loop, service: GPS):
id = await service.subscribe('location')
resp = AFBResponse(await service.response())
assert resp.msgid == id