Hi.
Kleines Problem:
Habe eine Webseite wo über mousedown per ajax ein PHP aufgerufen wird welches ein Python Script startet.
Hintergrund :
Hab einen USB Raketenwerfer mir einer Kamera versehen und möchte diesen jetzt per Webinterface steuern. Klappt 1a, bis auf den Zeitversatz (auch im LAN), das Zielen ist echt schwer
Starte ich nicht das Python Script sondern sende nur einen Text wird dieser unmittelbar angezeigt. Von daher denke ich das Python das Problem verursacht.
Ich habe leider absolut keinen Schimmer von Python.
Any Idea ? :s
Die Webseite :
Spoiler anzeigen
<html>
<head>
<meta name="author" content="">
<title></title>
</head>
<script type="text/javascript">
<!--
function Init_AJAX() {
try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
try { return new XMLHttpRequest();} catch(e) {}
alert("XMLHttpRequest not supported");
return null;
};
function jsRunAjax($param) {
var req=Init_AJAX();
req.onreadystatechange = function() {
if ((req.readyState == 4) && (req.status == 200)) {
document.getElementById('bmsg').innerHTML = req.responseText;
};
};
// Und ab in das PHP damit
$poststring='do='+$param;
req.open('post', 'fctl.php';
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
req.send($poststring);
}
//-->
</script>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<div align="Center">
<table>
<tr>
<td style="height480:px;
width:640px;
background:url('http://<?PHP echo $_SERVER["HTTP_HOST"];?>:8080/?action=stream') top left no-repeat">
<img src="fk.gif">
</td>
</tr>
</table>
<table>
<tr>
<td></td>
<td><input type="button" value="Hoch" onmousedown="jsRunAjax('hoch')" onmouseup="jsRunAjax('stop')"></td>
<td></td>
</tr>
<tr>
<td><input type="button" value="Links" onmousedown="jsRunAjax('links')" onmouseup="jsRunAjax('stop')"></td>
<td><input type="button" value="Feuer" onmousedown="jsRunAjax('feuer')" onmouseup="jsRunAjax('stop')"></td>
<td><input type="button" value="Rechts" onmousedown="jsRunAjax('rechts')" onmouseup="jsRunAjax('stop')"></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="Runter" onmousedown="jsRunAjax('runter')" onmouseup="jsRunAjax('stop')"></td>
<td></td>
</tr>
</table>
<!-- Nur zum Testen drin -->
<div id="bmsg"></div>
</div>
</body>
</html>
[/php][/spoiler]
die Ajax PHP
[spoiler]
[code=php]
<?PHP
switch($_POST["do"]) {
case "hoch":
dofire("UP");
break;
case "links":
dofire("LEFT");
break;
case "feuer":
dofire("FIRE");
break;
case "rechts":
dofire("RIGHT");
break;
case "runter":
dofire("DOWN");
break;
case "stop":
dofire("STOP");
break;
}
function dofire($case) {
$retval = shell_exec("sudo python /var/www/test.py " . $case);
echo $retval;
}
?>
[/php]
[/spoiler]
Und die beiden Python scripts
test.py
[spoiler]
[code]
import sys, getopt
from armageddon import Armageddon
blah = Armageddon()
arg = sys.argv[1]
if arg == 'LEFT':
blah.send_move(blah.LEFT,50)
if arg == 'RIGHT':
blah.send_move(blah.RIGHT,50)
if arg == 'UP':
blah.send_move(blah.UP,50)
if arg == 'DOWN':
blah.send_move(blah.DOWN,50)
print 'Down'
if arg == 'STOP':
blah.send_move(blah.STOP,50)
if arg == 'FIRE':
blah.send_cmd(blah.FIRE)
print 'Fired'
sys.exit(0)
Alles anzeigen
[/spoiler]
die Klasse :
Spoiler anzeigen
import platform
import time
import usb.core
import usb.util
class Armageddon(object):
"""
Based on https://github.com/codedance/Retaliation
"""
DOWN = 0x01
UP = 0x02
LEFT = 0x04
RIGHT = 0x08
FIRE = 0x10
STOP = 0x20
DEVICE_ORIGINAL = 'Original'
DEVICE_THUNDER = 'Thunder'
def __init__(self):
self._get_device()
self._detach_hid()
self.DEVICE.set_configuration()
def _get_device(self):
self.DEVICE = usb.core.find(idVendor=0x2123, idProduct=0x1010)
if self.DEVICE is None:
self.DEVICE = usb.core.find(idVendor=0x0a81, idProduct=0x0701)
if self.DEVICE is None:
raise ValueError('Missile device not found')
else:
self.DEVICE_TYPE = self.DEVICE_ORIGINAL
else:
self.DEVICE_TYPE = self.DEVICE_THUNDER
def _detach_hid(self):
if "Linux" == platform.system():
try:
self.DEVICE.detach_kernel_driver(0)
except Exception, e:
pass
def send_cmd(self, cmd):
if self.DEVICE_THUNDER == self.DEVICE_TYPE:
self.DEVICE.ctrl_transfer(0x21, 0x09, 0, 0,
[0x02, cmd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
elif self.DEVICE_ORIGINAL == self.DEVICE_TYPE:
self.DEVICE.ctrl_transfer(0x21, 0x09, 0x0200, 0,
[cmd])
def send_move(self, cmd, duration_ms):
self.send_cmd(cmd)
"""
time.sleep(duration_ms / 1000.0)
self.send_cmd(self.STOP)
"""
Alles anzeigen
PS :
Bitte keine Diskussionen zum PHP und JS Code anfangen wie : nimm jquery
oder: das macht man nicht so
oder: table layout ist überholt
etc....
Das ist alles dahingeschmiert und funktioniert so, bis auf den Zeitversatz, erst mal.