Skip to content

Commit 89f298e

Browse files
authored
Merge pull request #3 from shotwn/XPlane
X Plane Support
2 parents d77ceec + dc5443d commit 89f298e

File tree

3 files changed

+52
-19
lines changed

3 files changed

+52
-19
lines changed

_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = "0.1.3-alpha"
1+
version = "0.1.4-alpha"
22

33
if __name__ == "__main__":
44
print(version)

gui/gui.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ def __init__(self, root):
5454
}
5555
""")
5656
self.tray_actions = {}
57+
self.tray_actions["sync_now"] = menu.addAction("Sync Now")
58+
self.tray_actions["sync_now"].triggered.connect(lambda: self.root.sync_sim(force=True))
5759
self.tray_actions["hide_show"] = menu.addAction("Hide")
5860
self.tray_actions["hide_show"].triggered.connect(self.hide)
5961
self.tray_actions["exit"] = menu.addAction("Exit")

main.py

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import time
33
import socket
4-
from datetime import datetime, timezone
4+
from datetime import datetime, timezone, timedelta
55
import ntplib
66
import threading
77
import pyuipc
@@ -36,6 +36,10 @@
3636
"Prepar3D v4"
3737
]
3838

39+
SIMULATOR_XPLANE_ID = 100
40+
SIMULATOR_XPLANE = "X Plane"
41+
SIMULATOR_XPLANE_YEAR_DELTA = 7
42+
3943

4044
class OffsetSet:
4145
def __init__(self, offsets):
@@ -86,13 +90,21 @@ def connect_pyuipc(self):
8690
print(exc)
8791
return None
8892

89-
sim_offset = self.create_offset_set({'SIM_VERSION': [0x3308, 'b']})
93+
sim_offset = self.create_offset_set({
94+
'SIM_VERSION': [0x3308, 'b'],
95+
'IS_XPLANE': [0x6FFF, 'b']
96+
})
9097
result = sim_offset.read()
91-
self.pyuipc_open = result['SIM_VERSION']
92-
try:
93-
self.opened_sim = SIMULATORS[self.pyuipc_open]
94-
except IndexError:
95-
self.opened_sim = f'Unknown Sim: {self.pyuipc_open}'
98+
99+
if result['IS_XPLANE']:
100+
self.pyuipc_open = SIMULATOR_XPLANE_ID
101+
self.opened_sim = SIMULATOR_XPLANE
102+
else:
103+
self.pyuipc_open = result['SIM_VERSION']
104+
try:
105+
self.opened_sim = SIMULATORS[self.pyuipc_open]
106+
except IndexError:
107+
self.opened_sim = f'Unknown Sim: {self.pyuipc_open}'
96108

97109
return True
98110

@@ -242,8 +254,12 @@ def sync_thread_runner(self, restart=0):
242254
"TIME_MINUTE": [0x023C, "b"],
243255
"DATE_DAY": [0x023D, "b"],
244256
"DATE_MONTH": [0x0242, "b"],
245-
"DATE_YEAR": [0x024A, "H"],
257+
"DATE_YEAR": [0x0240, "H"], # Fixed from local
246258
}
259+
260+
if self.fs_sync.pyuipc_open == SIMULATOR_XPLANE_ID:
261+
offsets["DAY_OF_YEAR"] = [0x023E, "h"]
262+
247263
self.time_offsets = self.fs_sync.create_offset_set(offsets)
248264

249265
try:
@@ -262,12 +278,13 @@ def sync_routine_loop(self):
262278

263279
data = data_delta[0]
264280
delta = data_delta[1]
281+
datetime = data_delta[2]
265282

266283
self.mw_emit([self.gui.main_window.ui.sim_time_hour.setText, "{:02d}".format(data["TIME_HOUR"])])
267284
self.mw_emit([self.gui.main_window.ui.sim_time_seperator.setText, str(two_dots)])
268285
self.mw_emit([self.gui.main_window.ui.sim_time_minute.setText, "{:02d}".format(data["TIME_MINUTE"])])
269286
self.mw_emit([self.gui.main_window.ui.sim_time_second.setText, "{:02d}".format(data["TIME_SECOND"])])
270-
self.mw_emit([self.gui.main_window.ui.sim_date.setText, "{:02d}.{:02d}.{}".format(data["DATE_DAY"], data["DATE_MONTH"], data["DATE_YEAR"])])
287+
self.mw_emit([self.gui.main_window.ui.sim_date.setText, datetime.strftime('%d.%m.%Y')])
271288
self.mw_emit([self.gui.main_window.ui.sim_time_second.setToolTip, "ε: ±{}s Δ: {}s".format(30, int(delta))])
272289
# print(data)
273290

@@ -278,11 +295,19 @@ def sync_sim(self, force=False):
278295
Returns initial data if no sync.
279296
Returns new data if there has been sync.
280297
"""
298+
if not self.fs_sync.pyuipc_open:
299+
return
281300

