1- """ 
1+ ''' 
22@ 2025, Copyright AVIS Engine 
3- """ 
3+ ''' 
44
55import  cv2 
66import  re 
77import  base64 
88import  time 
99import  socket 
1010import  numpy  as  np 
11- from  .  import  utils 
11+ import  utils 
1212
1313__author__  =  "Amirmohammad Zarif" 
1414__email__  =  "amir@avisengine.com" 
1515
1616
17- class  Car :
18-     """ 
17+ class  Car () :
18+     ''' 
1919    AVIS Engine Main Car class 
20- 
20+      
2121    Attributes 
2222    ---------- 
2323
@@ -34,57 +34,47 @@ class Car:
3434        sensors 
3535        current_speed 
3636        sensor_angle 
37-     """  
37+     '''  
3838
39-     #  Attributes to kind of replicate a Pub-sub pattern messaging to request data 
39+     #Attributes to kind of replicate a Pub-sub pattern messaging to request data    
4040    steering_value  =  0 
4141    speed_value  =  0 
4242    sensor_status  =  1 
4343    image_mode  =  1 
4444    get_Speed  =  1 
4545    sensor_angle  =  30 
46- 
46+      
4747    sock  =  socket .socket (socket .AF_INET , socket .SOCK_STREAM )
4848
49-     # Data format for request 
50-     data_arr  =  [
51-         speed_value ,
52-         steering_value ,
53-         image_mode ,
54-         sensor_status ,
55-         get_Speed ,
56-         sensor_angle ,
57-     ]
58-     _data_format  =  (
59-         "Speed:{},Steering:{},ImageStatus:{},SensorStatus:{},GetSpeed:{},SensorAngle:{}" 
60-     )
61-     data_str  =  _data_format .format (
62-         data_arr [0 ], data_arr [1 ], data_arr [2 ], data_arr [3 ], data_arr [4 ], data_arr [5 ]
63-     )
64- 
49+     #Data format for request 
50+     data_arr  =  [speed_value , steering_value , image_mode , sensor_status , get_Speed , sensor_angle ]
51+     _data_format  =  "Speed:{},Steering:{},ImageStatus:{},SensorStatus:{},GetSpeed:{},SensorAngle:{}" 
52+     data_str  =  _data_format .format (data_arr [0 ], data_arr [1 ], data_arr [2 ], data_arr [3 ], data_arr [4 ], data_arr [5 ])
53+     
6554    image  =  None 
6655    sensors  =  None 
6756    current_speed  =  None 
6857
69-     def  connect (self ,  server ,  port ):
70-         """ 
58+     def  connect (self ,server ,port ):
59+         ''' 
7160        Connecting to the simulator (server) 
72-         """  
61+         '''  
7362        try :
7463            self .sock .connect ((server , port ))
7564            self .sock .settimeout (5.0 )
76- 
65+              
7766            print ("connected to " , server , port )
7867            return  True 
7968        except :
8069            print ("Failed to connect to " , server , port )
8170            return  False 
8271
72+   
8373    def  recvall (self , socket ):
84-         """ 
74+         ''' 
8575        Function to receive all the data chunks 
86-         """  
87-         BUFFER_SIZE  =  65536   # Increased buffer size for better performance 
76+         '''  
77+         BUFFER_SIZE  =  131072   # Increased buffer size for better performance 
8878        data  =  bytearray ()  # Use a bytearray for better performance 
8979
9080        while  True :
@@ -93,35 +83,36 @@ def recvall(self, socket):
9383
9484            # Use KMP search to find the <EOF>, KMPSearch() returns -1 if the pattern was not found 
9585            # It is 9 times faster than the simple python search 
96-             if  utils .KMPSearch (b"<EOF>" , data ) >  - 1 :  # Convert "<EOF>" to bytes 
86+             if  utils .KMPSearch (b"<EOF>" , data ) >  - 1 :  # Convert "<EOF>" to bytes                
9787                break 
9888
9989        return  data .decode ("utf-8" )
10090
101-     def  setSteering (self , steering ):
102-         """ 
91+         
92+     def  setSteering (self ,steering ):
93+         ''' 
10394        Setting the steering of the car 
104- 
95+          
10596        Parameters 
10697        ---------- 
10798            steering : int 
10899                Steering value in degree 
109-         """  
100+         '''  
110101        self .steering_value  =  steering 
111102        self .image_mode  =  0 
112103        self .sensor_status  =  0 
113104        self .updateData ()
114105        self .sock .sendall (self .data_str .encode ("utf-8" ))
115106        time .sleep (0.01 )
116107
117-     def  setSpeed (self ,  speed ):
118-         """ 
108+     def  setSpeed (self ,speed ):
109+         ''' 
119110        Setting the speed of the car 
120- 
111+          
121112        Parameters 
122113        ---------- 
123114            speed : int 
124-         """  
115+         '''  
125116        self .speed_value  =  speed 
126117        self .image_mode  =  0 
127118        self .sensor_status  =  0 
@@ -130,107 +121,100 @@ def setSpeed(self, speed):
130121        time .sleep (0.01 )
131122
132123    def  setSensorAngle (self , angle ):
133-         """ 
124+         ''' 
134125        Setting the angle between each sensor ray 
135- 
126+          
136127        Parameters 
137128        ---------- 
138129            angle : int 
139130                In degrees 
140-         """  
131+         '''  
141132
142133        self .image_mode  =  0 
143134        self .sensor_status  =  0 
144135        self .sensor_angle  =  angle 
145136        self .updateData ()
146137        self .sock .sendall (self .data_str .encode ("utf-8" ))
147- 
138+          
148139    def  getData (self ):
149-         """ 
140+         ''' 
150141        Requesting for the data from the simulator 
151-         """  
142+         '''  
152143        self .image_mode  =  1 
153144        self .sensor_status  =  1 
154145        self .updateData ()
155146        self .sock .sendall (self .data_str .encode ("utf-8" ))
156147
157148        receive  =  self .recvall (self .sock )
158149
159-         imageTagCheck  =  re .search (r" <image>(.*?)</image>" receive )
160-         sensorTagCheck  =  re .search (r" <sensor>(.*?)</sensor>" receive )
161-         speedTagCheck  =  re .search (r" <speed>(.*?)</speed>" receive )
162- 
150+         imageTagCheck  =  re .search (' <image>(.*?)<\ /image>' receive )
151+         sensorTagCheck  =  re .search (' <sensor>(.*?)<\ /sensor>' receive )
152+         speedTagCheck  =  re .search (' <speed>(.*?)<\ /speed>' receive )             
153+          
163154        try :
164-             if   imageTagCheck :
155+             if ( imageTagCheck ) :
165156                imageData  =  imageTagCheck .group (1 )
166157                im_bytes  =  base64 .b64decode (imageData )
167-                 im_arr  =  np .frombuffer (
168-                     im_bytes , dtype = np .uint8 
169-                 )  # im_arr is one-dim Numpy array 
158+                 im_arr  =  np .frombuffer (im_bytes , dtype = np .uint8 )  # im_arr is one-dim Numpy array 
170159                imageOpenCV  =  cv2 .imdecode (im_arr , flags = cv2 .IMREAD_COLOR )
171160                self .image  =  imageOpenCV 
172- 
173-             if   sensorTagCheck :
161+              
162+             if ( sensorTagCheck ) :
174163                sensorData  =  sensorTagCheck .group (1 )
175-                 sensor_arr  =  re .findall (r "\d+"sensorData )
176-                 sensor_int_arr  =  list (map (int , sensor_arr ))
164+                 sensor_arr  =  re .findall ("\d+" , sensorData )
165+                 sensor_int_arr  =  list (map (int , sensor_arr ))  
177166                self .sensors  =  sensor_int_arr 
178167            else :
179-                 self .sensors  =  [1500 ,  1500 ,  1500 ]
168+                 self .sensors  =  [1500 ,1500 ,1500 ]
180169
181-             if   speedTagCheck :
170+             if ( speedTagCheck ) :
182171                current_sp  =  speedTagCheck .group (1 )
183172                self .current_speed  =  int (current_sp )
184173            else :
185174                self .current_speed  =  0 
186175        except :
187176            print ("Failed to receive data" )
188177
178+ 
189179    def  getImage (self ):
190-         """ 
180+         ''' 
191181        Returns the image from the camera 
192-         """  
182+         '''  
193183        return  self .image 
194184
195185    def  getSensors (self ):
196-         """ 
186+         ''' 
197187        Returns the sensor data 
198-             A List: 
188+             A List:   
199189                [Left Sensor: int, Middle Sensor: int, Right Sensor: int] 
200-         """  
190+         '''  
201191        return  self .sensors 
202- 
192+      
203193    def  getSpeed (self ):
204-         """ 
194+         ''' 
205195        Returns the speed of the car 
206-         """  
196+         '''  
207197        return  self .current_speed 
208- 
198+      
209199    def  updateData (self ):
210-         """ 
200+         ''' 
211201        Updating the request data array and data string 
212-         """ 
213-         data  =  [
214-             self .speed_value ,
215-             self .steering_value ,
216-             self .image_mode ,
217-             self .sensor_status ,
218-             self .get_Speed ,
219-             self .sensor_angle ,
220-         ]
221-         self .data_str  =  self ._data_format .format (
222-             data [0 ], data [1 ], data [2 ], data [3 ], data [4 ], data [5 ]
223-         )
224- 
202+         ''' 
203+         data  =  [self .speed_value ,self .steering_value ,self .image_mode ,self .sensor_status ,self .get_Speed , self .sensor_angle ]
204+         self .data_str  =  self ._data_format .format (data [0 ], data [1 ], data [2 ], data [3 ], data [4 ], data [5 ])
205+         
225206    def  stop (self ):
226-         """ 
207+         ''' 
227208        Stoping the car and closing the socket 
228-         """  
209+         '''  
229210        self .setSpeed (0 )
230211        self .setSteering (0 )
231212        self .sock .sendall ("stop" .encode ("utf-8" ))
232213        self .sock .close ()
233214        print ("Process stopped successfully!" )
234- 
215+      
235216    def  __del__ (self ):
236217        self .stop ()
218+     
219+         
220+         
0 commit comments