/ core / attention / __pycache__ / multi_monitor.cpython-314.pyc
multi_monitor.cpython-314.pyc
  1  +
  2  ՚hip6�	�p�Rt^RIHtHt^RIHtHt^RIHtHtH	t	H
  3  t
  4  ^RIHt^RI
t
^RIt^RIHt]!RR44t]!R	R
  5  44t!RR4t!R
R4t]!RR44t!RR4t]R8Xd�]!R4]!]!RRRR74tRRlt]P7]4]!R4.R$Ot]Fewtttt ]PC]]]4t"]PG4t$]!] R
R]$PJR
R]$PLR 
R!24]PN!R"4Kg	]!R#4R#R#)%uJ
  6  Multi-Monitor Attention Detection
  7  
  8  Detects which screen the operator is attending to by combining:
  9  1. Tobii gaze validity (valid = main monitor, invalid = looking away)
 10  2. Gaze edge detection (coordinates at screen edges suggest looking past)
 11  3. (Future) Head pose from MacBook camera
 12  
 13  Screen Layout:
 14      [MacBook]  [Main Monitor]  [iPad]
 15         LEFT       CENTER        RIGHT
 16  
 17  When Tobii gaze is invalid or at left edge → likely looking at MacBook
 18  When Tobii gaze is valid in center → looking at main monitor
 19  When Tobii gaze is invalid or at right edge → likely looking at iPad
 20  )�	dataclass�field)�datetime�	timedelta)�Optional�Callable�List�Dict)�EnumN)�AttentionScreenc�Ha�]tRt^toRtRtRtRtRtRt	Rt
 21  V3RltR	tVt
R
 22  #)�ScreenConfigz&Configuration for multi-monitor setup.�MacBook�Main Monitor�iPad皙�����?�ffffff�?i,c�b<�V^8�dQh/S[;R&S[;R&S[;R&S[;R&S[;R&S[;R&#)��	left_name�center_name�
 23  right_name�	left_edge�
 24  right_edge�switch_delay_ms)�str�float)�format�
__classdict__s"��?/Users/rcerf/repos/Sovereign_OS/core/attention/multi_monitor.py�__annotate__�ScreenConfig.__annotate__sS��������%�	�
 25  ���������� ���N)�__name__�
 26  __module__�__qualname__�__firstlineno__�__doc__rrrrrr�__annotate_func__�__static_attributes__�__classdictcell__�rs@rr
r
s1����0��I�%�K��J��I��J�!�O��r"r
c�8a�]tRt^,toRtRtRtV3RltRtVt	R#)�AttentionStatez&Current multi-monitor attention state.Nc�<�V^8�dQh/S[;R&S[;R&S[;R&S[;R&S[;R&S[S[,;R&S[S[,;R&#)r�screen�screen_name�
 27  confidence�since�
 28  gaze_valid�last_gaze_x�last_gaze_y)rrrr�boolr)rrs"�rr �AttentionState.__annotate__,sg����
�����	�
 29  ����O�
�����%��'���%��'�r"r#)
 30  r$r%r&r'r(r5r6r)r*r+r,s@rr.r.,s����0�$(�K�#'�K��r"r.c�a�]tRt^8toRtRV3RlRlltRV3RlRlltV3RlRltV3R	lR
 31  ltV3RlRlt	V3R
lRlt
 32  V3RlRltRtVt
R#)�MultiMonitorTrackera�
 33  Tracks attention across multiple monitors.
 34  
 35  Uses gaze validity and edge detection to infer which
 36  screen the operator is looking at.
 37  
 38  Usage:
 39      tracker = MultiMonitorTracker()
 40  
 41      # Feed gaze data
 42      tracker.update_gaze(x=0.5, y=0.5, valid=True)
 43  
 44      # Get current screen
 45      state = tracker.get_state()
 46      print(f"Looking at: {state.screen_name}")
 47  
 48      # Register callback for screen changes
 49      tracker.on_screen_change(lambda old, new: print(f"{old} -> {new}"))
 50  Nc� <�V^8�dQhRS[/#�r�config�r
)rrs"�rr � MultiMonitorTracker.__annotate__Ms���&�&�|�&r"c��T;'g\4Vn\PVn\
 51  P!4VnRVnRVn	RVn
 52  RVnRVn.Vn
