def process(): ''' Process and empty command stack. ''' global sender_rte # First check for commands in scenario file checkscen() # Process stack of commands for line, sender_rte in cmdstack: success = True echotext = '' echoflags = bs.BS_OK # Get first argument from command line and check if it's a command cmd, argstring = argparser.getnextarg(line) cmdu = cmd.upper() cmdobj = Command.cmddict.get(cmdu) # If no function is found for 'cmd', check if cmd is actually an aircraft id if not cmdobj and cmdu in bs.traf.id: cmd, argstring = argparser.getnextarg(argstring) argstring = cmdu + " " + argstring # When no other args are parsed, command is POS cmdu = cmd.upper() if cmd else 'POS' cmdobj = Command.cmddict.get(cmdu) # Proceed if a command object was found if cmdobj: try: # Call the command, passing the argument string result = cmdobj(argstring) if result is not None: if isinstance(result, tuple) and result: if len(result) > 1: echotext = result[1] success = result[0] else: # Assume result is a bool indicating the success of the function success = result if not success: if not argstring: echotext = echotext or cmdobj.brieftext() else: echoflags = bs.BS_FUNERR echotext = f'Syntax error: {echotext or cmdobj.brieftext()}' except Exception as e: success = False echoflags = bs.BS_ARGERR header = '' if not argstring else e.args[0] if e.args else 'Argument error.' echotext = f'{header}\nUsage:\n{cmdobj.brieftext()}' # ---------------------------------------------------------------------- # ZOOM command (or use ++++ or -- to zoom in or out) # ---------------------------------------------------------------------- elif cmdu[0] in ("+", "=", "-"): nplus = cmdu.count("+") + cmdu.count("=") # = equals + (same key) nmin = cmdu.count("-") bs.scr.zoom(math.sqrt(2) ** (nplus - nmin), absolute=False) cmdu = 'ZOOM' # ------------------------------------------------------------------- # Command not found # ------------------------------------------------------------------- else: echoflags = bs.BS_CMDERR if not argstring: echotext = f'Unknown command or aircraft: {cmd}' else: echotext = f'Unknown command: {cmd}' # Recording of actual validated commands if success: recorder.savecmd(cmdu, line) elif not sender_rte: echotext = f'{line}\n{echotext}' # Always return on command if echotext: bs.scr.echo(echotext, echoflags) # Clear the processed commands cmdstack.clear()
def cre(self, acid, actype="B744", aclat=52., aclon=4., achdg=None, acalt=0, acspd=0): """ Create one or more aircraft. """ # Determine number of aircraft to create from array length of acid n = 1 if isinstance(acid, str) else len(acid) if isinstance(acid, str): # Check if not already exist if self.id.count(acid.upper()) > 0: return False, acid + " already exists." # already exists do nothing acid = n * [acid] # Adjust the size of all traffic arrays super().create(n) self.ntraf += n if isinstance(actype, str): actype = n * [actype] if isinstance(aclat, (float, int)): aclat = np.array(n * [aclat]) if isinstance(aclon, (float, int)): aclon = np.array(n * [aclon]) # Limit longitude to [-180.0, 180.0] aclon[aclon > 180.0] -= 360.0 aclon[aclon < -180.0] += 360.0 achdg = (refdata.hdg or 0.0) if achdg is None else achdg # Aircraft Info self.id[-n:] = acid self.type[-n:] = actype # Positions self.lat[-n:] = aclat self.lon[-n:] = aclon self.alt[-n:] = acalt self.hdg[-n:] = achdg self.trk[-n:] = achdg # Velocities self.tas[-n:], self.cas[-n:], self.M[-n:] = vcasormach(acspd, acalt) self.gs[-n:] = self.tas[-n:] hdgrad = np.radians(achdg) self.gsnorth[-n:] = self.tas[-n:] * np.cos(hdgrad) self.gseast[-n:] = self.tas[-n:] * np.sin(hdgrad) # Atmosphere self.p[-n:], self.rho[-n:], self.Temp[-n:] = vatmos(acalt) # Wind if self.wind.winddim > 0: applywind = self.alt[-n:] > 50. * ft self.windnorth[-n:], self.windeast[-n:] = self.wind.getdata( self.lat[-n:], self.lon[-n:], self.alt[-n:]) self.gsnorth[ -n:] = self.gsnorth[-n:] + self.windnorth[-n:] * applywind self.gseast[ -n:] = self.gseast[-n:] + self.windeast[-n:] * applywind self.trk[-n:] = np.logical_not(applywind)*achdg + \ applywind*np.degrees(np.arctan2(self.gseast[-n:], self.gsnorth[-n:])) self.gs[-n:] = np.sqrt(self.gsnorth[-n:]**2 + self.gseast[-n:]**2) else: self.windnorth[-n:] = 0.0 self.windeast[-n:] = 0.0 # Traffic autopilot settings self.selspd[-n:] = self.cas[-n:] self.aptas[-n:] = self.tas[-n:] self.selalt[-n:] = self.alt[-n:] # Display information on label self.label[-n:] = n * [['', '', '', 0]] # Miscallaneous self.coslat[-n:] = np.cos(np.radians( aclat)) # Cosine of latitude for flat-earth aproximations self.eps[-n:] = 0.01 # Finally call create for child TrafficArrays. This only needs to be done # manually in Traffic. self.create_children(n) # Record as individual CRE commands for repeatability #print(self.ntraf-n,self.ntraf) for j in range(self.ntraf - n, self.ntraf): # Reconstruct CRE command line = "CRE " + ",".join([ self.id[j], self.type[j], str(self.lat[j]), str(self.lon[j]), str(round(self.trk[j])), str(round(self.alt[j] / ft)), str(round(self.cas[j] / kts)) ]) # Savecmd(cmd,line): line is saved, cmd is used to prevent recording PAN & ZOOM commands and CRE # So insert a dummy command to record the line savecmd("---", line)
def process(from_pcall=None): ''' Sim-side stack processing. ''' # First check for commands in scenario file if from_pcall is None: checkscen() # Process stack of commands for cmdline in Stack.commands(from_pcall): success = True echotext = '' echoflags = bs.BS_OK # Get first argument from command line and check if it's a command cmd, argstring = argparser.getnextarg(cmdline) cmdu = cmd.upper() cmdobj = Command.cmddict.get(cmdu) # If no function is found for 'cmd', check if cmd is actually an aircraft id if not cmdobj and cmdu in bs.traf.id: cmd, argstring = argparser.getnextarg(argstring) argstring = cmdu + " " + argstring # When no other args are parsed, command is POS cmdu = cmd.upper() if cmd else 'POS' cmdobj = Command.cmddict.get(cmdu) # Proceed if a command object was found if cmdobj: try: # Call the command, passing the argument string success, echotext = cmdobj(argstring) if not success: if not argstring: echotext = echotext or cmdobj.brieftext() else: echoflags = bs.BS_FUNERR echotext = f'Syntax error: {echotext or cmdobj.brieftext()}' except ArgumentError as e: success = False echoflags = bs.BS_ARGERR header = '' if not argstring else e.args[0] if e.args else 'Argument error.' echotext = f'{header}\nUsage:\n{cmdobj.brieftext()}' except Exception as e: echoflags = bs.BS_FUNERR header = '' if not argstring else e.args[0] if e.args else 'Function error.' echotext = f'Error calling function implementation of {cmdu}: {header}\n' + \ 'Traceback printed to terminal.' traceback.print_exc() # ---------------------------------------------------------------------- # ZOOM command (or use ++++ or -- to zoom in or out) # ---------------------------------------------------------------------- elif cmdu[0] in ("+", "=", "-"): # = equals + (same key) nplus = cmdu.count("+") + cmdu.count("=") nmin = cmdu.count("-") bs.scr.zoom(math.sqrt(2) ** (nplus - nmin), absolute=False) cmdu = 'ZOOM' # ------------------------------------------------------------------- # Command not found # ------------------------------------------------------------------- elif Stack.sender_rte is None: # Command came from scenario file: assume it's a gui/client command and send it on forward() else: success = False echoflags = bs.BS_CMDERR if not argstring: echotext = f'Unknown command or aircraft: {cmd}' else: echotext = f'Unknown command: {cmd}' # Recording of actual validated commands if success: recorder.savecmd(cmdu, cmdline) elif not Stack.sender_rte: echotext = f'{cmdline}\n{echotext}' # Always return on command if echotext: bs.scr.echo(echotext, echoflags) # Clear the processed commands if from_pcall is None: Stack.clear()