aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThéo de la Hogue2022-05-11 18:52:52 +0200
committerThéo de la Hogue2022-05-11 18:52:52 +0200
commit3176cb6fb4ac47a5bccd2aa2f1b8eab3a5594853 (patch)
tree0f9cd9a7127eae270e18dd3270cb3a9106a284f7
parent181a30b812296ac0dc5738ee5222104f9dc97065 (diff)
downloadargaze-3176cb6fb4ac47a5bccd2aa2f1b8eab3a5594853.zip
argaze-3176cb6fb4ac47a5bccd2aa2f1b8eab3a5594853.tar.gz
argaze-3176cb6fb4ac47a5bccd2aa2f1b8eab3a5594853.tar.bz2
argaze-3176cb6fb4ac47a5bccd2aa2f1b8eab3a5594853.tar.xz
Working on record and replay events and variables.
-rw-r--r--src/argaze/utils/record_tobii_session.py53
-rw-r--r--src/argaze/utils/replay_tobii_session.py39
2 files changed, 62 insertions, 30 deletions
diff --git a/src/argaze/utils/record_tobii_session.py b/src/argaze/utils/record_tobii_session.py
index 070563f..a45727b 100644
--- a/src/argaze/utils/record_tobii_session.py
+++ b/src/argaze/utils/record_tobii_session.py
@@ -1,10 +1,12 @@
#!/usr/bin/env python
import argparse
+import threading
import time
import random
from argaze.TobiiGlassesPro2 import TobiiController
+from argaze.utils import MiscFeatures
def main():
"""
@@ -29,42 +31,47 @@ def main():
# Start recording
tobii_controller.start_recording(recording_id)
+ print('Recording started')
- # Waiting until keyboard interruption
- try:
+ # Define loop
+ last_battery_level = 0
+ time_count = 0
- last_battery_level = 0
- time_count = 0
- while True:
+ exit = MiscFeatures.ExitSignalHandler()
+ print('Waiting for Ctrl+C to quit...\n')
- # Print storage info each minutes
- if time_count % 60 == 0:
+ while not exit.status():
- print(tobii_controller.get_storage_info())
+ # Print storage info each minutes
+ if time_count % 60 == 0:
- # print battery level each time it changes
- battery_level = tobii_controller.get_battery_level()
- if battery_level != last_battery_level:
+ print(tobii_controller.get_storage_info())
- print(tobii_controller.get_battery_info())
- last_battery_level = battery_level
+ # print battery level each time it changes
+ # send it as experimental variable
+ battery_level = tobii_controller.get_battery_level()
+ if battery_level != last_battery_level:
- # send random event each 3 - 10 seconds
- if time_count % random.randint(3, 10) == 0:
+ print(tobii_controller.get_battery_info())
- print('Send event')
- tobii_controller.send_custom_event('TestEvent', time_count)
+ tobii_controller.send_variable('battery', battery_level)
- # Sleep 1 second
- time.sleep(1)
- time_count += 1
+ last_battery_level = battery_level
- # exit on keyboard interruption
- except KeyboardInterrupt:
- pass
+ # send random event each 3 - 10 seconds
+ if time_count % random.randint(3, 10) == 0:
+
+ print('Send random event')
+
+ tobii_controller.send_event('random')
+
+ # Sleep 1 second
+ time.sleep(1)
+ time_count += 1
# Stop recording
tobii_controller.stop_recording(recording_id)
+ print('Recording stopped')
if __name__ == '__main__':
diff --git a/src/argaze/utils/replay_tobii_session.py b/src/argaze/utils/replay_tobii_session.py
index 52c2b24..4fb9f2b 100644
--- a/src/argaze/utils/replay_tobii_session.py
+++ b/src/argaze/utils/replay_tobii_session.py
@@ -19,6 +19,7 @@ def main():
parser = argparse.ArgumentParser(description=main.__doc__.split('-')[0])
parser.add_argument('-s', '--segment_path', metavar='SEGMENT_PATH', type=str, default=None, help='segment path')
parser.add_argument('-r', '--time_range', metavar=('START_TIME', 'END_TIME'), nargs=2, type=float, default=(0., None), help='start and end time (in second)')
+ parser.add_argument('-w', '--window', metavar='DISPLAY', type=bool, default=True, help='enable window display', action=argparse.BooleanOptionalAction)
args = parser.parse_args()
if args.segment_path != None:
@@ -45,15 +46,24 @@ def main():
tobii_ts_pupil_diameter = tobii_segment_data.gidx_pd_eye
print(f'{len(tobii_ts_pupil_diameter)} pupil diameters loaded')
+ # Access to timestamped events data buffer
+ tobii_ts_events = tobii_segment_data.ets_type_tag
+ print(f'{len(tobii_ts_events)} events loaded')
+
# Video and data replay loop
try:
# Initialise progress bar
- MiscFeatures.printProgressBar(0, tobii_segment_video.get_duration(), prefix = 'Video progression:', suffix = 'Complete', length = 100)
+ MiscFeatures.printProgressBar(0, tobii_segment_video.get_duration()/1000, prefix = 'Video progression:', suffix = 'Complete', length = 100)
# Iterate on video frames
for video_ts, video_frame in tobii_segment_video.frames():
+ video_ts_ms = video_ts / 1000
+
+ # Write segment timing
+ cv.putText(video_frame.matrix, f'Segment time: {int(video_ts_ms)} ms', (20, 40), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv.LINE_AA)
+
try:
# Get closest gaze position before video timestamp and remove all gaze positions before
@@ -71,16 +81,31 @@ def main():
# Wait for gaze position
except ValueError:
continue
+
+ try:
+
+ # Get closest event before video timestamp and remove all gaze positions before
+ closest_event_ts, closest_event = tobii_ts_events.pop_first_until(video_ts)
+
+ print(closest_event_ts/1000, closest_event)
+
+ # Write events
+ cv.putText(video_frame.matrix, str(closest_event), (20, 140), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv.LINE_AA)
+
+ except ValueError:
+ pass
+
+ if args.window:
- # Close window using 'Esc' key
- if cv.waitKey(1) == 27:
- break
+ # Close window using 'Esc' key
+ if cv.waitKey(1) == 27:
+ break
- cv.imshow(f'Segment {tobii_segment.get_id()} video', video_frame.matrix)
+ cv.imshow(f'Segment {tobii_segment.get_id()} video', video_frame.matrix)
# Update Progress Bar
- progress = video_ts - int(args.time_range[0] * 1000000)
- MiscFeatures.printProgressBar(progress, tobii_segment_video.get_duration(), prefix = 'Video progression:', suffix = 'Complete', length = 100)
+ progress = video_ts_ms - int(args.time_range[0] * 1000)
+ MiscFeatures.printProgressBar(progress, tobii_segment_video.get_duration()/1000, prefix = 'Video progression:', suffix = 'Complete', length = 100)
# Exit on 'ctrl+C' interruption
except KeyboardInterrupt: