@@ -28,12 +28,18 @@ class Type(ctypes.Structure):
2828 """
2929 _fields_ = []
3030
31- def __init__ (self , ql : Qiling , label : str ):
31+ def __init__ (self , ql : Qiling , label : str , limit : int = 1 ):
3232 super ().__init__ (ql , label )
3333
3434 self .rtube = queue .Queue ()
3535 self .wtube = queue .Queue ()
3636
37+ self .limit = limit
38+ self .device_list = []
39+
40+ def has_input (self ):
41+ return not self .rtube .empty ()
42+
3743 def send (self , data : bytes ):
3844 """ Send data into the peripheral.
3945
@@ -51,23 +57,39 @@ def recv(self, numb:int = 4096) -> bytes:
5157 data = ql.hw.i2c1.send()
5258 """
5359 data = bytearray ()
54- while not self .wtube . empty () and numb != 0 :
60+ while self .can_recv () and numb != 0 :
5561 data .append (self .wtube .get ())
5662 numb -= 1
5763
58- return bytes (data )
59-
64+ return bytes (data )
65+
6066 def can_recv (self ):
61- return not self .rtube .empty ()
67+ return not self .wtube .empty ()
68+
69+ def send_to_user (self , data : int ):
70+ """ send single byte to user
71+ """
72+
73+ self .wtube .put (data )
6274
6375 def recv_from_user (self ) -> bytes :
6476 """ Read single byte from user input
6577 """
6678
6779 return self .rtube .get ()
6880
69- def send_to_user (self , data : int ):
70- """ send single byte to user
71- """
81+ def connect (self , device ):
82+ if len (self .device_list ) < self .limit :
83+ self .device_list .append (device )
84+
85+ @staticmethod
86+ def device_handler (func ):
87+ def wrapper (self ):
88+ func (self )
89+
90+ if self .device_list and self .can_recv ():
91+ data = self .recv (numb = 1 )
92+ for device in self .device_list :
93+ device .send (data )
7294
73- self . wtube . put ( data )
95+ return wrapper
0 commit comments