Ë
    u`j¹  ã                   ó  — d Z ddlZddlZddlZddlmc mZ dZdZdZ	dZ
dZdZd	Zh d
£ZdZ ej                   «       Zi Z ej&                  «       Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zedk(  r# e«         ed«       	  ej:                  d«       Œy)uÌ   Pi-side MQTT bridge. Exposes drive()/stop()/read_sensors() â€” wire these
up as OpenClaw tool functions once OpenClaw is installed. Sends a heartbeat
so the ESP32 watchdog can tell the Pi is still alive.
é    NÚ	localhosti[  gš™™™™™É?zrobot/cmd/drivezrobot/cmd/stopzrobot/heartbeatzrobot/sensors/status>   ÚleftÚrightÚforwardÚbackwardiˆ  c                 óÆ   — |j                   t        k(  rBt        5  t        j	                  t        j                  |j                  «      «       d d d «       y y # 1 sw Y   y xY w©N)ÚtopicÚTOPIC_SENSORSÚ_sensors_lockÚ_latest_sensorsÚupdateÚjsonÚloadsÚpayload)Ú_clientÚ	_userdataÚmsgs      úmqtt_bridge.pyÚ_on_messager      sK   € Ø
‡y�y”MÒ!Üñ 	<Ü×"Ñ"¤4§:¡:¨c¯k©kÓ#:Ô;÷	<ð 	<ð "÷	<ð 	<ús   š3AÁA c                  ó
  — t         t        _        t        j                  t        t
        «       t        j                  t        «       t        j                  «        t        j                  t        d¬«      j                  «        y )NT)ÚtargetÚdaemon)r   r   Ú
on_messageÚconnectÚBROKERÚPORTÚ	subscriber   Ú
loop_startÚ	threadingÚThreadÚ_heartbeat_loopÚstart© ó    r   r   r   "   sK   € Ü$„GÔÜ‡O�O”FœDÔ!Ü×Ñ”mÔ$Ü×ÑÔÜ×ÑœO°DÔ9×?Ñ?ÕAr%   c                  ól   — 	 t         j                  t        d«       t        j                  t
        «       Œ4)NÚ1)r   ÚpublishÚTOPIC_HEARTBEATÚtimeÚsleepÚHEARTBEAT_INTERVAL_Sr$   r%   r   r"   r"   *   s%   € Ø
Ü�‰œ¨Ô-Ü�
‰
Ô'Ô(ð r%   c                 ó\  — | t         vrt        dt         › �«      ‚t        dt        d|«      «      }t        dt        t        |«      «      }t
        j                  t        t        j                  | |dœ«      «       t        j                  |dz  t        «      }|j                  «        | ||dœS )Nzdirection must be one of r   éÿ   )Ú	directionÚspeedéè  )r/   r0   Úduration_ms)ÚVALID_DIRECTIONSÚ
ValueErrorÚmaxÚminÚMAX_DURATION_MSr   r(   ÚTOPIC_DRIVEr   Údumpsr    ÚTimerÚstopr#   )r/   r0   r2   Útimers       r   Údriver=   0   sŒ   € ØÔ(Ñ(ÜÐ4Ô5EÐ4FÐGÓHÐHÜ�”3�s˜E“?Ó#€EÜ�aœœ_¨kÓ:Ó;€Kä‡O�O”K¤§¡¸)ÈeÑ,TÓ!UÔVÜ�O‰O˜K¨$Ñ.´Ó5€EØ	‡K�K„MØ"¨UÀ;ÑOÐOr%   c                  ó^   — t         j                  t        t        j                  i «      «       y r	   )r   r(   Ú
TOPIC_STOPr   r9   r$   r%   r   r;   r;   <   s   € Ü‡O�O”J¤§
¡
¨2£Õ/r%   c                  óX   — t         5  t        t        «      cd d d «       S # 1 sw Y   y xY wr	   )r   Údictr   r$   r%   r   Úread_sensorsrB   @   s"   € Ü	ñ %Ü”OÓ$÷%÷ %ò %ús   ‡  )Ú__main__zKBridge running. Try: drive('forward'); time.sleep(1); print(read_sensors())é   )é–   r1   )Ú__doc__r   r    r*   Úpaho.mqtt.clientÚmqttÚclientr   r   r,   r8   r?   r)   r   r3   r7   ÚClientr   r   ÚLockr   r   r   r"   r=   r;   rB   Ú__name__Úprintr+   r$   r%   r   ú<module>rN      s¼   ðñó Û Û ç Ð à	€Ø€ØÐ à€Ø€
Ø#€Ø&€â;Ð Ø€à
ˆ$�+‰+‹-€Ø€Ø�	—‘Ó €ò<òBò)ó	Pò0ò%ð
 ˆzÒÙ„IÙ	Ð
WÔXØ
Øˆ�
‰
�1Œð ð r%   