Add config for different qos

This commit is contained in:
2025-02-12 17:36:11 +01:00
parent 815bf70887
commit e294eeb961
2 changed files with 45 additions and 12 deletions

View File

@@ -3,8 +3,27 @@ from bumble.profiles import bap
from dataclasses import dataclass from dataclasses import dataclass
# Define some base dataclasses to hold the relevant parameters # Define some base dataclasses to hold the relevant parameters
@dataclass
class AuracastQoSConfig:
iso_interval_us: int = 10000
number_of_retransmissions:int = 4
max_transport_latency_ms:int = 43 # TODO: varies from the default value in bumble (was 65)
qos_config_mono_high_rel = AuracastQoSConfig() #highest rel + lowest latency
qos_config_mono_medium_rel = AuracastQoSConfig(
iso_interval_us = 10000,
number_of_retransmissions = 3,
max_transport_latency_ms = 65
)
qos_config_mono_low_rel = AuracastQoSConfig( #highest latency
iso_interval_us = 10000,
number_of_retransmissions = 2,
max_transport_latency_ms = 65
)
@dataclass @dataclass
class AuracastGlobalConfig: class AuracastGlobalConfig:
qos_config: AuracastQoSConfig
device_name: str = 'Auracaster' device_name: str = 'Auracaster'
transport: str = '' transport: str = ''
auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5') auracast_device_address: hci.Address = hci.Address('F0:F1:F2:F3:F4:F5')
@@ -13,7 +32,6 @@ class AuracastGlobalConfig:
frame_duration_us: int = 10000 frame_duration_us: int = 10000
presentation_delay_us: int = 40000 presentation_delay_us: int = 40000
@dataclass @dataclass
class AuracastBigConfig: class AuracastBigConfig:
broadcast_id: int =123456, broadcast_id: int =123456,
@@ -24,7 +42,7 @@ class AuracastBigConfig:
broadcast_program_info: str = 'Some Announcements' broadcast_program_info: str = 'Some Announcements'
broacast_wav_file_path: str = './auracast/announcement_48_10_96000_en.wav' broacast_wav_file_path: str = './auracast/announcement_48_10_96000_en.wav'
global_base_config = AuracastGlobalConfig() global_base_config = AuracastGlobalConfig(qos_config=AuracastQoSConfig())
# Instanciate some example configurations # Instanciate some example configurations
broadcast_de = AuracastBigConfig( broadcast_de = AuracastBigConfig(

View File

@@ -16,7 +16,7 @@
# Imports # Imports
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
from __future__ import annotations from __future__ import annotations
import pprint
import asyncio import asyncio
import contextlib import contextlib
import logging import logging
@@ -43,7 +43,7 @@ from bumble.profiles import bass
import bumble.device import bumble.device
import bumble.transport import bumble.transport
import bumble.utils import bumble.utils
from bumble.device import Host from bumble.device import Host, BIGInfoAdvertisement
import auracast_config import auracast_config
@@ -184,7 +184,7 @@ async def run_broadcast(
) )
], ],
) )
logging.info('Setup Advertising') logger.info('Setup Advertising')
bigs[f'big{i}']['broadcast_audio_announcement'] = bap.BroadcastAudioAnnouncement(conf.broadcast_id) bigs[f'big{i}']['broadcast_audio_announcement'] = bap.BroadcastAudioAnnouncement(conf.broadcast_id)
advertising_set = await device.create_advertising_set( advertising_set = await device.create_advertising_set(
random_address=conf.broadcast_random_address, random_address=conf.broadcast_random_address,
@@ -224,10 +224,10 @@ async def run_broadcast(
bigs[f'big{i}']['advertising_set'] , bigs[f'big{i}']['advertising_set'] ,
parameters=bumble.device.BigParameters( parameters=bumble.device.BigParameters(
num_bis=1, num_bis=1,
sdu_interval=global_config.frame_duration_us, sdu_interval=global_config.qos_config.iso_interval_us,
max_sdu=global_config.octets_per_frame, # is this octets per frame ? max_sdu=global_config.octets_per_frame, # is this octets per frame ?
max_transport_latency=65, max_transport_latency=global_config.qos_config.max_transport_latency_ms,
rtn=4, rtn=global_config.qos_config.number_of_retransmissions,
broadcast_code=( broadcast_code=(
bytes.fromhex(conf.broadcast_code) if conf.broadcast_code else None bytes.fromhex(conf.broadcast_code) if conf.broadcast_code else None
), ),
@@ -243,6 +243,10 @@ async def run_broadcast(
bigs[f'big{i}']['frames_iterator'] = itertools.cycle(frames) bigs[f'big{i}']['frames_iterator'] = itertools.cycle(frames)
logging.debug(f'big{i} parameters are:')
logging.debug('%s', pprint.pformat(vars(big)))
logging.debug(f'Finished setup of big{i}.')
await asyncio.sleep(3) # Wait for advertising to set up await asyncio.sleep(3) # Wait for advertising to set up
LOOP_FINITE_PKGS = -1 # set -1 to loop infinitely LOOP_FINITE_PKGS = -1 # set -1 to loop infinitely
@@ -293,7 +297,10 @@ def broadcast(global_conf: auracast_config.AuracastGlobalConfig, big_conf: List[
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
if __name__ == "__main__": if __name__ == "__main__":
logging.basicConfig(level=logging.INFO) logging.basicConfig(
level=logging.INFO,
format='%(module)s.py:%(lineno)d %(levelname)s: %(message)s'
)
global_conf = auracast_config.global_base_config global_conf = auracast_config.global_base_config
@@ -301,8 +308,11 @@ if __name__ == "__main__":
#global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001050076061-if02,1000000,rtscts' # transport for nrf53dk #global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001050076061-if02,1000000,rtscts' # transport for nrf53dk
global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001057705357-if02,1000000,rtscts' # transport for nrf54l15dk #global_conf.transport='serial:/dev/serial/by-id/usb-SEGGER_J-Link_001057705357-if02,1000000,rtscts' # transport for nrf54l15dk
global_conf.transport='serial:/dev/ttyACM1,115200,rtscts'
global_conf.qos_config = auracast_config.qos_config_mono_high_rel # TODO: low rel, actually advertising seems to work again- maybe then the problem is hci->controler
bigs = [ bigs = [
auracast_config.broadcast_de, auracast_config.broadcast_de,
@@ -315,7 +325,12 @@ if __name__ == "__main__":
global_conf.octets_per_frame = 40 # 32kbps@16kHz global_conf.octets_per_frame = 40 # 32kbps@16kHz
# Note: 24kHz is only working with 2 streams - so this may be a host->controller interface bottleneck # Note: 24kHz is only working with 2 streams - so this may be a host->controller interface bottleneck
# TODO: use thread usage debugger on controller to check actual cpu load # use thread usage debugger on controller to check actual cpu load - not much load
# TODO; I dont think hci is really the bottleneck. probably limited airtime is the problem. Analyze this somehow.
# Advertising is still 1Mbit phy - use 2Mbit
# Check is the sdu interval (iso interval?) may really be varied - does not seem to work really
# # sdu per frame also needs to be adjusted somehow? is this even compatible with lc3?
broadcast( broadcast(
global_conf, global_conf,