tvr0tator.c
/* Licensed under CC0 1.0 Universal (CC0 1.0)
* by andy (andy_@jabber.ccc.de)
* see http://r0ket.badge.events.ccc.de/r0ketlauncher
*/
#include <usb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
usb_dev_handle* launcher;
pid_t pID;
int send_message(char* msg, int index)
{
int i = 0, j;
j = usb_control_msg(launcher, 0x21, 0x9, 0x200, index, msg, 8, 1000);
memset(msg, 0, 8);
return j;
}
void movement_handler(char control)
{
/* grabbed from http://www.amctrl.com/rocketlauncher.html */
int deally;
char msg[8];
memset(msg, 0, 8);
deally = send_message(msg, 1);
msg[0] = control;
deally = send_message(msg, 0);
deally = send_message(msg, 1);
}
void bye()
{
kill(pID, SIGTERM);
usb_close(launcher);
usb_release_interface(launcher, 0);
}
int main( int argc, const char* argv[] )
{
struct usb_bus *busses, *bus;
struct usb_device *dev;
FILE *fpipe;
char line[256];
const char *command = "dvbsnoop -pd 2 -n 1 -s signal | grep Sig | sed 's/Sig: \\([0-9]*\\).*/\\1/'";
int claimed, maxsignal = 0;
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();
for (bus = busses; bus; bus = bus->next)
{
for (dev = bus->devices; dev; dev = dev->next)
{
if (dev->descriptor.idVendor == 0x0a81)
{
printf("found r0ketlauncher!");
goto _goon;
}
}
}
printf("r0ketlauncher not found :(");
exit(0);
_goon:
atexit(bye);
launcher = usb_open(dev);
claimed = usb_claim_interface(launcher, 0);
if(claimed == EBUSY)
{
printf("Claim of USB r0cket failed, maybe wrong permissions or pedobear alias generic-usb module rapes it");
exit(0);
}
printf("found r0ketlauncher, be shure to turn on your DVB Viewer :)");
pID = fork();
if (pID == 0) {
while(1)
{
fpipe = (FILE*)popen(command,"r");
if(!fpipe)
{
fprintf(stderr, "failed executing %s", command);
sleep(5);
continue;
}
fgets(line, sizeof line, fpipe);
fclose(fpipe);
if(maxsignal > atoi(line))
{
movement_handler((rand() % 2 > 0) ? 4 : 8);
sleep(rand() % 3);
movement_handler(1);
}
else
{
maxsignal = atoi(line);
sleep(10);
}
sleep(4);
}
} else {
wait(NULL);
}
}