§
    `.¯j‚"  ã                  óà   — d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZ ddlZ G d„ de¦  «        Ze G d„ d	¦  «        ¦   «         Ze G d
„ d¦  «        ¦   «         Z G d„ d¦  «        ZdS )u  AutoPOE2 - Closed-Loop Motion Feedback Sentinel (SSoT Doc 69 / Doc 72).
=============================================================================
Cáº£m biáº¿n pháº£n há»“i chuyá»ƒn Ä‘á»™ng vÃ²ng láº·p kÃ­n (Dual-Tier Motion Feedback):
- Kháº¯c phá»¥c triá»‡t Ä‘á»ƒ hiá»‡n tÆ°á»£ng "tÆ°á»Ÿng lÃ  Ä‘ang cháº¡y nhÆ°ng thá»±c táº¿ Ä‘á»©ng yÃªn" (Ghost Moving).
- Káº¿t há»£p 2 cÆ¡ cháº¿ kiá»ƒm chá»©ng Ä‘á»™c láº­p:
  1. Tier 1 (RAM Velocity Interlock - 0ms): Ä�o vi sai Delta XYZ trÆ°á»›c vÃ  sau khi gá»­i phÃ­m WASD.
  2. Tier 2 (Optical Frame Differencing): Ä�o vi sai Ä‘iá»ƒm áº£nh / template shift khi RAM máº¥t tÃ­n hiá»‡u.
- NgÄƒn cháº·n triá»‡t Ä‘á»ƒ Coordinator thá»­ láº¡i mÃ¹ quÃ¡ng 5 láº§n (30-60s) vÃ  nÃ©m cáº£nh bÃ¡o sá»›m.
- TuÃ¢n thá»§ nghiÃªm ngáº·t:
  - Rule 4: Module hÃ³a tá»‘i Ä‘a, tráº§n file < 400 dÃ²ng.
  - Rule 5: 100% dá»¯ liá»‡u thá»±c nghiá»‡m, tÃ­nh toÃ¡n vi sai toÃ¡n há»�c chuáº©n xÃ¡c.
  - Báº¥t biáº¿n INV-MOTION-IMMOBILE: PhÃ¡t hiá»‡n chÃ´n chÃ¢n sau 2-3 nhá»‹p Ä‘á»ƒ fail-fast an toÃ n.
é    )ÚannotationsN)Ú	dataclass)ÚAnyÚCallableÚOptionalÚTupleÚUnionc                  ó   — e Zd ZdZdS )ÚImmobileCharacterErroruZ   Ngoáº¡i lá»‡ phÃ¡t sinh khi nhÃ¢n váº­t bá»‹ chÃ´n chÃ¢n / liá»‡t di chuyá»ƒn hoÃ n toÃ n.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úNC:\Projects\AutoPOE2\src\assistant_tool\navigation\motion_feedback_sentinel.pyr   r      s   € € € € € ØdÐdØ€Dr   r   c                  ó:   — e Zd ZU dZded<   dZded<   dZded<   dS )	ÚMotionSampleuI   Máº«u Ä‘o lÆ°á»�ng tráº¡ng thÃ¡i chuyá»ƒn Ä‘á»™ng táº¡i thá»�i Ä‘iá»ƒm t.ÚfloatÚ	timestampNú$Optional[Tuple[float, float, float]]Úpos_xyzúOptional[np.ndarray]Ú
frame_crop)r   r   r   r   Ú__annotations__r   r   r   r   r   r   r      sF   € € € € € € àSÐSØÐÐÑØ48€GÐ8Ð8Ð8Ñ8Ø'+€JÐ+Ð+Ð+Ñ+Ð+Ð+r   r   c                  ód   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   dS )ÚMotionResultuV   Káº¿t quáº£ phÃ¢n tÃ­ch vi sai chuyá»ƒn Ä‘á»™ng sau má»™t nhá»‹p Ä‘iá»�u khiá»ƒn WASD.r   Ú	dwell_secÚ	delta_xyzÚvelocity_xyzÚdelta_optical_pxÚboolÚ	is_movingÚ
is_stalledÚintÚstall_countÚstrÚdiagnostic_messageN)r   r   r   r   r   r   r   r   r   r   &   su   € € € € € € à`Ð`ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ€O€O�OØÐÐÑØÐÐÑØÐÐÑÐÐr   r   c                  ól   — e Zd ZdZ	 	 	 	 	 d"d#d„Zed$d„¦   «         Zd%d„Z	 	 d&d'd„Z	 	 	 d(d)d„Z	d*d!„Z
dS )+ÚMotionFeedbackSentinelu\   Cáº£m biáº¿n giÃ¡m sÃ¡t chuyá»ƒn Ä‘á»™ng thá»�i gian thá»±c cho Hideout & Combat Navigation.ç      ð?ç      @é   NÚmin_move_threshold_ur   Úmin_optical_shift_pxÚmax_consecutive_stallsr%   Úexpected_min_velocity_u_sÚlog_callbackúOptional[Callable[[str], None]]ÚreturnÚNonec                ón   — || _         || _        || _        || _        |pd„ | _        d| _        d | _        d S )Nc                ó   — d S ©Nr   )Úmsgs    r   ú<lambda>z1MotionFeedbackSentinel.__init__.<locals>.<lambda>B   s   € ¸€ r   r   )r.   r/   r0   r1   r2   Ú_consecutive_stallsÚ_current_sample)Úselfr.   r/   r0   r1   r2   s         r   Ú__init__zMotionFeedbackSentinel.__init__6   sK   € ð %9ˆÔ!Ø$8ˆÔ!Ø&<ˆÔ#Ø)BˆÔ&Ø(Ð>Ð-=Ð-=ˆÔà()ˆÔ Ø7;ˆÔÐÐr   c                ó   — | j         S r8   )r;   ©r=   s    r   Úconsecutive_stallsz)MotionFeedbackSentinel.consecutive_stallsG   s   € àÔ'Ð'r   c                ó"   — d| _         d| _        dS )u0   Ä�áº·t láº¡i bá»™ Ä‘áº¿m káº¹t chuyá»ƒn Ä‘á»™ng.r   N)r;   r<   r@   s    r   ÚresetzMotionFeedbackSentinel.resetK   s   € à#$ˆÔ Ø#ˆÔÐÐr   r   r   r   r   r   c                ó`   — t          t          j        ¦   «         ||¬¦  «        | _        | j        S )uC   Láº¥y máº«u tráº¡ng thÃ¡i ngay TRÆ¯á»šC KHI gá»­i tÃ­n hiá»‡u WASD.)r   r   r   )r   ÚtimeÚperf_counterr<   )r=   r   r   s      r   Úsample_pre_movez&MotionFeedbackSentinel.sample_pre_moveP   s8   € õ  ,ÝÔ'Ñ)Ô)ØØ!ð 
ñ  
ô  
ˆÔð
 Ô#Ð#r   TÚenforce_invariantr"   r   c           
     óv  — | j         €t          d¦  «        ‚t          j        ¦   «         }t	          d|| j         j        z
  ¦  «        }d}d}| j         j        ��|�Ž| j         j        }|}	|	d         |d         z
  }
