1
1
import sys
2
2
import time
3
3
import socket
4
- from datetime import datetime , timezone
4
+ from datetime import datetime , timezone , timedelta
5
5
import ntplib
6
6
import threading
7
7
import pyuipc
36
36
"Prepar3D v4"
37
37
]
38
38
39
+ SIMULATOR_XPLANE_ID = 100
40
+ SIMULATOR_XPLANE = "X Plane"
41
+ SIMULATOR_XPLANE_YEAR_DELTA = 7
42
+
39
43
40
44
class OffsetSet :
41
45
def __init__ (self , offsets ):
@@ -86,13 +90,21 @@ def connect_pyuipc(self):
86
90
print (exc )
87
91
return None
88
92
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
+ })
90
97
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 } '
96
108
97
109
return True
98
110
@@ -242,8 +254,12 @@ def sync_thread_runner(self, restart=0):
242
254
"TIME_MINUTE" : [0x023C , "b" ],
243
255
"DATE_DAY" : [0x023D , "b" ],
244
256
"DATE_MONTH" : [0x0242 , "b" ],
245
- "DATE_YEAR" : [0x024A , "H" ],
257
+ "DATE_YEAR" : [0x0240 , "H" ], # Fixed from local
246
258
}
259
+
260
+ if self .fs_sync .pyuipc_open == SIMULATOR_XPLANE_ID :
261
+ offsets ["DAY_OF_YEAR" ] = [0x023E , "h" ]
262
+
247
263
self .time_offsets = self .fs_sync .create_offset_set (offsets )
248
264
249
265
try :
@@ -262,12 +278,13 @@ def sync_routine_loop(self):
262
278
263
279
data = data_delta [0 ]
264
280
delta = data_delta [1 ]
281
+ datetime = data_delta [2 ]
265
282
266
283
self .mw_emit ([self .gui .main_window .ui .sim_time_hour .setText , "{:02d}" .format (data ["TIME_HOUR" ])])
267
284
self .mw_emit ([self .gui .main_window .ui .sim_time_seperator .setText , str (two_dots )])
268
285
self .mw_emit ([self .gui .main_window .ui .sim_time_minute .setText , "{:02d}" .format (data ["TIME_MINUTE" ])])
269
286
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' )])
271
288
self .mw_emit ([self .gui .main_window .ui .sim_time_second .setToolTip , "ε: ±{}s Δ: {}s" .format (30 , int (delta ))])
272
289
# print(data)
273
290
@@ -278,11 +295,19 @@ def sync_sim(self, force=False):
278
295
Returns initial data if no sync.
279
296
Returns new data if there has been sync.
280
297
"""
298
+ if not self .fs_sync .pyuipc_open :
299
+ return
281
300
282
301
try :
283
302
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
+
284
310
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" ])
286
311
delta = (now - time_from_data ).total_seconds ()
287
312
except ValueError as exc :
288
313
# ValueError generally thrown when FSUIPC is reporting year out of range.
@@ -302,23 +327,29 @@ def sync_sim(self, force=False):
302
327
else :
303
328
if now .second > 3 :
304
329
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 ]
306
331
307
332
self .time_offsets .write ("TIME_SECOND" , 0 )
308
333
309
334
print ("DOING A ZULU TIME SYNC." )
310
335
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 )
316
347
317
348
self .gui .remove_message (0 , 1 ) # Remove will sync message
318
349
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
320
351
321
- return [data , delta ]
352
+ return [data , delta , time_from_data ]
322
353
323
354
324
355
if __name__ == "__main__" :
0 commit comments