/*---------------------------------------------------------------------------*/ static unsigned short generate_radio_stats(void *arg) { uint16_t numprinted; uint16_t h,m,s; uint8_t p1,p2; unsigned long seconds=clock_seconds(); static const char httpd_cgi_sensor10[] HTTPD_STRING_ATTR = "<em>Radio on time :</em> %02d:%02d:%02d (%d.%02d%%)<br>"; static const char httpd_cgi_sensor11[] HTTPD_STRING_ATTR = "<em>Packets:</em> Tx=%5d Rx=%5d TxL=%5d RxL=%5d RSSI=%2ddBm\n"; s=(10000UL*savedradioontime)/seconds; p1=s/100; p2=s-p1*100; h=savedradioontime/3600; s=savedradioontime-h*3600; m=s/60; s=s-m*60; numprinted =httpd_snprintf((char *)uip_appdata , uip_mss() , httpd_cgi_sensor10,\ h,m,s,p1,p2); #if RF230BB numprinted+=httpd_snprintf((char *)uip_appdata + numprinted, uip_mss() - numprinted, httpd_cgi_sensor11,\ RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail,-92+rf230_last_rssi); #else p1=0; radio_get_rssi_value(&p1); p1 = -91*3(p1-1); numprinted+=httpd_snprintf((char *)uip_appdata + numprinted, uip_mss() - numprinted, httpd_cgi_sensor11,\ RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail,p1); #endif return numprinted; }
int main (int argc, char *argv[]) { int x_state=0; int y_state=0; int foreground = 0; int opt; pid_t pid; ssize_t res; unsigned char buffer[8]; struct input_event ev[6]; struct input_event ev_button[22]; struct input_event ev_sync; conf_data conf; conf = config_parse(); while ((opt = getopt(argc, argv, "hfs:u:?")) != EOF) { switch (opt) { case 'h': usage(); break; case 'f': foreground=1; break; case 's': sprintf(conf.joystick_device, "%s", optarg); break; case 'u': sprintf(conf.uinput_device, "%s", optarg); break; default: usage(); break; } } if (!running_as_root()) { fprintf(stderr,"this program must be run as root user\n"); exit (-1); } printf("stjoy v%s ", VERSION); fflush(stdout); if (!foreground) { if ((pid = fork()) < 0) exit(1); else if (pid != 0) exit(0); /* daemon running here */ setsid(); if (chdir("/") != 0) die("Could not chdir"); umask(0); printf("forked into background\n"); } else printf("\n"); /* create pid file */ if (!create_pid_file()) exit(-1); if (foreground) { printf ("\nConfiguration data:\n"); printf ("\tjoystick_device=%s\n",conf.joystick_device); printf ("\tuinput_device=%s\n",conf.uinput_device); } // Open joystick port open_joystick_port(conf.joystick_device); // configure uinput setup_uinput_dev(conf.uinput_device); // handle signals signal_installer(); // input sync signal: memset (&ev_sync, 0, sizeof (struct input_event)); ev_sync.type = EV_SYN; ev_sync.code = 0; ev_sync.value = 0; // button press signals: memset (&ev_button, 0, sizeof (ev_button)); ev_button[0].type = EV_KEY; ev_button[0].code = BTN_A; ev_button[0].value = 0; ev_button[1].type = EV_KEY; ev_button[1].code = BTN_A; ev_button[1].value = 1; ev_button[2].type = EV_KEY; ev_button[2].code = BTN_B; ev_button[2].value = 0; ev_button[3].type = EV_KEY; ev_button[3].code = BTN_B; ev_button[3].value = 1; ev_button[4].type = EV_KEY; ev_button[4].code = BTN_X; ev_button[4].value = 0; ev_button[5].type = EV_KEY; ev_button[5].code = BTN_X; ev_button[5].value = 1; ev_button[6].type = EV_KEY; ev_button[6].code = BTN_Y; ev_button[6].value = 0; ev_button[7].type = EV_KEY; ev_button[7].code = BTN_Y; ev_button[7].value = 1; ev_button[8].type = EV_KEY; ev_button[8].code = BTN_TL; ev_button[8].value = 0; ev_button[9].type = EV_KEY; ev_button[9].code = BTN_TL; ev_button[9].value = 1; ev_button[10].type = EV_KEY; ev_button[10].code = BTN_TR; ev_button[10].value = 0; ev_button[11].type = EV_KEY; ev_button[11].code = BTN_TR; ev_button[11].value = 1; ev_button[12].type = EV_KEY; ev_button[12].code = BTN_SELECT; ev_button[12].value = 0; ev_button[13].type = EV_KEY; ev_button[13].code = BTN_SELECT; ev_button[13].value = 1; ev_button[14].type = EV_KEY; ev_button[14].code = BTN_START; ev_button[14].value = 0; ev_button[15].type = EV_KEY; ev_button[15].code = BTN_START; ev_button[15].value = 1; ev_button[16].type = EV_KEY; ev_button[16].code = BTN_MODE; ev_button[16].value = 0; ev_button[17].type = EV_KEY; ev_button[17].code = BTN_MODE; ev_button[17].value = 1; /* ev_button[18].type = EV_ABS; ev_button[18].code = ABS_RZ; ev_button[18].value = 0; ev_button[19].type = EV_ABS; ev_button[19].code = ABS_RZ; ev_button[19].value = 255; ev_button[20].type = EV_ABS; ev_button[20].code = ABS_Z; ev_button[20].value = 0; ev_button[21].type = EV_ABS; ev_button[21].code = ABS_Z; ev_button[21].value = 255; */ ev_button[18].type = EV_KEY; ev_button[18].code = BTN_THUMBL; ev_button[18].value = 0; ev_button[19].type = EV_KEY; ev_button[19].code = BTN_THUMBL; ev_button[19].value = 1; ev_button[20].type = EV_KEY; ev_button[20].code = BTN_THUMBR; ev_button[20].value = 0; ev_button[21].type = EV_KEY; ev_button[21].code = BTN_THUMBR; ev_button[21].value = 1; // load X,Y into input_events memset (ev, 0, sizeof (ev)); //resets object ev[0].type = EV_ABS; ev[0].code = ABS_HAT0X; ev[0].value = 0; ev[1].type = EV_ABS; ev[1].code = ABS_HAT0X; ev[1].value = 1; ev[2].type = EV_ABS; ev[2].code = ABS_HAT0X; ev[2].value = -1; ev[3].type = EV_ABS; ev[3].code = ABS_HAT0Y; ev[3].value = 0; ev[4].type = EV_ABS; ev[4].code = ABS_HAT0Y; ev[4].value = 1; ev[5].type = EV_ABS; ev[5].code = ABS_HAT0Y; ev[5].value = -1; while (1) { memset (buffer, 0, sizeof (buffer)); res = read (fd_joystick, &buffer, sizeof (buffer)); if (res < 0) die ("error reading from joystick port"); if (DEBUG || foreground) fprintf (stderr,"PDU: %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7] ); // A if (buffer[6]==1 && buffer[7]==0) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[0], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[1], sizeof (struct input_event)) < 0) die ("error: write"); } // B if (buffer[6]==1 && buffer[7]==1) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[2], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[3], sizeof (struct input_event)) < 0) die ("error: write"); } // X if (buffer[6]==1 && buffer[7]==2) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[4], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[5], sizeof (struct input_event)) < 0) die ("error: write"); } // Y if (buffer[6]==1 && buffer[7]==3) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[6], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[7], sizeof (struct input_event)) < 0) die ("error: write"); } // LB <---- cheat! if (buffer[6]==1 && buffer[7]==4) { /* if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[8], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[9], sizeof (struct input_event)) < 0) die ("error: write"); */ if (buffer[4]==1 && buffer[5]==0) { // LB button press /* DP RIGHT */ // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // x/right if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // y/down if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/right if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // press Y if (write (fd_uinput, &ev_button[7], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // release Y if (write (fd_uinput, &ev_button[6], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/neutral x if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); /* DP LEFT */ usleep(100000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // x/left if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // y/down if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/left if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // press Y if (write (fd_uinput, &ev_button[7], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // press X (we can "piano" in the 2nd one) if (write (fd_uinput, &ev_button[5], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // release Y if (write (fd_uinput, &ev_button[6], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // release X (we can "piano" in the 2nd one) if (write (fd_uinput, &ev_button[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/neutral x if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // restore x&y state if (x_state==0) if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (x_state==1) if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (x_state==-1) if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); if (y_state==0) if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (y_state==1) if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (y_state==-1) if (write (fd_uinput, &ev[5], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); } } // RB if (buffer[6]==1 && buffer[7]==5) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[10], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[11], sizeof (struct input_event)) < 0) die ("error: write"); } if (buffer[6]==1 && buffer[7]==6) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[12], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[13], sizeof (struct input_event)) < 0) die ("error: write"); } if (buffer[6]==1 && buffer[7]==7) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[14], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[15], sizeof (struct input_event)) < 0) die ("error: write"); } if (buffer[6]==1 && buffer[7]==8) { if (buffer[4]==0 && buffer[5]==0) if (write (fd_uinput, &ev_button[16], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==1 && buffer[5]==0) if (write (fd_uinput, &ev_button[17], sizeof (struct input_event)) < 0) die ("error: write"); } // RT if (buffer[6]==2 && buffer[7]==5) { if (buffer[4]==1 && buffer[5]==0x80) if (write (fd_uinput, &ev_button[18], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==0xff && buffer[5]==0x7f) if (write (fd_uinput, &ev_button[19], sizeof (struct input_event)) < 0) die ("error: write"); } // LT <---- cheat! /* dragon punch */ #if 0 Event: time 1387128747.109831, type 3 (EV_ABS), code 16 (ABS_HAT0X), value 1 <---- x/right Event: time 1387128747.197553, type 3 (EV_ABS), code 16 (ABS_HAT0X), value 0 <---- x/neutral Event: time 1387128747.197580, type 3 (EV_ABS), code 17 (ABS_HAT0Y), value 1 <---- y/down Event: time 1387128747.217594, type 3 (EV_ABS), code 16 (ABS_HAT0X), value -1 <---- x/left Event: time 1387128747.277551, type 3 (EV_ABS), code 16 (ABS_HAT0X), value 0 <---- x/neutral Event: time 1387128747.293556, type 3 (EV_ABS), code 16 (ABS_HAT0X), value 1 <---- x/right Event: time 1387128747.293583, type 1 (EV_KEY), code 307 (BTN_X), value 1 <---- press X Event: time 1387128747.345564, type 3 (EV_ABS), code 17 (ABS_HAT0Y), value 0 <---- y/neutral Event: time 1387128747.365552, type 1 (EV_KEY), code 307 (BTN_X), value 0 <---- release X Event: time 1387128747.381499, type 3 (EV_ABS), code 16 (ABS_HAT0X), value 0 <---- x/neutral #endif if (buffer[6]==2 && buffer[7]==2) { /* if (buffer[4]==1 && buffer[5]==0x80) if (write (fd_uinput, &ev_button[20], sizeof (struct input_event)) < 0) die ("error: write"); if (buffer[4]==0xff && buffer[5]==0x7f) if (write (fd_uinput, &ev_button[21], sizeof (struct input_event)) < 0) die ("error: write"); */ if (buffer[4]==1 && buffer[5]==0x80) { /* DP LEFT */ // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // x/left if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // y/down if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/left if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // press X if (write (fd_uinput, &ev_button[5], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // release X if (write (fd_uinput, &ev_button[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/neutral x if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); /* DP RIGHT */ usleep(100000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // x/right if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // y/down if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // x/neutral if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/right if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(27); // press X if (write (fd_uinput, &ev_button[5], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // press Y (we can "piano" in the 2nd one) if (write (fd_uinput, &ev_button[7], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(18000); // y/neutral if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // release X if (write (fd_uinput, &ev_button[4], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // release Y (we can "piano" in the 2nd one) if (write (fd_uinput, &ev_button[6], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(12000); // x/neutral x if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); // restore x&y state if (x_state==0) if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); if (x_state==1) if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); if (x_state==-1) if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); if (y_state==0) if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); if (y_state==1) if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); if (y_state==-1) if (write (fd_uinput, &ev[5], sizeof (struct input_event)) < 0) die ("error: write"); if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); usleep(500); } } // x-axis if (buffer[6]==2 && buffer[7]==6) { if (buffer[4]==0 && buffer[5]==0) { if (write (fd_uinput, &ev[0], sizeof (struct input_event)) < 0) die ("error: write"); x_state=0; //neutral } if (buffer[4]==0xff && buffer[5]==0x7f) { if (write (fd_uinput, &ev[1], sizeof (struct input_event)) < 0) die ("error: write"); x_state=1; // right } if (buffer[4]==1 && buffer[5]==0x80) { if (write (fd_uinput, &ev[2], sizeof (struct input_event)) < 0) die ("error: write"); x_state=-1; //left } } // y-axis if (buffer[6]==2 && buffer[7]==7) { if (buffer[4]==0 && buffer[5]==0) { if (write (fd_uinput, &ev[3], sizeof (struct input_event)) < 0) die ("error: write"); y_state=0; //neutral } if (buffer[4]==0xff && buffer[5]==0x7f) { if (write (fd_uinput, &ev[4], sizeof (struct input_event)) < 0) die ("error: write"); y_state=1; //up } if (buffer[4]==1 && buffer[5]==0x80) { if (write (fd_uinput, &ev[5], sizeof (struct input_event)) < 0) die ("error: write"); y_state=-1; // down } } // Sync if (write (fd_uinput, &ev_sync, sizeof (struct input_event)) < 0) die ("error state"); } if (ioctl (fd_uinput, UI_DEV_DESTROY) < 0) die ("error: ioctl"); close (fd_uinput); return 0; }