|	d         |d         z
  }t          |	¦  «        dk    r$t          |¦  «        dk    r|	d         |d         z
  nd}t          j	        |
|
z  ||z  z   ||z  z   ¦  «        }d	}|r||z  nd}d}d}| j         j
        �$|�"|                      | j         j
        |¦  «        }d	}d}d
}|r/|| j        k    rd	}d|d›d|d›d�}nCd}d|d›d| j        › d|d›d�}n-|r'|| j        k    r
d	}d|d›d�}nd}d|d›d| j        › d�}nd}d	}|sA|s|r=| xj        dz  c_        d	}d| j        › d| j        › d|› �}|                      |¦  «         n	d| _        d}t#          ||||||| j        |¬¦  «        }|rB| j        | j        k    r2d| j        › d|› d�}|                      |¦  «         t%          |¦  «        ‚d| _         |S ) u`   Láº¥y máº«u tráº¡ng thÃ¡i ngay SAU KHI nháº£ phÃ­m WASD vÃ  Ä‘Ã¡nh giÃ¡ vi sai chuyá»ƒn Ä‘á»™ng.Nu=   sample_post_move gá»�i khi chÆ°a láº¥y máº«u sample_pre_move!gü©ñÒMbP?ç        Fr   é   é   TÚ zRAM_CONFIRMED (Delta: z.2fzu, Vel: z.1fzu/s)zRAM_STALLED (Delta: zu < z
u, Dwell: zs)z OPTICAL_CONFIRMED (Pixel Shift: zpx)zOPTICAL_STALLED (Pixel Shift: zpx < ÚSENSOR_UNAVAILABLEuP   âš ï¸� [INV-MOTION-IMMOBILE] PhÃ¡t hiá»‡n nhÃ¢n váº­t Ä‘á»©ng yÃªn/káº¹t! Láº§n ú/z | )r   r   r    r!   r#   r$   r&   r(   uN   ðŸš¨ [INV-MOTION-IMMOBILE-FATAL] NhÃ¢n váº­t bá»‹ chÃ´n chÃ¢n hoÃ n toÃ n sau u     nhá»‹p báº¥m WASD! Chi tiáº¿t: uW   . Ngáº¯t kháº©n cáº¥p Ä‘á»ƒ ngÄƒn cháº·n bÃ¡o cÃ¡o áº£o vÃ  lÃ£ng phÃ­ thá»�i gian OCR!)r<   ÚRuntimeErrorrE   rF   Úmaxr   r   ÚlenÚmathÚsqrtr   Ú_compute_optical_shiftr.   r/   r;   r0   r2   r   r   )r=   r   r   rH   Út_nowr   r   Úhas_ram_dataÚp0Úp1ÚdxÚdyÚdzr    r!   Úhas_optical_datar#   Ú
diagnosticr$   r9   ÚresÚerr_msgs                         r   Úsample_post_movez'MotionFeedbackSentinel.sample_post_move]   sj  € ð ÔÐ'ÝÐ^Ñ_Ô_Ð_åÔ!Ñ#Ô#ˆÝ˜˜u tÔ';Ô'EÑEÑFÔFˆ	àˆ	Øˆð ÔÔ'Ð3¸Ð8KØÔ%Ô-ˆBØˆBØ�A”˜˜Aœ‘ˆBØ�A”˜˜Aœ‘ˆBÝ"% b¡'¤'¨A¢+ +µ#°b±'´'¸A²+°+��A”˜˜Aœ‘�À3ˆBÝœ	 " r¡'¨B°©GÑ"3°b¸2±gÑ"=Ñ>Ô>ˆIØˆLà0<ÐE�y 9Ñ,Ð,À#ˆð ÐØ ÐØÔÔ*Ð6¸:Ð;QØ#×:Ò:ØÔ$Ô/°ñ ô  Ðð  $Ðð ˆ	Øˆ
àð 	à˜DÔ5Ò5Ð5Ø �	Øc°iÐcÐcÐcÈ\ÐcÐcÐcÐc�
�
à!�	Ø}°IÐ}Ð}Ð}ÀtÔG`Ð}Ð}ÐluÐ}Ð}Ð}Ð}�
�
Øð 	à 4Ô#<Ò<Ð<Ø �	ØYÐ@PÐYÐYÐYÐY�
�
à!�	ØwÐ>NÐwÐwÐwÐY]ÔYrÐwÐwÐw�
�
ð .ˆJØˆIð ð 
	˜lð 
	Ð.>ð 
	ØÐ$Ô$¨Ñ)Ð$Ô$ØˆJðaØÔ1ðað aØ48Ô4Oðað aØT^ðað að ð ×Ò˜cÑ"Ô"Ð"Ð"à'(ˆDÔ$ØˆJåØØØ%Ø-ØØ!ØÔ0Ø)ð	
ñ 	
ô 	
ˆð ð 	2 Ô!9¸TÔ=XÒ!XÐ!XðiØÔ+ðið iØMWðið ið ið ð
 ×Ò˜gÑ&Ô&Ð&Ý(¨Ñ1Ô1Ð1ð  $ˆÔØˆ
r   Úimg_aú
np.ndarrayÚimg_bc           	     ó  — |j         |j         k    rdS |j        dk    rgt          j        |d¬¦  «                             t          j        ¦  «        }t          j        |d¬¦  «                             t          j        ¦  «        }n>|                     t          j        ¦  «        }|                     t          j        ¦  «        }t          j        ||z
  ¦  «        }t          t          j        |¦  «        ¦  «        }t          j        |¦  «        \  }}t          t          j        t          j        |¦  «        t          j        |¦  «        z   ¦  «        ¦  «        dz   }	||	z  }
t          t          dt          d|
¦  «        ¦  «        ¦  «        S )uC   TÃ­nh toÃ¡n Ä‘á»™ trÃ´i Ä‘iá»ƒm áº£nh (Pixel Shift) giá»¯a 2 frame.rJ   r-   rL   )Úaxisgñhãˆµøä>g      Y@)ÚshapeÚndimÚnpÚmeanÚastypeÚfloat32Úabsr   ÚgradientÚminrQ   )r=   rb   rd   Úgray_aÚgray_bÚdiffÚ	mean_diffÚgrad_yÚgrad_xÚavg_gradÚestimated_shifts              r   rU   z-MotionFeedbackSentinel._compute_optical_shiftÁ   s/  € àŒ;˜%œ+Ò%Ð%Ø�3ð Œ:˜Š?ˆ?Ý”W˜U¨Ð+Ñ+Ô+×2Ò2µ2´:Ñ>Ô>ˆFÝ”W˜U¨Ð+Ñ+Ô+×2Ò2µ2´:Ñ>Ô>ˆFˆFà—\’\¥"¤*Ñ-Ô-ˆFØ—\’\¥"¤*Ñ-Ô-ˆFõ Œv�f˜v‘oÑ&Ô&ˆÝ�"œ' $™-œ-Ñ(Ô(ˆ	õ œ VÑ,Ô,‰ˆ�Ý�œ¥¤¨¡¤µ"´&¸±.´.Ñ!@ÑAÔAÑBÔBÀTÑIˆØ# hÑ.ˆÝ•S˜¥ C¨Ñ 9Ô 9Ñ:Ô:Ñ;Ô;Ð;r   )r+   r,   r-   r,   N)r.   r   r/   r   r0   r%   r1   r   r2   r3   r4   r5   )r4   r%   )r4   r5   )NN)r   r   r   r   r4   r   )NNT)r   r   r   r   rH   r"   r4   r   )rb   rc   rd   rc   r4   r   )r   r   r   r   r>   ÚpropertyrA   rC   rG   ra   rU   r   r   r   r*   r*   3   s×   € € € € € ØfÐfð '*Ø&)Ø&'Ø+.Ø8<ð<ð <ð <ð <ð <ð" ð(ð (ð (ñ „Xð(ð$ð $ð $ð $ð 9=Ø+/ð$ð $ð $ð $ð $ð 9=Ø+/Ø"&ð	bð bð bð bð bðH<ð <ð <ð <ð <ð <r   r*   )r   Ú
__future__r   rS   rE   Údataclassesr   Útypingr   r   r   r   r	   Únumpyri   rP   r   r   r   r*   r   r   r   ú<module>r}      sK  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8à Ð Ð Ð ð	ð 	ð 	ð 	ð 	˜\ñ 	ô 	ð 	ð
 ð,ð ,ð ,ð ,ð ,ñ ,ô ,ñ „ð,ð ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ „ð	ðc<ð c<ð c<ð c<ð c<ñ c<ô c<ð c<ð c<ð c<r   