\P!4VnR#)TN)r
r=r�CENTER�_current_screenr�now�
_screen_since�_gaze_valid�_last_x�_last_y�_edge_start�_edge_direction�
 53  _on_change�	threading�Lock�_lock)�selfr=s&&r�__init__�MultiMonitorTracker.__init__Msp���.�.�����.�5�5���%�\�\�^������(,���(,���04���:>���SU����^�^�%��
 54  r"c
�n<�V^8�dQhRS[S[,RS[S[,RS[RS[RS[RS[S[,/#)r�x�y�valid�
 55  left_valid�right_valid�return�rrr7r)rrs"�rr r?_sT���6�6��E�?�6��E�?�6��	6�
 56  �6��
6�
 57  �/�	"�6r"c�8�VP;_uu_4T;'d
T;'gTVnWnW nVP	WV4p\
 58  P!4pW`P8wd�VPV8wdWpn	W`nM�VP'd�WpP,
 59  P4R,pW�PP8�dcVP4p	W`nWpnVP4p
 60  VPFpV!W�4K	RVn	RVnVuuRRR4#MRVn	RVnRRR4R# \ dp\#RT24Rp?KcRp?ii;i +'giR#;i)zS
 61  Update with new gaze data.
 62  
 63  Returns the new screen if it changed, None otherwise.
 64  ��z[MultiMonitor] Callback error: N)rMrErFrG�
_infer_screenrrCrBrIrH�
total_secondsr=r�_make_staterDrJ�	Exception�print)
rNrRrSrTrUrV�intendedrC�
 65  elapsed_ms�	old_state�	new_state�callback�es
&&&&&&       r�update_gaze�MultiMonitorTracker.update_gaze_sa���Z�Z�Z�$�D�D�*�*C�*C��D���L��L��)�)�!��6�H��,�,�.�C��/�/�/��'�'�8�3�'*�$�+3�(��%�%�%�"%�(8�(8�"8�!G�!G�!I�D�!P�J�!�[�[�%@�%@�@�$(�$4�$4�$6�	�/7�,�-0�*�$(�$4�$4�$6�	�)-���H�M� (�� >�)8�,0��(�/3��,�'�G�Z��L$(�� �'+��$��S�Z��<$-�M� %�(G��s�&K� L� L��M��=�Z�Z�sH�F�A:F�$A<F�!E!�)F�F�!F	�,F	�:F�F	�F�F	c�R<�V^8�dQhRS[S[,RS[S[,RS[RS[/#�rrRrSrTrWrX)rrs"�rr r?�s;���*�*��E�?�*��E�?�*��	*�
 66  
 67  �*r"c��V'dVfaVPeCVPR8d\P#VPR8�d\P#\P#WP
 68  P8d\P#WP
 69  P8�d\P#\P#)z&Infer which screen based on gaze data.�333333�?�ffffff�?)	rFr�LEFT�RIGHT�UNKNOWNr=rrrA�rNrRrSrTs&&&&rr[�!MultiMonitorTracker._infer_screen�s�����	��|�|�'��<�<�#�%�*�/�/�/��\�\�C�'�*�0�0�0�"�*�*�*�
�{�{�$�$�$�"�'�'�'�
���'�'�
'�"�(�(�(�"�)�)�)r"c� <�V^8�dQhRS[/#�rrW�r.)rrs"�rr r?�s���
 70  �
 71  �^�
 72  r"c
 73  �>�VPp\PVPP\P
 74  VPP\PVPP\PR/pVP'dV\P
 75  8XdRpMVP'gRpMRp\VVPWP4VVPVPVPVP R7#)zCreate current attention state.�Unknowng�?g333333�?g�������?)r0r1r2r3r4r5r6)rBrrmr=rrArrnrrorEr.�get�valuerDrFrG)rNr0�namesr2s&   rr]�MultiMonitorTracker._make_state�s����%�%��� � �$�+�+�"7�"7��"�"�D�K�K�$;�$;��!�!�4�;�;�#9�#9��#�#�Y�	
 76  �������/�*@�*@� @��J��!�!�!��J��J����	�	�&�,�,�7�!��$�$��'�'�������
 77  �	
 78  r"c� <�V^8�dQhRS[/#rsrt)rrs"�rr r?�s���&�&�>�&r"c��VP;_uu_4VP4uuRRR4# +'giR#;i)zGet current attention state.N)rMr]�rNs&r�	get_state�MultiMonitorTracker.get_state�s#��
�Z�Z�Z��#�#�%��Z�Z�Z�s	�0�A	c�:<�V^8�dQhRS[S[S[.R3,/#�rrdN)rr.)rrs"�rr r?�s$���)�)��N�N�;�T�A�B�)r"c�<�VPPV4R#�z%Register callback for screen changes.N�rJ�append�rNrds&&r�on_screen_change�$MultiMonitorTracker.on_screen_change�s��
 79  	
�����x�(r"c�6<�V^8�dQhRS[S[S[3,/#rs��tuplerr)rrs"�rr r?�s���/�/�E�/�3�"6�7�/r"c�R�VP4pVPVP3#)z Get current screen (enum, name).)r~r0r1)rN�states& r�
 80  get_screen�MultiMonitorTracker.get_screen�s#����� ���|�|�U�.�.�.�.r")
 81  rBrIrHrErFrGrMrJrDr=�N)TT)r$r%r&r'r(rOrfr[r]r~r�r�r*r+r,s@rr:r:8sQ�����(&�&�$6�6�p*�*�6
 82  �
 83  �8&�&�
 84  )�)�/�/r"r:c�da�]tRt^�toRtRV3RlRlltRtRtRtV3RlR	lt	R
 85  t
 86  RtVtR#)
�IntegratedAttentionTrackerzx
 87  Integrates Tobii gaze tracking with multi-monitor detection.
 88  
 89  Wraps TalonIntegration and adds multi-monitor awareness.
 90  Nc� <�V^8�dQhRS[/#r<r>)rrs"�rr �'IntegratedAttentionTracker.__annotate__�s���0�0�l�0r"c�|�Wn\V4VnVPPVP4R#r�)�talonr:�
multi_monitor�
on_gaze_point�_on_gaze)rN�
talon_trackerr=s&&&rrO�#IntegratedAttentionTracker.__init__�s,��"�
 91  �0��8���	
�
 92 93  � � ����/r"c���VPPVPVPVP;'g
VP
 94  VPVP
 95  R7R#)z+Forward gaze data to multi-monitor tracker.)rRrSrTrUrVN)r�rfrRrSrUrV)rN�points&&rr��#IntegratedAttentionTracker._on_gaze�sR�����&�&��g�g��g�g��"�"�7�7�e�&7�&7��'�'��)�)�	'�	
 96  r"c�:�VPP4R#)zStart tracking.N)r��startr}s&rr�� IntegratedAttentionTracker.start�s���
 97 98  ���r"c�:�VPP4R#)zStop tracking.N)r��stopr}s&rr��IntegratedAttentionTracker.stop�s���
 99100  ���r"c� <�V^8�dQhRS[/#rsrt)rrs"�rr r�s���.�.�^�.r"c�6�VPP4#)z*Get full attention state including screen.)r�r~r}s&r�get_attention_state�.IntegratedAttentionTracker.get_attention_states���!�!�+�+�-�-r"c�<�VPPV4R#r�)r�r�r�s&&rr��+IntegratedAttentionTracker.on_screen_changes�����+�+�H�5r")r�r�r�)
r$r%r&r'r(rOr�r�r�r�r�r*r+r,s@rr�r��s7�����0�0�
101  ���.�.�6�6r"r�c�^a�]tRtRtoRtRtRt]!]PR7t
102  V3RltRtVt
R#)�ScreenAttentioni	zAttention on a specific screen.N)�default_factoryc�<�V^8�dQh/S[;R&S[;R&S[;R&S[S[,;R&S[S[,;R&S[;R&#)rr0r1r2�gaze_x�gaze_yr3)rrrrr)rrs"�rr �ScreenAttention.__annotate__	s[����
�����	�
103  ���
�U�O�"�
�
�U�O�"���9�r"r#)r$r%r&r'r(r�r�rrrCr3r)r*r+r,s@rr�r�	s)����)�#�F�"�F��H�L�L�9�E��r"r�c�a�]tRtRtoRtRV3RlRlltV3RlRltV3RlR	ltV3R
104  lRltV3RlR
lt	Rt
105  VtR#)�MultiMonitorDetectoriz�
106  Simplified multi-monitor detector for use with orchestrator.
107  
108  Just processes gaze points and determines which screen
109  the operator is looking at.
110  Nc�H<�V^8�dQhRS[S[S[3,RS[RS[RS[/#)r�screen_namesrrr)r	rrr)rrs"�rr �!MultiMonitorDetector.__annotate__sC���K�K��?�C�/�0�K��K��	K�
111  �Kr"c�*�T;'g3\PR\PR\PR/VnW nW0nW@n\PVnRVn	RVn
112  RVnRVnRVn
.VnR#)rrrNT)rrmrArnr�rrr�_current�_pending�_pending_startrFrGrErJ)rNr�rrrs&&&&&rrO�MultiMonitorDetector.__init__s���)�
113  �
114  �� � �)��"�"�N��!�!�6�-
115  ���
116  #��$��.��'�.�.��
�37��
�26���(,���(,������HJ��r"c�0<�V^8�dQhRS[S[,/#rs)rr)rrs"�rr r�5s���1�1��/�)B�1r"c��VPpVPpVP;'g
VPpW@nW nW0nVPW#V4pWPP8XdRVn	RVn
117  R#\P!4pVPV8wdWPn	W`n
118  R#VP'd�W`P,
119  P4R,pWpP8�ddVPpWPnRVn	RVn
120  VPP!WUP"4p	VP$Fp
121  V
122  !WY4K	V#R# \&dp\)RT24Rp?K3Rp?ii;i)zW
123  Update with a gaze point.
124  
125  Compatible with TalonIntegration's on_gaze_point callback.
126  NrZz'[MultiMonitorDetector] Callback error: )rRrSrUrVrErFrGr[r�r�r�rrCr\rr�rwrxrJr^r_)rN�
127  gaze_pointrRrSrTr`rCra�old�namerdres&&          rrf� MultiMonitorDetector.update_gaze5sR��
�L�L���L�L���%�%�?�?��)?�)?�� �������%�%�a�E�2���}�}�$� �D�M�"&�D����l�l�n���=�=�H�$�$�M�"%�������� 3� 3�3�B�B�D�t�K�J��1�1�1��m�m�� (�
� $��
�&*��#��(�(�,�,�X�~�~�F�� $���H�M� ��0�!0� ����%�M�� G��s�K�L�L��M�s�E�F�*E>�>Fc�R<�V^8�dQhRS[S[,RS[S[,RS[RS[/#rirX)rrs"�rr r�hs;���&�&��E�?�&��E�?�&��	&�
128  
129  �&r"c��V'dVfkVPe"VPR8d\P#VPe"VPR8�d\P#VP#WP
130  8d\P#WP8�d\P#\P#)zInfer screen from gaze data.rkrl)rFrrmrnr�rrrArps&&&&rr[�"MultiMonitorDetector._infer_screenhs�����	��|�|�'�D�L�L�3�,>�&�+�+�+����)�d�l�l�S�.@�&�,�,�,��=�=� ��~�~��"�'�'�'�
���
 �"�(�(�(��%�%�%r"c�6<�V^8�dQhRS[S[S[3,/#rsr�)rrs"�rr r�}s���#�#�U�?�C�#7�8�#r"c��VPPVPVPP4pVPV3#)zGet current screen and name.)r�rwr�rx)rNr�s& r�get_current� MultiMonitorDetector.get_current}s7��� � �$�$�T�]�]�D�M�M�4G�4G�H���}�}�d�"�"r"c�:<�V^8�dQhRS[S[S[.R3,/#r�)rrr)rrs"�rr r��s#���)�)��?�C�2H�$�2N�)O�)r"c�<�VPPV4R#r�r�r�s&&rr��%MultiMonitorDetector.on_screen_change�s�������x�(r")r�rErFrGrJr�r�rrr�r)Nrr��)r$r%r&r'r(rOrfr[r�r�r*r+r,s@rr�r�s?�����K�K�21�1�f&�&�*#�#�
131  )�)r"r��__main__z(=== Multi-Monitor Attention Tracker ===
132  zMacBook ProzStudio DisplayziPad Pro)rrrc�0�V^8�dQhR\R\/#)rr��newrt)rs"rr r �s��U�U�~�U�N�Ur"c�R�\RVPRVPR24R#)z
133  *** SCREEN CHANGE: � → z ***
134  N)r_r1)r�r�s&&r�	on_changer��s$��
�%�c�o�o�%6�e�C�O�O�;L�F�S�Tr"zSimulating gaze sequence...�40r��15z (conf=z.1f�)g333333�?z
135  Done.))��?r�TzCenter of main monitor)r�r�TzStill center)g�������?r�TzMoving left)�{�G�z�?r�TzAt left edge)r�r�TzStill at left edge)NNFzGaze lost (looking at MacBook))NNFz
136  Still lost)r�r�TzBack to center)g�������?r�TzMoving right)g\���(\�?r�Tz
At right edge)NNFzGaze lost (looking at iPad))(r(�dataclassesrrrr�typingrrrr	�enumr
137  rK�time�	head_poserr
r.r:r�r�r�r$r_�trackerr�r��	sequencesrRrSrT�descrf�resultr~r�r1r2�sleepr#r"r�<module>r�sp���")�(�1�1����'��!�!��!��(�(��(�e/�e/�P&6�&6�R�:�:��:�p)�p)�f�z��	�
138  5�6�"�,��$��#��G�U����Y�'�
139140  '�(��I�'���1�e�T��$�$�Q��5�1���!�!�#��
��b�	��u�0�0��4�G�E�<L�<L�S�;Q�QR�S�T��
141142  �4��	'�
143  �)��Kr"