Files
resonance-engine/__pycache__/protocol.cpython-311.pyc
T

273 lines
52 KiB
Plaintext
Raw Normal View History

2026-06-02 19:26:31 +07:00
§
zjzãódZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl
Z
ddl Z ddl Z ddl
Z
ddlmZ ddlmZmZn#e$rdZdZYnwxYwdejvZerdndZer
edd ¬
¦«d Zd Zd
ZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*ej+ ,ej+ -e.¦«¦«Z/ej+ 0e/d¦«Z1ej+ 0e/d¦«Z2ej3e1d ¬ ¦«ej3e2d ¬ ¦«d!„Z4d"„Z5d#„Z6d$„Z7gd%¢Z8d&„Z9dAd(„Z:d)„Z;d*„Z<da=ej>¦«Z?d a@d+„ZAd,„ZBd-„ZCd.„ZDGd/„d0¦«ZEGd1„d2¦«ZFdBd4„ZGd5„ZHerGd6„d7¦«ZId8„Z9d9„Z;d:„ZDd;„ZAd<Zd=Zd>ZeJd?kr_d@ejvrJej Kd@¦«ZLeLd=zeMej¦«kreNejeLd=z¦«ZeH¦«dSdS)Cuð
protocol.py — single-file Resonance Engine protocol.
Usage: python protocol.py [--no-laser] [--min MINUTES]
Phases: ZOMBIE KILL → COM DISCOVERY → BLE HRM → LASER CHECK → PRE(1m) → GOLD(30m) → TAPER → POST(10m) → CLEANUP
éN)Údatetime)Ú BleakScannerÚ BleakClientz --dry-rungš™™™™™©?çð?u4[DRY RUN] No hardware required — all I/O simulatedT©Úflushil÷iÐéi¶ûiètéègéhiÐûg@G@é2z21491-1z$00002a37-0000-1000-8000-00805f9b34fbézC:\Spooky2\Spooky.exeÚCOM15ÚCOM16ÚCOM3ÚdataÚlogs)Úexist_okcó(tj¦«S©N)Útime©óúD:\Resonance_Engine\protocol.pyÚts_nowrEsÝ Œ9‰;Œ;ÐrcóNtj¦« d¦«S)Nz%H:%M:%S)rÚnowÚstrftimerrrÚstamprHsÝ Œ<‰>Œ>× "  .rcóLtdt¦«d|d¬¦«dS)] Tr)Úprintr)Úmsgs rÚlogr$Ks0Ý Ð
e‰gŒgÐ
Ð
˜Ð
Ð
 +rcóZ|dkr"tj|trdndz¦«dSddS)u&Sleep — accelerated in dry-run mode.rç{®Gáz„?rN)rÚsleepÚDRY_RUN)Úss rÚdsleepr*Ns6à23°a²%°%…D„Jˆq,DÑ.¸T¸T¸T¸Tr) zgold.pyz