282301
try:
283302
data = self.time_offsets.read()
303+
if self.fs_sync.pyuipc_open == SIMULATOR_XPLANE_ID:
304+
data["DATE_YEAR"] += SIMULATOR_XPLANE_YEAR_DELTA
305+
time_from_data = datetime(data["DATE_YEAR"], 1, 1, data["TIME_HOUR"], data["TIME_MINUTE"], second=data["TIME_SECOND"])
306+
time_from_data = time_from_data + timedelta(days=data["DAY_OF_YEAR"])
307+
else:
308+
time_from_data = datetime(data["DATE_YEAR"], data["DATE_MONTH"], data["DATE_DAY"], data["TIME_HOUR"], data["TIME_MINUTE"], second=data["TIME_SECOND"])
309+
284310
now = self.offset + self.get_now()
285-
time_from_data = datetime(data["DATE_YEAR"], data["DATE_MONTH"], data["DATE_DAY"], data["TIME_HOUR"], data["TIME_MINUTE"], second=data["TIME_SECOND"])
286311
delta = (now - time_from_data).total_seconds()
287312
except ValueError as exc:
288313
# ValueError generally thrown when FSUIPC is reporting year out of range.
@@ -302,23 +327,29 @@ def sync_sim(self, force=False):
302327
else:
303328
if now.second > 3:
304329
self.gui.add_message(0, 1, "Will Sync At: {:02d}:{:02d}z".format(now.hour, now.minute + 1))
305-
return [data, delta]
330+
return [data, delta, time_from_data]
306331

307332
self.time_offsets.write("TIME_SECOND", 0)
308333

309334
print("DOING A ZULU TIME SYNC.")
310335

311-
self.time_offsets.write("DATE_YEAR", now.year)
312-
self.time_offsets.write("DATE_MONTH", now.month)
313-
self.time_offsets.write("DATE_DAY", now.day)
314-
self.time_offsets.write("TIME_HOUR", now.hour)
315-
self.time_offsets.write("TIME_MINUTE", now.minute)
336+
if self.fs_sync.pyuipc_open == SIMULATOR_XPLANE_ID:
337+
self.time_offsets.write("DATE_YEAR", now.year - SIMULATOR_XPLANE_YEAR_DELTA)
338+
self.time_offsets.write("DAY_OF_YEAR", int(now.strftime('%j')) - 1)
339+
self.time_offsets.write("TIME_HOUR", now.hour)
340+
self.time_offsets.write("TIME_MINUTE", now.minute)
341+
else:
342+
self.time_offsets.write("DATE_YEAR", now.year)
343+
self.time_offsets.write("DATE_MONTH", now.month)
344+
self.time_offsets.write("DATE_DAY", now.day)
345+
self.time_offsets.write("TIME_HOUR", now.hour)
346+
self.time_offsets.write("TIME_MINUTE", now.minute)
316347

317348
self.gui.remove_message(0, 1) # Remove will sync message
318349
self.gui.add_message(0, 2, "Last Sync: {:02d}:{:02d}:{:02d}z".format(now.hour, now.minute, now.second))
319-
return [self.time_offsets.read(), delta] # Return fresh data
350+
return [self.time_offsets.read(), delta, time_from_data] # Return fresh data
320351

321-
return [data, delta]
352+
return [data, delta, time_from_data]
322353

323354

324355
if __name__ == "__main__":

0 commit comments

Comments
 (0)