Skip to content

Commit 01df594

Browse files
committed
Improved synced methods, separated none-synced methods from synced methods to be compatible with old functions
1 parent c7b8ae1 commit 01df594

1 file changed

Lines changed: 52 additions & 26 deletions

File tree

sharedMemoryAPI.py

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)