class Simulation(QObject): # ========================================================================= # Settings # ========================================================================= # Simulation timestep [seconds] simdt = settings.simdt # Simulation loop update rate [Hz] sys_rate = settings.sim_update_rate # simulation modes init, op, hold, end = range(4) # ========================================================================= # Functions # ========================================================================= def __init__(self, gui, navdb): super(Simulation, self).__init__() print 'Initializing multi-threaded simulation' self.mode = Simulation.init self.samplecount = 0 self.sysdt = 1000 / self.sys_rate # Set starting system time [milliseconds] self.syst = 0.0 # Starting simulation time [seconds] self.simt = 0.0 # Flag indicating running at fixed rate or fast time self.ffmode = False self.ffstop = None # Simulation objects self.screenio = ScreenIO(self) self.traf = Traffic(navdb) self.stack = Commandstack(self, self.traf, self.screenio) self.telnet_in = StackTelnetServer(self.stack) self.navdb = navdb # Metrics self.metric = None # self.metric = Metric() self.beastfeed = Modesbeast(self.stack, self.traf) #self.scenfile='scenariotest.scn' def moveToThread(self, target_thread): self.screenio.moveToThread(target_thread) self.telnet_in.moveToThread(target_thread) #self.beastfeed.moveToThread(target_thread) super(Simulation, self).moveToThread(target_thread) def doWork(self): # Start the telnet input server for stack commands self.telnet_in.start() self.syst = int(time.time() * 1000.0) self.fixdt = self.simdt self.fastforward() #Alexander. Always run simulations in fast-time if len(sys.argv)>1: #Alexander self.stack.openfile(str(sys.argv[1]) + '.scn') #Alexander. Open .scn file automatically while not self.mode == Simulation.end: # Timing bookkeeping self.samplecount += 1 # Update the Mode-S beast parsing self.beastfeed.update() # TODO: what to do with init if self.mode == Simulation.init: self.mode = Simulation.op if self.mode == Simulation.op: self.stack.checkfile(self.simt) # Always update stack self.stack.process(self, self.traf, self.screenio) if self.mode == Simulation.op: self.traf.update(self.simt, self.simdt) # Update metrics if self.metric is not None: self.metric.update(self, self.traf) # Update time for the next timestep self.simt += self.simdt if self.simt>50E3 and len(sys.argv)>1: #Alexander. Stop simulation if simt larger than 50000 s. self.stop() # Process Qt events QCoreApplication.processEvents() # When running at a fixed rate, increment system time with sysdt and calculate remainder to sleep if not self.ffmode: self.syst += self.sysdt remainder = self.syst - int(1000.0 * time.time()) if remainder > 0: QThread.msleep(remainder) elif self.ffstop is not None and self.simt >= self.ffstop: self.start() def stop(self): self.mode = Simulation.end self.screenio.postQuit() def start(self): if self.ffmode: self.syst = int(time.time() * 1000.0) self.ffmode = False self.mode = self.op def pause(self): self.mode = self.hold def reset(self): self.simt = 0.0 self.mode = self.init self.traf.reset(self.navdb) def fastforward(self, nsec=None): self.ffmode = True if nsec is not None: self.ffstop = self.simt + nsec else: self.ffstop = None def datafeed(self, flag): if flag == "ON": self.beastfeed.connectToHost(settings.modeS_host, settings.modeS_port) if flag == "OFF": self.beastfeed.disconnectFromHost()
class Simulation(QObject): # ========================================================================= # Settings # ========================================================================= # Simulation timestep [seconds] simdt = settings.simdt # Simulation loop update rate [Hz] sys_rate = settings.sim_update_rate # Flag indicating running at fixed rate or fast time run_fixed = True # simulation modes init, op, hold, end = range(4) # ========================================================================= # Functions # ========================================================================= def __init__(self, gui, navdb): super(Simulation, self).__init__() self.mode = Simulation.init self.samplecount = 0 self.sysdt = 1000 / self.sys_rate # Simulation objects self.screenio = ScreenIO(self) self.traf = Traffic(navdb) self.navdb = navdb # Metrics self.metric = None # self.metric = Metric() # Stack ties it all together self.stack = Commandstack(self, self.traf, self.screenio) print 'Initializing multi-threaded simulation' def moveToThread(self, target_thread): self.screenio.moveToThread(target_thread) super(Simulation, self).moveToThread(target_thread) def doWork(self): # Set starting system time [milliseconds] self.syst = int(time.time() * 1000.0) # Set starting simulation time [seconds] self.simt = 0.0 while not self.mode == Simulation.end: # Timing bookkeeping self.samplecount += 1 # TODO: what to do with init if self.mode == Simulation.init: self.mode = Simulation.op if self.mode == Simulation.op: self.stack.checkfile(self.simt) # Always update stack self.stack.process(self, self.traf, self.screenio) if self.mode == Simulation.op: self.traf.update(self.simt, self.simdt) # Update metrics if self.metric is not None: self.metric.update(self, self.traf) # Update time for the next timestep self.simt += self.simdt # Process Qt events QCoreApplication.processEvents() # When running at a fixed rate, increment system time with sysdt and calculate remainder to sleep if self.run_fixed: self.syst += self.sysdt remainder = self.syst - int(1000.0 * time.time()) if remainder > 0: QThread.msleep(remainder) def stop(self): self.mode = Simulation.end # TODO: Communicate quit signal to main thread def start(self): self.mode = Simulation.op def pause(self): self.mode = Simulation.hold def reset(self): self.simt = 0.0 self.mode = Simulation.init self.traf.reset(self.navdb)