def setUp(self): """Set up some data that is reused in many tests""" self.manager = None self.dialect = 'ardupilotmega' self.version = 2.0 self.mod = getpymavlinkpackage(self.dialect, self.version) self.mavUAS = self.mod.MAVLink(self, srcSystem=4, srcComponent=0, use_native=False) self.VehA = Vehicle(self.loop, "VehA", 255, 0, 4, 0, self.dialect, self.version) self.VehA.onPacketTxAttach(self.vehSendFunc) self.VehA.hasInitial = True # The PaGS settings dir (just in source dir) self.settingsdir = os.path.join(os.getcwd(), ".PaGS") if not os.path.exists(self.settingsdir): os.makedirs(self.settingsdir) self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.onPktTxAttach(self.txcallback) self.manager.addModule("internalPrinterModule")
def test_command(self): """Test the loading and execution of user commands in modules""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallbackMany) self.manager.onVehGetAttach(self.getVehicleCallbackMany) self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") # load module self.manager.addModule("templateModule") # execute a command self.manager.onModuleCommandCallback( "VehB", "template do_stuff 1 \"the rest\"") # and invalid command self.manager.onModuleCommandCallback("VehB", "template do_nothing") # Command to not-initialised vehicle self.manager.onModuleCommandCallback( "VehC", "template do_stuff 1 \"the rest\"") # and assert assert self.manager.multiModules['templateModule'].printedout[ "VehB"] == "Command not found: template do_nothing" assert self.manager.multiModules['templateModule'].calledStuff["VehB"] == "1,the rest" # VehC was not initialised, so the command should not be passed assert self.manager.multiModules['templateModule'].printedout[ "VehC"] == "Cannot send command to vehicle - no packets received on link" assert "VehC" not in self.manager.multiModules['templateModule'].calledStuff
def setUp(self): """Set up some data that is reused in many tests""" self.manager = None self.dialect = 'ardupilotmega' self.version = 2.0 self.mod = getpymavlinkpackage(self.dialect, self.version) self.mavUAS = self.mod.MAVLink(self, srcSystem=4, srcComponent=0, use_native=False) self.VehA = Vehicle(self.loop, "VehA", 255, 0, 4, 0, self.dialect, self.version) self.VehA.onPacketTxAttach(self.vehSendFunc) self.txPackets = {} self.txVehPackets = {} self.manager = moduleManager.moduleManager(self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.onPktTxAttach(self.txcallback) self.manager.addModule("PaGS.modules.internalPrinterModule")
def __init__(self, dialect, mav, source_system, source_component, nogui, multi, loop, initialModules): """ Start up PaGS """ self.source_system = source_system self.source_component = source_component self.dialect = dialect self.mav = mav # The PaGS settings dir self.settingsdir = os.path.join(str(Path.home()), ".PaGS") if not os.path.exists(self.settingsdir): os.makedirs(self.settingsdir) # logging.basicConfig(level=logging.DEBUG) self.loop = loop # Start the connection maxtrix self.connmtrx = ConnectionManager(self.loop, dialect, mav, source_system, source_component) # Dict of vehicles self.allvehicles = VehicleManager(self.loop) # Module manager self.modules = moduleManager.moduleManager(self.loop, self.settingsdir, not nogui) # event links from connmaxtrix -> vehicle manager self.connmtrx.onPacketAttach(self.allvehicles.onPacketRecieved) # event links from vehicle manager -> connmatrix self.allvehicles.onPacketBufTxAttach(self.connmtrx.outgoingPacket) asyncio.ensure_future( self.allvehicles.onLinkAddAttach(self.connmtrx.addVehicleLink)) asyncio.ensure_future( self.allvehicles.onLinkRemoveAttach(self.connmtrx.removeLink)) # event links from module manager -> vehicle manager self.modules.onPktTxAttach(self.allvehicles.send_message) self.modules.onVehListAttach(self.allvehicles.get_vehiclelist) self.modules.onVehGetAttach(self.allvehicles.get_vehicle) # event links vehicle manager -> module manager self.allvehicles.onAddVehicleAttach(self.modules.addVehicle) self.allvehicles.onRemoveVehicleAttach(self.modules.removeVehicle) self.allvehicles.onPacketRxAttach(self.modules.incomingPacket) # Need to load initial modules for m in initialModules: self.modules.addModule(m) # redirect stdout to the terminal printer, if loaded # Thus print() can be used properly if self.modules.multiModules.get('modules.terminalModule'): sys.stdout = RedirPrint( self.modules.multiModules.get('modules.terminalModule').print)
def test_guiStart(self): """Simple test of the GUI startup""" # need to reset for handling gui self.manager = moduleManager.moduleManager(self.loop, self.dialect, self.version, True) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.onPktTxAttach(self.txcallback) self.manager.addModule("PaGS.modules.internalPrinterModule") self.manager.addModule("PaGS.modules.paramModule")
def test_cmd_do_stuff(self): """Test the do_stuff() command""" self.manager = moduleManager.moduleManager(self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.addModule("PaGS.modules.templateModule") # execute a command self.manager.onModuleCommandCallback( "VehA", "template do_stuff 1 \"the rest\"") # and assert assert self.manager.multiModules[ 'PaGS.modules.templateModule'].calledStuff["VehA"] == "1,the rest"
async def test_startup(self): """ Test that we can cleanly startup and shutdown """ # Start the connection maxtrix self.connmtrx = ConnectionManager( self.loop, self.dialect, self.version, 0, 0) # Dict of vehicles self.allvehicles = VehicleManager(self.loop) # Module manager self.allModules = moduleManager( self.loop, self.dialect, self.version, False) # and link them all together await self.doEventLinkages()
async def test_singleConnection(self): """ Test that we can get a packet with a single vehicle with single connection """ # Start the connection maxtrix self.connmtrx = ConnectionManager( self.loop, self.dialect, self.version, 0, 0) # Dict of vehicles self.allvehicles = VehicleManager(self.loop) # Module manager self.allModules = moduleManager( self.loop, self.dialect, self.version, False) # and link them all together await self.doEventLinkages() # add a link await self.allvehicles.add_vehicle("VehA", 255, 0, 4, 0, self.dialect, self.version, 'tcpserver:127.0.0.1:15000') # Start a remote connection (TCP) self.remoteClient = TCPConnection(rxcallback=self.newpacketcallback, dialect=self.dialect, mavversion=self.version, srcsystem=0, srccomp=0, server=False, name=self.cname) await asyncio.sleep(0.3) await self.loop.create_connection(lambda: self.remoteClient, self.ip, self.port) # wait for 0.02 sec await asyncio.sleep(0.02) # send a heartbeat packet pkt = self.mod.MAVLink_heartbeat_message( 5, 4, 0, 0, 0, int(self.version)) self.remoteClient.send_data(pkt.pack(self.mav, force_mavlink1=False)) await asyncio.sleep(0.02) self.remoteClient.close() # assert the vehicle recieved the packet assert len(self.allvehicles.get_vehicle("VehA").latestPacketDict) == 1 assert self.allvehicles.get_vehicle("VehA").latestPacketDict[0] == pkt
async def test_addremoveModule(self): """Test adding and removal of module""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.addModule("templateModule") assert len(self.manager.multiModules) == 1 assert "template" in self.manager.commands assert len(self.manager.commands["template"]) == 2 await self.manager.removeModule("templateModule") assert len(self.manager.multiModules) == 0 assert "template" not in self.manager.commands assert "templateModule" not in self.manager.printers
def test_printer(self): """Test the printer function (output) for the modules""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallbackMany) self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") # load module self.manager.addModule("templateModule") # print some text self.manager.printVeh("VehB", "test text") self.manager.printVeh("VehC", "test text2") assert self.manager.multiModules['templateModule'].printedout["VehB"] == "test text" assert self.manager.multiModules['templateModule'].printedout["VehC"] == "test text2"
def test_addRemoveVehicleAfterModule(self): """Test adding and removing vehicles prior to module loading""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallbackMany) # self.manager.onVehGetAttach(self.getVehicleCallback) # simulate some vehicles being added self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") # and being removed self.manager.removeVehicle("VehB") # load module self.manager.addModule("templateModule") assert self.manager.multiModules['templateModule'].theVeh == [ "VehA", "VehC"]
def test_addremoveModule(self): """Test adding and removal of module""" self.manager = moduleManager.moduleManager( self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.addModule("PaGS.modules.templateModule") assert len(self.manager.multiModules) == 1 assert "template" in self.manager.commands assert len(self.manager.commands["template"]) == 2 self.manager.removeModule("PaGS.modules.templateModule") assert len(self.manager.multiModules) == 0 assert "template" not in self.manager.commands assert "PaGS.modules.templateModule" not in self.manager.printers
def test_addRemoveVehicle(self): """Test adding and removing a vehicle""" self.manager = moduleManager.moduleManager( self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.addModule("PaGS.modules.templateModule") # simulate some vehicles being added self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") assert self.manager.multiModules['PaGS.modules.templateModule'].theVeh == [ "VehA", "VehB", "VehC"] # and being removed self.manager.removeVehicle("VehB") assert self.manager.multiModules['PaGS.modules.templateModule'].theVeh == [ "VehA", "VehC"]
def test_inoutPacket(self): """Test packets going in and out""" self.manager = moduleManager.moduleManager( self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.addModule("PaGS.modules.templateModule") # And create the callback for packet tx/rx between vehicle and modules self.manager.onPktTxAttach(self.txcallback) # send an incoming packet. The template module will send it back out # again pkt = self.mod.MAVLink_heartbeat_message( 5, 4, 0, 0, 0, int(self.version)) self.manager.incomingPacket("VehA", pkt, "link1") assert self.manager.multiModules["PaGS.modules.templateModule"].pkts == 1 print(self.txPackets) assert self.txPackets["VehA"] == 0 # the packet type
async def test_guiStart(self): """Simple test of the GUI startup""" # need to reset for handling gui self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, True) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.onPktTxAttach(self.txcallback) self.manager.addModule("internalPrinterModule") self.manager.addModule("PaGS.modules.statusModule") # Wait for param gui to load await asyncio.sleep(0.2) # Update the GUI with some status pkt = self.mod.MAVLink_sys_status_message(52485167, 35684399, 52461871, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) self.manager.multiModules["PaGS.modules.statusModule"].incomingPacket( "VehA", pkt)
def test_moreCommand(self): """Test the stability of the command handler with all sorts of mangled user input""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) self.manager.onVehListAttach(self.getVehListCallbackMany) self.manager.onVehGetAttach(self.getVehicleCallbackMany) self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") # load module self.manager.addModule("templateModule") # test the mangled inputs self.manager.onModuleCommandCallback("VehB", "") self.manager.onModuleCommandCallback("VehB", "template") self.manager.onModuleCommandCallback("VehB", "template do_stuff") self.manager.onModuleCommandCallback( "VehB", "template do_stuff 1 3 4 6 7") self.manager.onModuleCommandCallback("VehB", "template do_stuff \"4") self.manager.onModuleCommandCallback("VehB", "template:") self.manager.onModuleCommandCallback("VehB", "template do_stuff:") self.manager.onModuleCommandCallback("VehB", "template crash")
def test_command(self): """Test the loading and execution of user commands in modules""" self.manager = moduleManager.moduleManager( self.loop, self.dialect, self.version, False) self.manager.onVehListAttach(self.getVehListCallbackMany) self.manager.addVehicle("VehB") self.manager.addVehicle("VehC") # load module self.manager.addModule("PaGS.modules.templateModule") # execute a command self.manager.onModuleCommandCallback( "VehB", "template do_stuff 1 \"the rest\"") # and invalid command self.manager.onModuleCommandCallback("VehB", "template do_nothing") # and assert assert self.manager.multiModules['PaGS.modules.templateModule'].printedout[ "VehB"] == "Command not found: template do_nothing" assert self.manager.multiModules['PaGS.modules.templateModule'].calledStuff["VehB"] == "1,the rest"
async def test_guiStart(self): """Simple test of the GUI startup""" # need to reset for handling gui self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, True) self.manager.onVehListAttach(self.getVehListCallback) self.manager.onVehGetAttach(self.getVehicleCallback) self.manager.onPktTxAttach(self.txcallback) self.manager.addModule("internalPrinterModule") self.manager.addModule("PaGS.modules.paramModule") # now all params downloaded self.VehA.paramstatus = True self.VehA.params = {"RC1_MIN": 1000, "RC2_MAX": 2000} self.VehA.params_type = { "RC1_MIN": self.mod.MAV_PARAM_TYPE_UINT16, "RC2_MAX": self.mod.MAV_PARAM_TYPE_UINT16 } # Wait for param gui to load await asyncio.sleep(0.3)
def test_manager(self): """Check initialisation""" self.manager = moduleManager.moduleManager( self.loop, self.dialect, self.version, False) assert len(self.manager.multiModules) == 0
def test_manager(self): """Check initialisation""" self.manager = moduleManager.moduleManager(self.loop, self.settingsdir, False) assert len(self.manager.multiModules) == 0
def __init__(self, dialect, mav, source_system, source_component, nogui, multi, source, loop, initialModules): """ Start up PaGS """ # logging.basicConfig(level=logging.DEBUG) self.loop = loop # Start the connection maxtrix self.connmtrx = ConnectionManager(self.loop, dialect, mav, source_system, source_component) # Dict of vehicles self.allvehicles = VehicleManager(self.loop) # Module manager self.modules = moduleManager.moduleManager(self.loop, dialect, mav, not nogui) # event links from connmaxtrix -> vehicle manager self.connmtrx.onPacketAttach(self.allvehicles.onPacketRecieved) # event links from vehicle manager -> connmatrix self.allvehicles.onPacketBufTxAttach(self.connmtrx.outgoingPacket) asyncio.ensure_future( self.allvehicles.onLinkAddAttach(self.connmtrx.addVehicleLink)) asyncio.ensure_future( self.allvehicles.onLinkRemoveAttach(self.connmtrx.removeLink)) # event links from module manager -> vehicle manager self.modules.onPktTxAttach(self.allvehicles.send_message) self.modules.onVehListAttach(self.allvehicles.get_vehiclelist) self.modules.onVehGetAttach(self.allvehicles.get_vehicle) # event links vehicle manager -> module manager self.allvehicles.onAddVehicleAttach(self.modules.addVehicle) self.allvehicles.onRemoveVehicleAttach(self.modules.removeVehicle) self.allvehicles.onPacketRxAttach(self.modules.incomingPacket) # Need to load initial modules for m in initialModules: self.modules.addModule(m) # redirect stdout to the terminal printer, if loaded # Thus print() can be used properly if self.modules.multiModules.get('modules.terminalModule'): sys.stdout = RedirPrint( self.modules.multiModules.get('modules.terminalModule').print) # Single or multi-vehicle? if multi != "": # TODO: figure out multivehicle parsing file pass else: # Create vehicles and links # Each sysID is assumed to be a different vehicle # Multiple links with the same sysid will create a multilink vehicle for connection in source: Vehname = "Veh_" + str(connection.split(':')[3]) cn = connection.split(':')[0] + ":" + connection.split( ':')[1] + ":" + connection.split(':')[2] asyncio.ensure_future( self.allvehicles.add_vehicle(Vehname, source_system, source_component, connection.split(':')[3], connection.split(':')[4], dialect, mav, cn))