+
     viX9  c                   st   R t ^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIH	t	 ^ RI
Ht ^ RI
HtHt ^ RIHt ]P"                  ! ]4      t^@t^t]P,                  t]P0                  t]P4                  t]P8                  t]P<                  t^ t ^t!^t"] R	]!R
]"R/t#^t$ ! R R]4      t% ! R R]4      t& ! R R]4      t']'t(R# )a  liquidctl drivers for Corsair HXi and RMi series power supply units.

Supported devices:

- Corsair HXi (HX750i, HX850i, HX1000i and HX1200i)
- Corsair RMi (RM650i, RM750i, RM850i and RM1000i)

Copyright Jonas Malaco and contributors

Port of corsaiRMi by notaz and realies.
Copyright (c) notaz, 2016

Incorporates or uses as reference work by Sean Nelson.

SPDX-License-Identifier: GPL-3.0-or-later
N)	timedelta)Enum)UsbHidDriverNotSupportedByDevice)CommandCode)WriteBitlinear_to_float)clampz+12Vz+5Vz+3.3Vc                   s2   a  ] tR t^-t o Rt^t^tR tRtV t	R# )OCPModezOvercurrent protection mode.c                sV    V P                   P                  4       P                  R R4      # )_Z )name
capitalizeZreplaceself   &E/usr/lib/python3.14/site-packages/liquidctl/driver/corsair_hid_psu.py__str__ZOCPMode.__str__3   s"    yy##%--c377     N)
__name__
__module____qualname____firstlineno____doc__SINGLE_RAIL
MULTI_RAILr   __static_attributes____classdictcell____classdict__   @r   r	   r	   -   s     &KJ8 8r   r	   c                   s2   a  ] tR t^7t o Rt^ t^tR tRtV t	R# )FanControlModezFan control mode.c                s6    V P                   P                  4       # N)r   r   r   r   r   r   ZFanControlMode.__str__=   s    yy##%%r   r   N)
r   r   r   r   r   HARDWARESOFTWAREr   r   r   r   r   r   r    r    7   s     HH& &r   r    c                   s  a a ] tR t^At oRtRRRRR1RR2/3RRRRR3RR4/3RR	R
RR5RR6/3RRRRR7RR8/3RRRRR9RR:/3RRRRR;RR</3RRRRR=RR>/3RRRRR?RR@/3RRRRRARRB/3RRRRRCRRD/3RRRRRERRF/3RRRRRGRRH/3.tRRRR/V 3R lltRIR ltR  tR! t	RJR" lt
R# tR$ tR% tR& tR' tR( tRKR) ltR* tR+ tR, tR- tR. tR/ tR0tVtV ;t# )LCorsairHidPsuz,Corsair HXi or RMi series power supply unit.i  i  zCorsair HX750i	fpowin115	fpowin230i  zCorsair HX850ii  zCorsair HX1000ii  zCorsair HX1200ii#  zCorsair HX1200i ATX 3.1i'  zCorsair HX1200i ATX 3.1 #2i
  zCorsair RM650ii  zCorsair RM750ii  zCorsair RM850ii  zCorsair RM1000ii  zCorsair HX1000i (2022)i  zCorsair HX1500iNc               sd   < V'       d	   V'       g   Q h\         SV `  ! V/ VB  Wn        W n        R# )z
Args:
    fpowin115: coefficients of a quadratic function that maps from output power to input power at 115V
    fpowin230: coefficients of a quadratic function that maps from output power to input power at 230V
N)Zsuper__init__r%   r&   )r   r%   r&   Zargskwargs	__class__s   &$$*,r   r'   ZCorsairHidPsu.__init__   s,     Y&&$)&)""r   c                sp   V P                   '       d_   V'       g-   \        P                  RV P                   P                  4       R# \        P                  RV P                   P                  4       V P	                  ^^.4       V P                  4       pV'       d   \        P                  M\        P                  p\        P                  RV4       V P                  \        P                  \        VP                  .4       \        P                  R4       V P                  \         P"                  4       R# )a  Initialize the device and the driver.

This method should be called every time the systems boots, resumes from
a suspended state, or if the device has just been (re)connected.  In
those scenarios, no other method, except `connect()` or `disconnect()`,
should be called until the device and driver has been (re-)initialized.

Returns None or a list of `(property, value, unit)` tuples, similarly
to `get_status()`.
z8bound to %s kernel driver, OCP and fan modes not changedNz2forcing re-initialization despite %s kernel driverzsetting +12V OCP mode to %sz&resetting fan control to hardware mode)_hwmon_LOGGERwarningdriver_write_readr	   r   r   info_execr   WRITE_CORSAIR_12V_OCP_MODEvalue_set_fan_control_moder    r"   )r   Zsingle_12v_ocpdirect_accessr(   r
   modes   &&&,  r   
initializeZCorsairHidPsu.initialize   s      ;;;  Z $ 2 24 T $ 2 24 	T4L!JJL '5w""':L:L2D9

8>>#84::,G=>"">#:#:;r   c           
     s   V P                   P                  4        V P                  \        P                  \
        P                  ^ .4      pV^,          ^8X  d   \        P                  R4       V P                  \
        P                  4      pRV P                  \        4      R3RV P                  \        4      R3RV P                  \
        P                  4      R3RV P                  \
        P                  4      R3RV P!                  4       R3R	V P                  \
        P"                  4      R
3RVR3RV P%                  4       R3.p\&        \(        \*        3 F  p\,        V,          pV P                  \        P                  \
        P                  V.4       VP/                  V R2V P                  \
        P0                  4      R34       VP/                  V R2V P                  \
        P2                  4      R34       VP/                  V R2V P                  \
        P4                  4      R34       K  	  V P                  \6        4      p\9        V P;                  W%4      ^ 4      p\9        WV,          ^d,          ^ 4      pVP/                  RVR34       VP/                  RVR34       VP/                  RVR34       V P                  \        P                  \
        P                  ^ .4       V# )    zpossibly uninitialized devicezCurrent uptimeZ zTotal uptimeVRM temperature   °CCase temperaturezFan control mode	Fan speedrpmInput voltageVz+12V OCP mode output voltage output currentA output powerWTotal power outputEstimated input powerEstimated efficiency%)deviceZclear_enqueued_reportsr1   r   r2   CMDZPAGEr+   r,   
_get_floatZREAD_VIN_get_timedelta_CORSAIR_READ_UPTIME_CORSAIR_READ_TOTAL_UPTIMEZREAD_TEMPERATURE_1ZREAD_TEMPERATURE_2_get_fan_control_modeZREAD_FAN_SPEED_1_get_12v_ocp_mode	_RAIL_12V_RAIL_5V
_RAIL_3P3V_RAIL_NAMESappendZ	READ_VOUTZ	READ_IOUTZ	READ_POUT_CORSAIR_READ_OUTPUT_POWERround_input_power_at)r   retinput_voltagerailr   output_powerinput_power
efficiencys   &       r   _get_status_directlyZ"CorsairHidPsu._get_status_directly   sN   **,jjA37q6T>OO;<5 t223GH"MT001KLbQ0F0F GO1G1G!H%P!;!;!=rB$//#*>*>?GmS1d446;	
 *5Dt$DJJx~~sxx$8JJ4&0$//#--2PRUVWJJ4&0$//#--2PRUVWJJ4&.0NPSTU 6 'ABD00MqQ<5;Q?


(,<=

+[#>?

*J<=

8>>388aS1
r   c           	     s   \         P                  R V P                  P                  4       V P                  P	                  R4      R,          pRV P                  P	                  R4      R,          R3RV P                  P	                  R4      R,          R3RV P                  P	                  R	4      R
3RVR3.p\        \        ^^4      \        \        \        .4       F  w  r4V^,
          p\        V,          pVP                  V R2V P                  P	                  RV R24      R,          R34       VP                  V R2V P                  P	                  RV R24      R,          R34       VP                  V R2V P                  P	                  RV R24      R,          R34       K  	  V P                  P	                  R4      R,          p\        V P                  W4      ^ 4      p\        Wx,          ^d,          ^ 4      p	VP                  RVR34       VP                  RVR34       VP                  RV	R34       V# )z4some attributes cannot be read from %s kernel driverZ	in0_inputgMbP?r:   Ztemp1_inputr;   r<   Ztemp2_inputr=   Z
fan1_inputr>   r?   r@   rA   ZinZ_inputrB   ZcurrrC   rD   Zpowergư>rE   Zpower1_inputrF   rG   rH   rI   )r+   r,   r*   r-   Zread_intZzipZrangerR   rS   rT   rU   rV   rX   rY   )
r   r[   rZ   Znr\   Zir   r]   r^   r_   s
   &         r   _get_status_from_hwmonZ$CorsairHidPsu._get_status_from_hwmon   s	   
 	NPTP[P[PbPbc,,[9D@  4 4] Cd JER!5!5m!Dt!KUS$++..|<eDmS1	
 5A;Hj(IJGAAAt$DJJ4&0$++2F2FA3f~2VY]2]_bcdJJ4&0$++2F2FaSPVGW2X[_2_adefJJ4&.0D0DuQCvEV0WZ^0^`cde K {{++N;dBD00MqQ<5;Q?


(,<=

+[#>?

*J<=
r   c                sB   V P                   '       dC   V'       g;   \        P                  RV P                   P                  4       V P	                  4       # V P                   '       d+   \        P                  RV P                   P                  4       V P                  4       # )zJGet a status report.

Returns a list of `(property, value, unit)` tuples.
z4bound to %s kernel driver, reading status from hwmonz4directly reading the status despite %s kernel driver)r*   r+   r0   r-   ra   r,   r`   )r   r6   r(   s   &&,r   
get_statusZCorsairHidPsu.get_status  sp     ;;;}LLOQUQ\Q\QcQcd..00;;;OOR KK..0 ((**r   c                s   \        V\        ^d4      p\        P                  R4       V P	                  \
        P                  4       \        P                  RV4       V P                  \        P                  \        P                  V.4       R# )z"Set channel to a fixed speed duty.z(ensuring fan control is in software modezsetting fan PWM duty to %d%%N)r   _MIN_FAN_DUTYr+   r0   r5   r    r#   r1   r   r2   rK   ZFAN_COMMAND_1)r   channelZdutyr(      &&&,r   set_fixed_speedZCorsairHidPsu.set_fixed_speed  s\    T=#.?@"">#:#:;3T:

8>>3#4#4tf=r   c                    \        4       hzNot supported by this device.r   )r   rd   r7   Zcolorsr(      &&&&,r   	set_colorZCorsairHidPsu.set_color      "$$r   c                rg   rh   r   )r   rd   Zprofiler(   re   r   set_speed_profileZCorsairHidPsu.set_speed_profile  rk   r   c                s    R  pV! V P                   V4      pV! V P                  V4      p\        P                  RWE4       WEV,
          V^s,
          ,          ^s,          ,           # )c                 sR    V w  r#pW!^,          ,          W1,          ,           V,           # )   r   )ZparamsZxZaZbZcs   &&   r   	quadraticZ0CorsairHidPsu._input_power_at.<locals>.quadratic"  s#    GA!!t8ae#a''r   z5input power estimates: %.3f W @ 115 V; %.3f W @ 230 V)r%   r&   r+   Zdebug)r   r[   r]   rn   Z
for_in115vZ
for_in230vs   &&&   r   rY   ZCorsairHidPsu._input_power_at!  sX    	( t~~|<
t~~|<
Mzf *49LMPSSSSr   c                s    \        V4      \        8:  g   Q h\        ^\        ,           4      pW^^\        V4      ,           % V P                  P	                  V4       R# )i   N)Zlen_REPORT_LENGTHZ	bytearrayrJ   Zwrite)r   dataZpacket   && r   r.   ZCorsairHidPsu._write-  sG    4yN***1~-.#'q!c$i- &!r   c                s@    V P                   P                  \        4      # r!   )rJ   Zreadro   r   r   r   r/   ZCorsairHidPsu._read3  s    {{//r   c                s    \         \        V4      ,          \        V4      .T;'       g    . ,           pV P                  V4       V P	                  4       pVR ,          VR ,          8X  g   Q R4       hV# ):r9   rm   Nz9invalid response (possible conflict with another program))_SLAVE_ADDRESSr   rK   r.   r/   )r   Zwritebitcommandrp   ZoutrZ   s   &&&&  r   r1   ZCorsairHidPsu._exec6  s]     22CLATZZRPCjjl3x3s8#a'`a#
r   c                j    \        V P                  \        P                  \        4      ^,          4      # )z$Get +12V single/multi-rail OCP mode.)r	   r1   r   READr3   r   r   r   rQ   ZCorsairHidPsu._get_12v_ocp_mode=  s"    tzz(--1FGJKKr   c                rt   )z'Get hardware/software fan control mode.)r    r1   r   ru   _CORSAIR_FAN_CONTROL_MODEr   r   r   rP   Z#CorsairHidPsu._get_fan_control_modeA  s#    djj8QRSTUVVr   c                sb    V P                  \        P                  \        VP                  .4      # )z'Set hardware/software fan control mode.)r1   r   r2   rv   r4   )r   r7      &&r   r5   Z#CorsairHidPsu._set_fan_control_modeE  s     zz(..*Cdjj\RRr   c                sb    \        V P                  \        P                  V4      R,          4      # )zGet float value with `command`.:rm   NN)r   r1   r   ru   )r   rs   rw   r   rL   ZCorsairHidPsu._get_floatI  s!    tzz(--A"EFFr   c                s    \         P                  V P                  \        P                  V4      R,          RR7      p\        VR7      # )zGet timedelta with `command`.:rm   i   NZlittle)Z	byteorder)Zseconds)ZintZ
from_bytesr1   r   ru   r    )r   rs   Zsecsrq   r   rM   ZCorsairHidPsu._get_timedeltaM  s4    ~~djj@EQY~Z&&r   c                rg   rh   r   )r   rd   r7   r4   r(   ri   r   
set_screenZCorsairHidPsu.set_screenR  rk   r   )r%   r&   )g=!?g4yO0?gYM#@)gzj9L?4*K?gD'D @)g̓.	I?g))p-?guw(@)g%EزM?g_F1H?gΔ$@)g&?gRWAE?gY='@)gQ<K?g#Vx?gS2)@)g@@-^?g=M&`?gGF.@)g^7PM&?gy	?g<i/@)g\A?gt~?gyn_+@)g3P?g~WWv́?g+ !@)g
C?gsE0?go7s)@)g^$V0?gsi?g@)gW̴&?g׾!D?g=Ӹ(@)g%5J(E ?g'J6tt?g
$p6"@)gػ_­#?g־!D?g~G,@)g?l?gF?g݇&@)g.| ?gOZoLA?gf+@)g  Z?gZ&`?g2r%@)g5\AC?g&(o?g
>G.3/,@)g]ɋ?g!Ryv?g[u-g+@)gxj?gČ?gBvN@*@)g?gJI5?ga?#@)g:L0Q?g)3?g^T1@)gzj9L?ry   gD'D0@)FF)Fr!   )r   r   r   r   r   Z_MATCHESr'   r8   r`   ra   rb   rf   rj   rl   rY   r.   r/   r1   rQ   rP   r5   rL   rM   rx   r   r   Z__classcell__)r)   r   s   @@r   r$   r$   A   s
    6 
)XX,
 	 
)YY,
 	 
*XX-
 	 
*YY-
 	 
2 WV5
 	 
5 XX8
 	 
)YY,
 	 
)YY,
 	 
)YY,
 	 
*YY-
 	 
1YY4
 	
 
*WX-
 	q=H~
# 
# 
#%<N#JB+ >%%
T"0LWSG'
% %r   r$   ))r   ZloggingZdatetimer    Zenumr   Zliquidctl.driver.usbr   Zliquidctl.errorr   Zliquidctl.pmbusr   rK   r   r   Zliquidctl.utilr   Z	getLoggerr   r+   ro   rr   ZMFR_SPECIFIC_D1rO   ZMFR_SPECIFIC_D2rN   ZMFR_SPECIFIC_D8r3   ZMFR_SPECIFIC_EErW   ZMFR_SPECIFIC_F0rv   rR   rS   rT   rU   rc   r	   r    r$   ZCorsairHidPsuDriverr   r   r   <module>rz      s   "    - 0 . 5  


H
% 00 ** ++  00 // 	
&(E:wG8d 8&T &S%L S%n $ r   