@@ -33,7 +33,7 @@ def __init__(self, input_pid):
3333 self .versionCheckMsg = self .versionCheck ()
3434 self .__find_rf2_pid ()
3535 self .players_index = 99
36- self .players_mid = 0
36+ self .players_status = 0
3737 self .LastTele = copy .deepcopy (self .Rf2Tele )
3838 self .LastScor = copy .deepcopy (self .Rf2Scor )
3939 self .data_updating = False
@@ -109,45 +109,74 @@ def __find_rf2_pid(self):
109109 self .rf2_pid = pid
110110 break
111111
112- @staticmethod
113- def playerIndexCheck (input_data ):
112+ def __playersDriverNum (self ):
113+ """ Find the player's driver number """
114+ index_list = copy .deepcopy (self .Rf2Scor .mVehicles )
115+ for _player in range (127 ):
116+ if index_list [_player ].mIsPlayer == 1 :
117+ break
118+ return _player
119+
120+ ###########################################################
121+ # Sync data for local player
122+
123+ def __playerVerified (self , input_data ):
114124 """ Check player index number on one same data piece """
125+ found = False # return false if failed to find player index
115126 for _player in range (127 ): # max 128 players supported by API
116- if input_data .mVehicles [_player ].mIsPlayer == 1 : # use 1 to avoid chance of reading inf or NaN
127+ if input_data .mVehicles [_player ].mIsPlayer == 1 : # use 1 to avoid reading incorrect value
128+ self .players_index = _player
129+ found = True
117130 break
118- return _player
131+ return found
119132
120133 @staticmethod
121- def data_verified (input_data ):
134+ def dataVerified (input_data ):
122135 """ Verify data """
123136 return input_data .mVersionUpdateEnd == input_data .mVersionUpdateBegin
124137
125138 def __infoUpdate (self ):
126- """ Update shared memory data """
139+ """ Update synced player data """
140+ players_mid = 0
141+
127142 while self .data_updating :
128143 data_scor = copy .deepcopy (self .Rf2Scor ) # use deepcopy to avoid data interruption
129- if self .data_verified (data_scor ):
130- self .players_index = self .playerIndexCheck (data_scor ) # update player index
131- self .players_mid = data_scor .mVehicles [self .players_index ].mID # update player mID
132- self .LastScor = data_scor # update scoring data
133-
134144 data_tele = copy .deepcopy (self .Rf2Tele )
135- if self .data_verified (data_tele ):
136- # Compare player mID & sync data
137- if data_tele .mVehicles [self .players_index ].mID == self .players_mid :
138- self .LastTele = data_tele # update synced telemetry data
145+
146+ # Only update if data verified and player index found
147+ if self .dataVerified (data_scor ) and self .__playerVerified (data_scor ):
148+ self .LastScor = copy .deepcopy (data_scor ) # use deepcopy to update scoring data
149+ players_mid = self .LastScor .mVehicles [self .players_index ].mID # update player mID
150+
151+ # Only update if data verified and player mID matches
152+ if self .dataVerified (data_tele ) and data_tele .mVehicles [self .players_index ].mID == players_mid :
153+ self .LastTele = copy .deepcopy (data_tele ) # use deepcopy to update synced telemetry data
154+ self .players_status = self .LastTele .mVehicles [self .players_index ].mIgnitionStarter # update player status
139155
140156 time .sleep (0.01 )
141157 else :
142- print ("sharedmemory updating stopped" )
158+ print ("sharedmemory synced player data updating thread stopped" )
143159
144160 def startUpdating (self ):
145161 """ Start data updating thread """
146162 self .data_updating = True
147163 index_thread = threading .Thread (target = self .__infoUpdate )
148164 index_thread .setDaemon (True )
149165 index_thread .start ()
150- print ("sharedmemory updating started" )
166+ print ("sharedmemory synced player data updating thread started" )
167+
168+ def stopUpdating (self ):
169+ """ Stop data updating thread """
170+ self .data_updating = False
171+ time .sleep (0.2 )
172+
173+ def syncedVehicleTelemetry (self ):
174+ """ Get the variable for the player's vehicle """
175+ return self .LastTele .mVehicles [self .players_index ]
176+
177+ def syncedVehicleScoring (self ):
178+ """ Get the variable for the player's vehicle """
179+ return self .LastScor .mVehicles [self .players_index ]
151180
152181 ###########################################################
153182 # Access functions
@@ -209,7 +238,7 @@ def isAiDriving(self):
209238 """
210239 True: rF2 is running and the player is on track
211240 """
212- return self .Rf2Scor .mVehicles [self .players_index ].mControl == 1
241+ return self .Rf2Scor .mVehicles [self .__playersDriverNum () ].mControl == 1
213242 # who's in control: -1=nobody (shouldn't get this), 0=local player,
214243 # 1=local AI, 2=remote, 3=replay (shouldn't get this)
215244
@@ -220,27 +249,24 @@ def driverName(self):
220249 Get the player's name
221250 """
222251 return Cbytestring2Python (
223- self .Rf2Scor .mVehicles [self .players_index ].mDriverName )
252+ self .Rf2Scor .mVehicles [self .__playersDriverNum () ].mDriverName )
224253
225254 def playersVehicleTelemetry (self ):
226255 """ Get the variable for the player's vehicle """
227- return self .LastTele .mVehicles [self .players_index ]
256+ return self .Rf2Tele .mVehicles [self .__playersDriverNum () ]
228257
229258 def playersVehicleScoring (self ):
230259 """ Get the variable for the player's vehicle """
231- return self .LastScor .mVehicles [self .players_index ]
260+ return self .Rf2Scor .mVehicles [self .__playersDriverNum () ]
232261
233262 def vehicleName (self ):
234263 """
235264 Get the vehicle's name
236265 """
237266 return Cbytestring2Python (
238- self .Rf2Scor .mVehicles [self .players_index ].mVehicleName )
267+ self .Rf2Scor .mVehicles [self .__playersDriverNum () ].mVehicleName )
239268
240269 def closeSimInfo (self ):
241- # Stop data updating thread
242- self .data_updating = False
243- time .sleep (0.2 )
244270 # This didn't help with the errors
245271 try :
246272 # Unassign those objects first
0 commit comments