You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
3.3 KiB
69 lines
3.3 KiB
# License: Apache 2.0. See LICENSE file in root directory.
|
|
# Copyright(c) 2021 Intel Corporation. All Rights Reserved.
|
|
|
|
|
|
import time
|
|
from rspy import log, test
|
|
from rspy.timer import Timer
|
|
|
|
'''
|
|
This class is used to wait and verify for a requested playback status arrived within a requested timeout.
|
|
It blocks the calling thread and samples the playback status using a playback status callback from LRS API
|
|
|
|
Usage should look like this:
|
|
psv = PlaybackStatusVerifier( device );
|
|
...Start Streaming...
|
|
psv.wait_for_status( timeout=5, required_status=rs.playback_status.playing, sample_interval=0.05 )
|
|
|
|
'''
|
|
class PlaybackStatusVerifier:
|
|
|
|
def __init__( self, dev ):
|
|
self._current_status = None
|
|
self._status_changes_cnt = 0
|
|
playback_dev = dev.as_playback()
|
|
'''
|
|
Note: LRS set_status_changed_callback function is a 'register' and not a 'set' function
|
|
meaning multiple set called will add a callback to the callback list
|
|
'''
|
|
playback_dev.set_status_changed_callback( self.__signal_on_status_change )
|
|
|
|
def __signal_on_status_change( self, playback_status ):
|
|
log.d('playback status callback invoked with', playback_status)
|
|
self._status_changes_cnt += 1
|
|
self._current_status = playback_status
|
|
|
|
'''
|
|
This function goal is to catch the first time the playback status match the required status,
|
|
We sample the status at a user-defined interval low enough for not missing the event and compare the status to the required one.
|
|
|
|
Note: Limitation - This function is build to catch statues change at 'sample_interval' time,
|
|
If the required status can arrive and change within this sample_interval, this function can miss it.
|
|
The user needs to make sure that the 'sample_interval' is lower than the possible time for this status to arrive and be overridden by a new status.
|
|
'''
|
|
def wait_for_status( self, timeout, required_status, sample_interval=0.01 ):
|
|
self._status_changes_cnt = 0
|
|
status_changes_cnt = self._status_changes_cnt
|
|
self._current_status = None
|
|
required_status_detected = False
|
|
wait_for_event_timer = Timer(timeout)
|
|
wait_for_event_timer.start()
|
|
log.d('timeout set to', timeout, '[sec]')
|
|
while not wait_for_event_timer.has_expired():
|
|
if required_status == self._current_status:
|
|
log.d('Required status "' + str(required_status) + '" detected!')
|
|
required_status_detected = True
|
|
break
|
|
time.sleep( sample_interval )
|
|
|
|
test.check(required_status_detected, description='Check failed, Timeout on waiting for ' + str(required_status) )
|
|
|
|
'''If the status changes too fast let say , Stopped -> Playing --> Stopped within 1 sample time we can miss
|
|
it. So if we already failed on the status we add a check to indicate it in the test result that our sample
|
|
interval may be too long and we may have missed the required status '''
|
|
if not required_status_detected:
|
|
test.check( status_changes_cnt + 1 < self._status_changes_cnt,
|
|
'Multiple status changes detected, expecting a single change, got '+ str( self._status_changes_cnt - status_changes_cnt ) +
|
|
' changes, consider lowering the sample interval' )
|
|
|