diff --git a/runxboxdrv/example.cfg b/runxboxdrv/example.cfg new file mode 100644 index 0000000..7c09eb3 --- /dev/null +++ b/runxboxdrv/example.cfg @@ -0,0 +1,66 @@ +[options] +silent=true +trigger-as-button=true +dpad-as-button=true +led=0 + +[axis-sensitivity] +X1=-0.5 +X2=-0.5 +Y2=-0.5 + +[axismap] +Y2=-Y2 + +[ui-axismap] +Y1=XK_1:XK_2 + +[ui-buttonmap] +# speed +du=XK_Up +dd=XK_Down +# previous, next target +dl=XK_Left +dr=XK_Right +# fire lasers +lt=XK_w +# identify object +rt=XK_r +# next missile +lb=XK_y +# inject speed +rb=XK_i +# launch missile +X=XK_Return +# target missile +A=XK_t +# ecm +B=XK_e +# untarget missile +Y=XK_u +# scanner zoom +start=XK_z +# jumpdrive +guide=XK_j +# pause +back=XK_p +# buy equipment/ships +lb+du=XK_3 +# market prices +lb+dd=XK_8 +# local/galactic chart +lb+dl=XK_6 +# planet info +lb+dr=XK_7 +# current status/manifest +lb+back=XK_5 +# hyperspace +lb+guide=XK_h +# slow dock with target +lb+start=XK_c +# fast dock +lb+X=XK_d +# advanced compass +lb+A=XK_backslash +# comms log +lb+B=XK_m diff --git a/runxboxdrv/runxboxdrv b/runxboxdrv/runxboxdrv new file mode 100755 index 0000000..ed2d080 --- /dev/null +++ b/runxboxdrv/runxboxdrv @@ -0,0 +1,97 @@ +#!/usr/bin/env python + +import os, sys +import ConfigParser +from subprocess import check_call, Popen, PIPE +from signal import SIGINT + +class RunXBoxDrv(object): + def __init__(self, configfile, appandparams=[]): + self.configfile = configfile + self.appandparams = appandparams + + @staticmethod + def checkminusvalue(key, value): + if value.startswith("-"): + valstr = value[1:] + try: + number = float(valstr) + except ValueError: + return ("-%s" % key, valstr) + return (key, value) + + @staticmethod + def getNext(myProc): + out = "" + while out == "": + out = myProc.read() + buf = out + while out != "": + out = myProc.read() + buf = "%s%s" % (buf, out) + return buf + + def process(self): + parser = ConfigParser.ConfigParser() + parser.optionxform = str + + if not parser.read(self.configfile): + raise Exception("XBoxDrv game config not found: " + self.configfile) + + cfg = dict([(s, dict(parser.items(s))) for s in parser.sections()]) + commandlist = ["xboxdrv"] + for sectionname in cfg: + section = cfg[sectionname] + if sectionname == "options": + for inkey in section: + key, value = self.checkminusvalue(inkey, section[inkey]) + if value == "true": + commandlist.append("--%s" % key) + else: + commandlist.append("--%s=%s" % (key, value)) + continue + paramline = "" + for inkey in section: + key, value = self.checkminusvalue(inkey, section[inkey]) + paramline = "%s%s=%s," % (paramline, key, value) + if paramline.endswith(","): + commandlist.append("--%s" % sectionname) + commandlist.append(paramline[:-1]) + print commandlist + myProc = Process(commandlist) + out = "" + while out.lower().find("quit") == -1: + out = self.getNext(myProc) + print out + if len(self.appandparams) == 0: + print("WARNING: No path to application specified!") + else: + print(self.appandparams) + check_call(self.appandparams) + print "Sending SIGINT" + myProc.kill(SIGINT) + try: + with_timeout(1, myProc.wait) + sys.exit(0) + except Timeout: + pass + print "Sending SIGINT again" + myProc.kill(SIGINT) + try: + with_timeout(1, myProc.wait) + sys.exit(0) + except Timeout: + pass + print "Killing" + myProc.terminate() + +def main(): + # parse command line options + if len(sys.argv) < 2: + print "Usage: runxboxdrv configfile [path to app] [app parameters]" + sys.exit(-1) + runxboxdrv = RunXBoxDrv(sys.argv[1], sys.argv[2:]) + runxboxdrv.process() + +if __name__ == "__main__": + main()