
    hx                         S SK r S SKrS SKrS SKrS SKJrJrJr  S SKJ	r	J
r
  \R                  " \5      r " S S5      rg)    N)DictTypeAny)DriverPluginCountermeasurePluginc                       \ rS rSrSrS\4S jrS rS\S\4S jr	S\S	\
4S
 jrS\S	\
4S jrS\S\4S jrS\S\4S jrSrg)PluginManager   uM   
插件管理器，负责加载和管理驱动插件与反制动作插件。
plugin_dirsc                 ,    Xl         0 U l        0 U l        g )N)r   driverscountermeasures)selfr   s     core/plugin_manager.py__init__PluginManager.__init__   s    &68FH    c                 h   U R                    GHm  n[        R                  R                  U5      (       d  [        R                  SU S35        MC  [        R                  R                  US5      n[        R                  R                  U5      (       a  U R                  X5        M   [        R                  " U5       H  n[        R                  R                  X5      n[        R                  R                  U5      (       d  MH  [        R                  R                  US5      n[        R                  R                  U5      (       a  U R                  XE5        M  [        R                  SU S35        M     GMp     g! [         a'  n[        R                  SU SU 35         SnAGM  SnAff = f)	u   扫描并加载所有插件zPlugin directory z does not exist.zplugin.jsonzPlugin config z not found.zError scanning directory : N)r   ospathisdirloggerwarningjoinexists_load_plugin_from_configlistdirdebugOSErrorerror)r   
plugin_dirplugin_config_pathitem	item_pathsub_plugin_config_pathes          r   load_pluginsPluginManager.load_plugins   s9   **J77==,,!2:,>NOP "$j-!Hww~~011--jM
LJJz2D "Z >Iww}}Y//13i1W.77>>*@AA 99)\"LL>:P9QQ\)]^ 3 +*  L8BqcJKKLs    (AF A4F  
F1
F,,F1r"   r#   c                     [        USSS9 n[        R                  " U5      nSSS5        WR                  S5      nUS	:X  a  U R                  X5        gUS
:X  a  U R                  X5        g[        R                  SU SU 35        g! , (       d  f       Nk= f! [        R                   a%  n[        R                  SU SU 35         SnAgSnAf[         a%  n[        R                  SU SU 35         SnAgSnAff = f)u!   从配置文件加载单个插件rzutf-8)encodingNzError decoding JSON from r   zError reading typedrivercountermeasurezUnknown plugin type 'z' in )openjsonloadJSONDecodeErrorr   r!   	Exceptionget_load_driver_plugin_load_countermeasure_pluginr   )r   r"   r#   fconfigr'   plugin_types          r   r   &PluginManager._load_plugin_from_config.   s    	(#@A1 A jj(("$$Z8,,,,Z@NN2;-uEWDXYZ A@## 	LL45G4H1#NO 	LL>*<)=RsCD	s?   B B	B 	
BB B D .CD C;;D r9   c                 |   UR                  S5      nUR                  S5      nU(       a  U(       d  [        R                  SU 35        g UR                  SS5      u  pV[        R
                  R                  U[        R                  R                  X S35      5      nUc  [        R                  SU S	U 35        g[        R
                  R                  U5      nUR                  R                  U5        [        X5      n	[        U	[        5      (       a'  XR                   U'   [        R#                  S
U 35        g[        R                  SU S35        g! [$        [&        4 a%  n
[        R                  SU SU
 35         Sn
A
gSn
A
f[(         a%  n
[        R                  SU SU
 35         Sn
A
gSn
A
ff = f)u   加载驱动插件nameentry_pointz Invalid driver plugin config in N.   .pyz(Failed to create spec for driver plugin  from zLoaded driver plugin: Plugin z+ does not implement DriverPlugin interface.zFailed to load driver plugin r   z'Unexpected error loading driver plugin )r5   r   r!   rsplit	importlibutilspec_from_file_locationr   r   r   module_from_specloaderexec_modulegetattr
issubclassr   r   infoImportErrorAttributeErrorr4   )r   r"   r9   r=   r>   module_name
class_namespecmoduledriver_classr'   s              r   r6   !PluginManager._load_driver_pluginB   st   zz&!jj/;LL;J<HI	P&1&8&8a&@#K>>99+rww||T^boor`sGtuD|GvVT^S_`a^^44T:FKK##F+"66L,55%1T"4TF;<wtf,WXY^, 	FLL8bDEE 	PLLB4&1#NOO	P2   A2E >B E ?E F;)F		F;F66F;c                 |   UR                  S5      nUR                  S5      nU(       a  U(       d  [        R                  SU 35        g UR                  SS5      u  pV[        R
                  R                  U[        R                  R                  X S35      5      nUc  [        R                  SU S	U 35        g[        R
                  R                  U5      nUR                  R                  U5        [        X5      n	[        U	[        5      (       a'  XR                   U'   [        R#                  S
U 35        g[        R                  SU S35        g! [$        [&        4 a%  n
[        R                  SU SU
 35         Sn
A
gSn
A
f[(         a%  n
[        R                  SU SU
 35         Sn
A
gSn
A
ff = f)u   加载反制动作插件r=   r>   z(Invalid countermeasure plugin config in Nr?   r@   rA   z0Failed to create spec for countermeasure plugin rB   zLoaded countermeasure plugin: rC   z3 does not implement CountermeasurePlugin interface.z%Failed to load countermeasure plugin r   z/Unexpected error loading countermeasure plugin )r5   r   r!   rD   rE   rF   rG   r   r   r   rH   rI   rJ   rK   rL   r   r   rM   rN   rO   r4   )r   r"   r9   r=   r>   rP   rQ   rR   rS   cm_classr'   s              r   r7   )PluginManager._load_countermeasure_plugin_   s|   zz&!jj/;LLCJ<PQ	X&1&8&8a&@#K>>99+rww||T^boor`sGtuD|OPTvU[\f[ghi^^44T:FKK##F+v2H($899-5$$T*<TFCDwtf,_`a^, 	NLL@bLMM 	XLLJ4&PRSTRUVWW	XrV   r=   returnc                 V    U R                   R                  U5      nU(       a  U" 5       $ g)u   获取驱动实例N)r   r5   )r   r=   rT   s      r   
get_driverPluginManager.get_driver|   s$    ||''->!r   c                 V    U R                   R                  U5      nU(       a  U" 5       $ g)u   获取反制动作实例N)r   r5   )r   r=   rX   s      r   get_countermeasure PluginManager.get_countermeasure   s&    ''++D1:r   )r   r   r   N)__name__
__module____qualname____firstlineno____doc__listr   r(   strr   dictr6   r7   r   r\   r   r_   __static_attributes__ r   r   r	   r	      s    ID I
L4[3 [C [(Pc P4 P:Xc X4 X:s | s /C r   r	   )r   r1   rE   loggingtypingr   r   r   pluginsr   r   	getLoggerra   r   r	   rj   r   r   <module>ro      s8    	    " " 6 
		8	$} }r   