gx_auto.pyz ble_heart.pyz
startup.pyzbiofeedback_bridge.pyzmaster_protocol.pyzprotocol_logger.pyz_sdr_worker.pyz snr_100k.pyc ór‡ —td¦«d}ddl}ddl} |jj}ddl}t
j¦«}| gd¢¦«D]Þ} d  |j
dpg¦«Š |j
d|krŒ7tˆ fdtD¦«¦«sŒXtˆ fd „d
D¦«¦«rŒt| 
¦«| d ¬ ¦«|d
z
}Œ¤#t$r. | ¦«|d
z
}n#t$rYnwxYwYŒÛwxYwnn#t"$raddl}d  t¦«} |jdddd|dt
j¦«dgd¬ ¦«n#t$rYnwxYwYnwxYwtd|d¦«dS)z;Kill any stale protocol Python processes holding COM ports.z=== ZOMBIE KILL ===rN)ÚpidÚnameÚcmdlineú r.r,c3ó K|]}|vVŒ dSrr)Ú.0Úcmds €rú <genexpr>z%phase_kill_zombies.<locals>.<genexpr>js'øèèИ1 ˜<rc3óDK|]}| ¦«vVŒdSr)Úlower)r1Úbr3s €rr4z%phase_kill_zombies.<locals>.<genexpr>ms0øèèÐf¨Aq˜CŸIšI™KœKÐfr)ÚbacktestÚ papertraderÚraydiumÚ
supervisoré©Útimeoutéú
powershellz
-NoProfilez-CommandzxGet-CimInstance Win32_Process -Filter "Name='python.exe' OR Name='python3.exe'" | Where-Object { $_.CommandLine -match 'z' -and $_.ProcessId -ne z< } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }é
z Killed z
zombie(s))r$ÚctypesÚsignalÚwindllÚkernel32ÚpsutilÚosÚgetpidÚ process_iterÚjoinÚinfoÚanyÚZOMBIE_SCRIPTSÚ terminateÚwaitÚ ExceptionÚkillÚ ImportErrorÚ
subprocessÚrun)
ÚkilledrCÚ_signalrFÚ_psutilÚmeÚprocrTÚ scripts_patr3s
@rÚphase_kill_zombiesr\\sxø€åÐÑÔÐØ
€FØ#Ø”=ÔØ Ð Ð Ð Ý
ŒY‰[Œ[ˆØ×(Ð)CÐ)CÐ)CÑ ð ˆ
Ø—h’h˜tœy¨Ô9°rÑ:Ø”9˜UÔ# ÝÐ<­ØåÐfÐ1eÐØØÑ Ô Ð Ø— ’  ! ј!‘ øÝð
ð
ð
ðØ—I’I‘K”K˜a‘KFFøÝ ðððØøøøøøð 
øøøð øõ& ð ð ð àÐÐÐØ—h’h ð Ø ˆJŒNؘl¨JðMØ:EðMðMÝ_aÔ_hÑ_jÔ_jðMðMðMðð
ð 
ñ
ô
ð
ð
øõ ð ð ð Ø ˆDð øøøøøð øøøõÐ&'s¡œ<D6Á3C: D6Â
C:Â-D6Â.C:Ã D6Ã
/C:Ã9D6Ã:
D2ÄDÄD2Ä
D,Ä)D2Ä+D,Ä,D2Ä/D6Ä1D2Ä2D6Ä6(F!Å.FÆ
F!Æ
FÆF!ÆFÆF!Æ F!éÂcóÄ tj||d¬¦«}d|_d|_t jd¦«| ¦«|S#t$rYdSwxYw)zDOpen COM port with standard settings. Returns serial object or None.ç333333Ó?r=Tçš™™™™™¹?N)ÚserialÚSerialÚdtrÚrtsrr'Úreset_input_bufferrQ)ÚportÚbaudr)s rÚopen_comrhspðÝ ŒM˜$ ¨cР؈Œ˜da”eÝ Œ
3‰ŒˆØ ×ÒÑÔÐØˆøÝ ððð؈tˆtðøøøs‚AAÁ
AÁAcótd¦«tt¦«}|s²tdtd¦« tjtdd¬¦«}d|_d|_tjd¦«d |_d |_tjd¦«|  ¦«tt¦«}n#t$rYnwxYwtt¦«}|stdtd
¦«trttd ¬ ¦«nd
}tdtd|rdnddtd|rdnddtd|rdnd ¦«|r|s#td¦«tjd¦«|||fS)zDFind and open COM ports. Returns (sense, output, xm) serial objects.z=== COM DISCOVERY ===ú u: FAILED — trying power-up...r]r_r=à?Tz: FAILEDiá)rg Sense=r/ÚOKÚFAILz Output=z XM=zN/Az'FATAL: Required COM ports not availabler?)r$rhÚ COM_SENSErarbrcrdrr'ÚcloserQÚCOM_OUTÚCOM_XMÚsysÚexit)Úsenser)ÚoutputÚxms rÚphase_com_discoveryrxåÐÑ Ô Ð å •YÑ Ô €EØ ð
Ý Ð ;•Ð  Ý
¸Ð=ˆA؈AŒE 5˜1œ5­$¬*°S©/¬/¨/؈AŒE $˜!œ%­¬
°3©¬¨Ø
GŠG‰IŒIˆ'ˆEˆEøÝð ð ð Ø ˆDð øøøõ•gÑ
Ô
€FØ ð Ð "•Ð #å)/Ð 9•&˜uÐ %Ñ %Ô %Ð %°T€Båð /•9ð / 8˜t˜t°&ðð /Ø$*Ð6˜D˜ðð,tt  ð˜ðÝ Ð  Œ Œ ˆ à &˜ Ðs¿BCÃ
CÃCcó<tsdtjvrtd¦«dStd¦«t d¦«D]A}t |¦«}|dkrtd|d¦«dSt
jd ¦«ŒBtd
¦« d d l}|  d
g¦«D]b}|j
d
dkrO|  ¦«|  d¬¦«td¦«t
jd¦«nŒcn#t$rYnwxYw tjt g¦«}td|jd¦«n9#t$r,}td|¦«td¦«Yd }~dSd }~wwxYwtd¦«t
jd¦«td¦« tjddt'|j¦«gd¬¦«n#t$rYnwxYwt
jd¦« | ¦«€9td¦«|  ¦«|  d¬¦«n6#t$r) | ¦«n#t$rYnwxYwYnwxYwtd¦«t
jd¦«t d¦«D]@}t |¦«}|dkrtd |¦«dSt
jd!¦«ŒAtd"¦«dS)#uø
GX Pro firmware v200: r11/r12 registers return :err until Spooky2
touches the COM ports. This handshake launches Spooky2, waits for
registers to become available, then closes it. Cached — fast path
if registers already work.
z--no-handshakez#=== SPOOKY2 HANDSHAKE (skipped) ===Tz=== SPOOKY2 HANDSHAKE ===r<r u Fast path — r11=z, handshake cachedgš™™™™™É?u+ Registers locked — launching Spooky2...rNr-z
Spooky.exer=z Closed existing Spooky2éz Spooky2 launched (PID ú)z Spooky2 launch failed: u+ Proceeding — r11/r12 may be unavailableFz, Waiting for Spooky2 to initialize (30s)...r
z! Closing Spooky2 via WM_CLOSE...Útaskkillz/PIDrBéu Still running — forcing...z% Waiting for COM ports to release...u Unlocked — r11=rkz1 WARNING: r11/r12 not responding after handshake)r(rsÚargvr$ÚrangeÚread_r11rr'rGrJrLrOrPrQrTÚPopenÚ SPOOKY2_PATHr,rUÚstrÚpollrR)ruÚrrGrZÚspookyÚattempts rÚphase_spooky2_handshakerŠ»s†õðÐ"¥c¤hÐ Ð ˆtåÐ1‰XŒXððˆÝ U‰OŒOˆØ ˆtŠ8ˆ Ð<  4 Œ
3‰ŒˆˆåÐ

؈
ˆ
ˆ
Ø×¨Ñ ð ˆDØŒy˜Ô  LÒÑ Ô Ð Ø— ’  ! ÑÐ
˜1
Øð 1øøõ ð
ð
ð
Ø ˆð
øøøðÝÔ!¥< .Ñ1ˆÝ Ð 4 v¤zÐ 5øÝ ðððÝ Ð Ð  Ð ˆuˆuˆuˆuˆuøøøøðøøøõЄJˆrN„N€NõÐ
ÝŒ˜
 F­´
©O¬OÐ<ÀbÐIøÝ ð
ð
ð
Ø ˆð
øøøå„JˆqM„M€Mð Ø ;Š;‰=Œ=Ð Ý Ð × Ò Ñ Ô Ð Ø KŠK ˆ "øøÝ ðððð Ø KŠK‰MŒMˆMˆMøÝð ð ð Ø ˆDð øøøøøðøøøõ ЄJˆqM„M€Mõ˜‘9”9ððˆÝ U‰OŒOˆØ ˆtŠ8ˆ8Ý Ð) aÐ 4 Œ
3‰ŒˆˆåÐ ˆ4stÂA=DÄ
D"Ä!D"Ä&2EÅ
FÅ#!F
Æ
FÇ+G1Ç1
G>Ç=G>ÈA
I$É$
JÉ/JÊJÊ
JÊJÊJÊJÊJcóÌtŠtŠtjtjtj¦«}| tjtjd¦«| d¦«|  d¦«dŠˆfdŠˆˆˆfd}tj ¦«}tj |¦«| 
|¦«¦«dS)zBBackground thread: scan for BLE strap, connect, stream HR via UDP.r?)z 127.0.0.1iÓrcóÐ |d}|dzrtjd|d¦«dn|d}t5|}ddd¦«dS#1swxYwYdS#t$rYdSwxYw)zParse GATT 0x2A37 notification.rr?z<HN)ÚstructÚ unpack_fromÚbpm_lockrQ)rÚflagsÚbpmÚbpm_vals rÚ bpm_handlerz%ble_heart_thread.<locals>.bpm_handler$ð Ø˜”GˆEØ:?À!¹)ÐP•&Ô$ T¨4°Ñ3°AÔÈäCÝð
ð
Øð
ð
ð
ñ
ô
ð
ð
ð
ð
ð
ð
ð
øøøð
ð
ð
ð
ð
ð
øåð ð ð Ø ˆDˆDð øøøs3‚8AºA
½ AÁ
AÁAÁAÁAÁ
A%Á$A%có|¦«dSrr)Úsenderrr“s €rÚhandlerz!ble_heart_thread.<locals>.handler.sø€Øˆ ÔÐÐÐrcóîKd}ttdd¦«tjt¬¦«ƒd{V}t ˆfd|D¦«d¦«}|sEtdd|dd ¦«t
j|¦«ƒd{Vt|d
zd ¦«}ŒŸtd |j ¦«t|j ¦«4ƒd{V}td
|j ¦«|  ¦«ƒd{Vtd¦«tr/|j r(t
jd¦«ƒd{Vtr|j °(td¦«ddd¦«ƒd{Vn#1ƒd{VswxYwYd}ng#t j
$rYdSt$rI}td|¦«t
j|¦«ƒd{Vt|d
zd ¦«}Yd}~nd}~wwxYwt°ådSdS)NrzBLE: scanning for z...r=c3ó2K|]}|jk¯
|VŒdSr)r-)r1ÚTARGETs €rr4z?ble_heart_thread.<locals>.connect_and_stream.<locals>.<genexpr>9s/øèèÐC !°!´&¸FÒ2BÐ2B˜AÐ2BÐ2BÐ2BÐ2BÐCrzBLE: u not found — retry in ú.0fr)rzg.@z
BLE: found @ zBLE: connected=zBLE: streaming...r?zBLE: disconnecteduBLE: error — )Ú ble_runningr$rÚdiscoverÚBLE_SCAN_TIMEOUTÚnextÚasyncior'ÚminÚaddressrÚ is_connectedÚ start_notifyÚCancelledErrorrQ)ÚdelayÚdevicesÚdevÚclientrˆÚHR_CHARršrs €€€rÚconnect_and_streamz,ble_heart_thread.<locals>.connect_and_stream1søèèàˆåñ
ÐÐ5Ý ,Ô 5Õ>NÐ OÑ OÔ OÐOÝÐC wÐCÀTÑJàðÝÐÐÐ!œ-¨Ñ ¨¡ ¨4Ñ0åÐ1 C¤KÐ& s¤{Ñ-°vÝÐ?¨&Ô*=Ð ×-¨g°wÑÐ/¨&Ô*=ð%œm¨AÑ/¨&Ô*=ðÐ
-øøøðøåÔ
ð
ð
ØÝð


Ð) aДm EјE A™I ,øøøøð
-øøøõ1ñ -sIBFÂ%1FÃBE0ÅFÅ0
E:Å:FÅ=E:Å>FÆG(Æ G(Æ?G#Ç#G(N)Ú BLE_HR_CHARÚBLE_DEVICE_NAMEÚsocketÚAF_INETÚ
SOCK_DGRAMÚ
setsockoptÚ
SOL_SOCKETÚ SO_REUSEADDRÚbindÚ
settimeoutr Únew_event_loopÚset_event_loopÚrun_until_complete)Úsockr«Úlooprªr“rs @@@@rÚble_heart_threadr»øøøø€õ€GÝ
€Fõ Œ=œ­Ô):Ñ ;€D؇OO•FÔ%¥vÔ':¸‡I‡OOÔÐððððððððð-õB Ô #€DÝ Ô˜4Ñ Ô Ð Ø×ÒÐ1rcóŒ | d¦«tjd¦«| d¦« d¬¦« ¦«}| dd¦« dd¦« ¦«}|rt|¦«nd S#t$rYd SwxYw)
z8Read r11 register from COM15. Returns int, 0 on failure.s:r11=,
ç{®Gáz´?éÈÚreplace©Úerrorsú:r11=Úú.r© Úwriterr'ÚreadÚdecodeÚstripr¿ÚintrQ)ÚserÚrawÚvals rr€r€ZðØ Š  Ô Ð Ý Œ
ÔÐØhŠhs‰mŒm×"¨)Ð4×<ˆØkŠk˜' &×.¨s°BÑ7×?ˆØÐ%s3‰xŒxˆx AÐ%øÝ ððð؈qˆqðøøøs‚B2B5Â5
CÃCcó² | d¦«tjd¦«| d¦« d¬¦« ¦«}| dd¦« dd¦« ¦«}|rt|¦«nd }|r |d
zd z d znd
}||fS#t$rYdSwxYw)z3Read r12 register from COM15. Returns (raw, angle).s:r12=,
r¿ú:r12=rÃrg€v@gjè@r ç)r)Úval_rawrÍÚangles rÚread_r12rÓeð Ø Š  Ô Ð Ý Œ
ÔÐØhŠhs‰mŒm×"¨)Ð4×<ˆØ—++˜g 2°3¸ÑCˆØ,c'‰lŒlˆl¨1ˆØ14Ð=u˜&¨#Ñ-¸#ˆØEˆzÐøÝ ððð؈vˆvðøøøs‚CCÃ
CÃCcó¦td¦«d}td¦«D]/}t|¦«}|dkr|}ntjd¦«Œ0|dkrtd¦«dStd|¦«t
d zd
z}td t
d ¦«| d
|d ¦«¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«td¦«D]^}t|¦«}|dkr3t||z
¦«}|tkrtd|d¦«dStjd¦«Œ_td¦«dS)zAFire cold laser on COM15 CH2, verify via r11 delta. Returns True.z=== LASER CHECK ===rr
r r_u1 No biofeedback contact — skipping laser checkFú Baseline r11=édr
z Firing laser @ z
Hz carrier...ú:w25=ú,
r`s :w21=0,
s :w29=1000,
s
:w32=20,
s
:w33=20,
ó
:w11=0,,
ó
:w11=,1,
z LASER CONFIRMED (r11 delta=r{Tu# Laser inconclusive — proceeding)
r$rr€rr'Ú
LASER_CARRIERrÆÚencodeÚabsÚLASER_DELTA_THRESHOLD)ruÚ
r11_beforer…r†Úw25_valr‰Údeltas rÚphase_laser_checkrâvsFåÐÑÔÐð€JÝ
2‰YŒYððˆÝ U‰OŒOˆØ ˆtŠ8ˆ8؈JØ ˆEÝ Œ
3‰ŒˆˆàÐÝ Ð ˆÐ&˜˜! %€GõÐ8 ‡K&˜Ð&×0µ$´*¸S±/´/°/Ø ‡K‚KÑÔе´
¸4Ñ0@Ô0@Ð0@Ø ‡K´
¸4Ñ0@Ô0@Ð0@Ø ‡K‚KÑ Ô Ð µ´
¸4Ñ0@Ô0@Ð0@Ø ‡K‚KÑ Ô Ð µ´
¸4Ñ0@Ô0@Ð0@Ø ‡K‚KÑ Ô Ð µ´
¸4Ñ0@Ô0@Ð0@Ø ‡K‚KÑ Ô Ð µ´
¸4Ñ0@Ô0@Ð0@õ˜‘9”9ððˆÝ U‰OŒOˆØ ˆtŠ8ˆ8ݘ˜J™Ñ'ˆÕÐ<°EÐt Œ
3‰ŒˆˆåÐ ˆ4rcó0eZdZdZdZdZdZdZdZdS)ÚGXOutputz)Manages GX Pro frequency output on COM16.cót||_tdzdz|_tdzdz|_t
|_dS)NrÖr
)r)Ú GX_FREQ_1Úfreq1Ú GX_FREQ_2Úfreq2Ú GX_AMPLITUDEÚamp©ÚselfrËs rÚ__init__zGXOutput.__init__ªs4؈ŒÝ ‘_ qÑŒ
Ý _ (ˆŒ
݈Œˆˆrcó° |j}| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd ¦«| d
¦«tjd ¦«| d¦«tjd ¦«| d ¦«tjd ¦«| d¦«tjd ¦«| d
¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d|jd ¦«¦«tjd ¦«| d|jd ¦«¦«tjd ¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd ¦«| d|jd ¦«¦«tjd ¦«| d|jd ¦«¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«td¦«d S)!z5Initialize GX with current frequencies and amplitude.rÙó
:w11=,0,
ó :w28=0,
ó :w29=0,
ó
:w24=00,
ó
:w25=00,
ó :w14=0,
çáz®Gáº?s :w17=0,0,
s :w15=1,1,
ç333333Ã?s :w32=120,
s :w33=120,
s :w13=0,
s:n00=259k/322k 90d
ú:w24=rØr×ó
:w12=0,,
r`ó
:w12=,0,
縅ëQ¸¾?ó :w14=1,
ú:w28=ú:w29=ó
:w32=90,
ó :w33=150,
ó
:w11=1,,
zGX: initializedN) r)rr'r$©r)s rÚinitz
GXOutput.init°sà ŒFˆà ŠÑ Ô Ð ¥$¤*¨TÑ"2Ô"2Ð"2Ø ŠÑ Ô Ð ¥$¤*¨TÑ"2Ô"2Ð"2Ø ŠÑÔÐ¥4¤:¨dÑ#3Ô#3Ð#3Ø ŠÑÔÐ¥4¤:¨dÑ#3Ô#3Ð#3Ø ŠÑ Ô Ð ¥4¤:¨dÑ#3Ô#3Ð#3Ø ŠÑ Ô Ð ¥4¤:¨dÑ#3Ô#3Ð#3ð
ŠÑÔÐ¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÐ Ñ!¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÑ Ô Ð ¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÐ Ñ!¥D¤J¨tÑ$4Ô$4Ð$4Ø ŠÑ Ô Ð ¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÐ Ñ!¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÐ Ñ!¥D¤J¨uÑ$5Ô$5Ð$5Ø ŠÑÔÐ¥D¤J¨uÑ$5Ô$5Ð$5ð
ŠÐ*µ$´*¸UÑ2CÔ2CÐ2CØ ŠÐ)˜œ
Ð3µT´Ñ5FÔ5FÐ5FØ ŠÐ)˜œ
Ð3µT´Ñ5FÔ5FÐ5FØ ŠÑ Ô Ð µD´J¸s±O´O°OØ ŠÑ Ô Ð µD´J¸tÑ4DÔ4DÐ4DØ ŠÑÔеD´J¸uÑ4EÔ4EÐ4EØ ŠÐ'˜œÐ'×1µD´J¸uÑ4EÔ4EÐ4EØ ŠÐ'˜œÐ'×1µD´J¸uÑ4EÔ4EÐ4EØ ŠÑ Ô Ð µD´J¸uÑ4EÔ4EÐ4EØ ŠÐ Ñ!µD´J¸uÑ4EÔ4EÐ4EØ ŠÑÔеD´J¸tÑ4DÔ4DÐ4DØ ŠÑ Ô Ð µD´J¸uÑ4EÔ4EÐ4EØ ŠÑ Ô Ð µD´J¸uÑ4EÔ4EÐ4Eå Ð ÑÔÐÐÐrcóî|j}|r|j|j}}n|j|j}}| d|d ¦«¦«t jd¦«| d|d ¦«¦«t jd¦«| d¦«t jd¦«| d¦«t jd¦«| d ¦«t jd¦«| d
|jd ¦«¦«t jd¦«| d |jd ¦«¦«t jd¦«| d ¦«t jd¦«| d
¦«t jd¦«| d¦«t jd¦«| d¦«t jd¦«| d¦«t jd¦«dS)z9Swap frequency pair. direction: 1 = 322/259, 0 = 259/322.rør×r`rÿrrN)r)rr'©Ú directionr)Úc1Úc2s rÚswapz
GXOutput.swapÖs!à ŒFˆØ ð”Z ¤ˆBˆBà”Z ¤ˆBà ŠÐÐ+­T¬Z¸Ñ->Ô->Ð->Ø ŠÐ!˜Ð+­T¬Z¸Ñ->Ô->Ð->Ø ŠÑ Ô Ð ­T¬Z¸©_¬_¨_Ø ŠÑ Ô Ð ­T¬Z¸Ñ-=Ô-=Ð-=Ø ŠÑÔЭT¬Z¸Ñ->Ô->Ð->Ø ŠÐ'˜œÐ'×1µ4´:¸eÑ3DÔ3DÐ3DØ ŠÐ'˜œÐ'×1µ4´:¸eÑ3DÔ3DÐ3DØ ŠÑ Ô Ð ­T¬Z¸Ñ->Ô->Ð->Ø ŠÐ Ñ!­T¬Z¸Ñ->Ô->Ð->Ø ŠÑÔЭT¬Z¸Ñ-=Ô-=Ð-=Ø ŠÑ Ô Ð ­T¬Z¸Ñ->Ô->Ð->Ø ŠÑ Ô Ð ­T¬Z¸Ñ->Ô->Ð->Ð->Ð->rcó$||_|j d|d ¦«¦«t jd¦«|j d|d ¦«¦«t jd¦«dS)zSet output amplitude (0-2000).rýN)r)rr')s rÚ
set_amplitudezGXOutput.set_amplitudeës…àˆŒØ Œ Š Ð'˜'×1µ4´:¸dÑ3CÔ3CÐ3CØ Œ Š Ð'˜'×1µ4´:¸dÑ3CÔ3CÐ3CÐ3CÐ3Crcóš|j}| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d ¦«t d
¦«d S) zKill all output.rÙr`s:w14=1
s :n00=STOP
z GX: stoppedN)r)rr'r$rs rÚstopz
GXOutput.stopñsà ŒFˆØ ŠÑ Ô Ð ¥$¤*¨S¡/¤/ /Ø ŠÑ Ô Ð ¥$¤*¨S¡/¤/ /Ø ŠÑÔÐ¥4¤:¨c¡?¤? ?Ø ŠÑÔÐ¥4¤:¨c¡?¤? ?Ø ŠÑ Ô Ð ¥4¤:¨c¡?¤? ?Ø ŠÑ Ô Ð ¥4¤:¨c¡?¤? ?Ø Š
ÑÔÐ¥4¤:¨c¡?¤? ?Ø ŠÐ Ñ ˆMÑÔÐÐÐrN) Ú__name__Ú
__module__Ú __qualname__Ú__doc__rîrr r r
rrr§siØ ð ð ð $ð$ð$ðL?ð*DðDðDð ð ð ð ð rcó0eZdZdZdZdZdZdZdZdS)ÚXMOutputz.Manages XM generator frequency output on COM3.cóh||_tdz|_tdz|_t
|_dS)NrÖ)r)Ú XM_FREQ_1rçÚ XM_FREQ_2réÚ
XM_VOLTAGEÚvoltrìs rzXMOutput.__init__s*؈ŒÝ ‘_ˆŒ
Ý _ˆŒ
݈Œ ˆ ˆ rcóÎ|j}| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd¦«| d¦«tjd ¦«| d
¦«tjd ¦«| d ¦«tjd ¦«| d |jd
 ¦«¦«tjd ¦«| d|jd
 ¦«¦«tjd ¦«| d|jd
 ¦«¦«tjd ¦«| d|jd
 ¦«¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«| d¦«tjd ¦«td¦«dS)z3Initialize XM with current frequencies and voltage.ó:w610
ó:w620
ó:w250
ó:w260
s:w1511
s:w130
r`s:w210
s:w220
ú:w23ú
ú:w24ú:w25ú:w26s:w310
s:w3290
s:w630
s:w640
ó:w611