int main (int argc, char *argv[]) { int screensaver = 0, c, brightness_prev = -1, backlight_prev = -1; int light = 0, brightness = 255, backlight = 100; int foreground = 0, verbose = 0, debug = 0; int brightness_restore, backlight_restore, brightness_restoreflag = 0, backlight_restoreflag = 0; int res, dbus_backend = -1, tmp = -1; float idletime = 0; pid_t pid; conf_data conf; Display *display = NULL; DBusGConnection *connection; DBusGProxy *proxy_manager; DBusGProxy *proxy_session; uid_t uid, euid; int light_aux = -1, light_avg = -1; int lightvalues[15] = { 0 }; int countarray[256] = { 0 }; unsigned int i, index = 0; // make sure we are run as a regular user uid = getuid (); euid = geteuid (); if (uid == 0 || euid == 0) { fprintf (stderr, "lightum must NOT be run as root.\n"); exit (1); } // overwrite defaults with config file conf = config_parse (); // overwrite config file with command line arguments while ((c = getopt (argc, argv, "hxuUlsvfm:n:M:N:p:I:i:d:w:?")) != EOF) { switch (c) { case 'h': usage (""); break; case 'x': conf.manualmode = 1; break; case 'u': conf.ignoreuser = 0; break; case 'U': conf.ignoresession = 1; break; case 'l': conf.fulldim = 1; break; case 's': conf.queryscreensaver = 1; break; case 'f': foreground = 1; break; case 'v': verbose = 1; break; case 'd': debug = atoi (optarg); break; case 'm': conf.maxbrightness = atoi (optarg); break; case 'n': conf.minbrightness = atoi (optarg); break; case 'M': conf.maxbacklight = atoi (optarg); break; case 'N': conf.minbacklight = atoi (optarg); break; case 'p': conf.polltime = atoi (optarg); break; case 'i': conf.idleoff = atoi (optarg); break; case 'I': conf.screenidle = atoi (optarg); break; case 'w': conf.workmode = atoi (optarg); break; default: usage ("ERROR: Unknown OPTION\n"); break; } } if (verbose) printf ("CONFIG:\n\tmanualmode: %d\n", conf.manualmode); if (verbose) printf ("\tignoreuser: %d\n", conf.ignoreuser); if (verbose) printf ("\tignoresession: %d\n", conf.ignoresession); if (verbose) printf ("\tworkmode: %d\n", conf.workmode); if (verbose) printf ("\tqueryscreensaver: %d\n", conf.queryscreensaver); if (verbose) printf ("\tmaxbrightness: %d\n", conf.maxbrightness); if (verbose) printf ("\tminbrightness: %d\n", conf.minbrightness); if (verbose) printf ("\tmaxbacklight: %d\n", conf.maxbacklight); if (verbose) printf ("\tminbacklight: %d\n", conf.minbacklight); if (verbose) printf ("\tpolltime: %d\n", conf.polltime); if (verbose) printf ("\tidleoff: %d\n", conf.idleoff); if (verbose) printf ("\tscreenidle: %d\n", conf.screenidle); if (verbose) printf ("\tfulldim: %d\n\n", conf.fulldim); // make sure all config values are correct check_config_values (conf); if (debug < 0 || debug > 3) usage ("ERROR: Wrong value in config variable 'debug'\n"); // if debug enabled, force verbose mode too if (debug > 0) verbose = 1; // if verbose enabled, force foreground mode too if (verbose) foreground = 1; if (conf.manualmode) printf ("lightum v%s running in manual mode ", VERSION); else printf ("lightum v%s running in auto mode ", VERSION); fflush (stdout); if (!foreground) { if ((pid = fork ()) < 0) exit (1); else if (pid != 0) exit (0); /* daemon running here */ setsid (); res = chdir ("/"); if (res != 0) { perror ("Could not chdir"); exit (1); } umask (0); printf ("forked into background\n"); } else printf ("\n"); /* create pid file */ if (!create_pid_file ()) exit (1); /* start with current brightness values */ if (conf.workmode == 1 || conf.workmode == 3) { brightness_restore = get_keyboard_brightness_value (); } /* start with current backlight values */ if (conf.workmode == 2 || conf.workmode == 3) { backlight_restore = get_screen_backlight_value (); // detect dbus backend: 0: gnome, 1: kde tmp = dbus_set_screen_backlight_value_gnome (acpi_to_dbus_backlight (backlight_restore)); if (tmp == -1) { tmp = dbus_set_screen_backlight_value_kde (acpi_to_dbus_backlight (backlight_restore)); if (tmp == -1) { tmp = set_screen_xbacklight_value (acpi_to_dbus_backlight (backlight_restore)); if (tmp == -1) { fprintf (stderr, "Can't manage screen backlight on this system.\nPlease disable backlight with config option 'workmode='1' or command line switch '-w 1'.\nIf you believe this is an error, open a bug report: https://github.com/poliva/lightum/issues\n"); exit (1); } else { dbus_backend = 2; } } else { dbus_backend = 1; } } else { dbus_backend = 0; } } if (conf.idleoff != 0 || conf.screenidle != 0) { display = XOpenDisplay (NULL); if (display == NULL) { fprintf (stderr, "Failed to open display\n"); exit (1); } } signal_installer (); if (!conf.ignoresession) { connection = get_dbus_connection (); proxy_manager = get_dbus_proxy_manager (connection); proxy_session = get_dbus_proxy_session (connection, proxy_manager); } // initialize the light values array if (!conf.manualmode) { light = get_light_sensor_value (); for (i = 0; i < ARRAY_LENGTH (lightvalues); i++) lightvalues[i] = light; countarray[light] = ARRAY_LENGTH (lightvalues); } else { for (i = 0; i < ARRAY_LENGTH (lightvalues); i++) lightvalues[i] = 0; } while (1) { if (reloadconfig) { conf = config_parse (); if (verbose) printf ("lightum: SIGUSR1 received, configuration reloaded\n"); check_config_values (conf); reloadconfig = 0; } if (!conf.ignoresession) { if (!get_session_active (proxy_session)) { if (verbose) printf ("lightum: user session not active, sleeping %d milliseconds.\nIf you believe this is an error, try running lightum with 'ignoresession=1' or '-U' command line switch.\n", conf.polltime); usleep (conf.polltime * 1000); continue; } } if (!conf.manualmode) { light = get_light_sensor_value (); if (verbose) printf ("light_sensor: %d ", light); // to avoid backlight flickering when the light sensor flaps too frequently // between two values, we collect lighting values and use the most common // value of the collected values if (index == ARRAY_LENGTH (lightvalues)) index = 0; lightvalues[index] = light; // get the most repetitive value of lightvalues array for (i = 0; i < ARRAY_LENGTH (lightvalues); ++i) { countarray[lightvalues[i]]++; } light_avg = -1; light_aux = -1; for (i = 0; i < ARRAY_LENGTH (countarray); ++i) { if (countarray[i] > light_aux) { light_aux = countarray[i]; light_avg = i; } countarray[i] = 0; } light = light_avg; if (verbose) printf ("light_avg: %d ", light); index++; } if (conf.idleoff != 0 || conf.screenidle != 0) { idletime = get_session_idle_time (display); if (verbose) printf ("idle_time: %f ", idletime); } if (!conf.manualmode) { if (conf.workmode == 1 || conf.workmode == 3) brightness = calculate_keyboard_brightness_value (light, conf.maxbrightness, conf.minbrightness); if (conf.workmode == 2 || conf.workmode == 3) backlight = calculate_screen_backlight_value (light, conf.maxbacklight, conf.minbacklight); if (verbose) printf ("auto mode "); } else { if (verbose) printf ("manual mode "); if (conf.workmode == 1 || conf.workmode == 3) { if (!screensaver) { if (idletime > conf.idleoff) { if (brightness_restoreflag == 0) { brightness_restore = get_keyboard_brightness_value (); brightness_restoreflag = 1; if (debug == 1 || debug == 3) printf ("brightness_restoreflag(%d) ", brightness_restore); } brightness = conf.minbrightness; } else { brightness = brightness_restore; brightness_restoreflag = 0; if (debug == 1 || debug == 3) printf ("brightness_restored(%d) ", brightness_restore); } } } if (conf.workmode == 2 || conf.workmode == 3) { if (!screensaver) { if (idletime > conf.screenidle) { if (backlight_restoreflag == 0) { backlight_restore = get_screen_backlight_value (); backlight_restoreflag = 1; if (debug == 2 || debug == 3) printf ("backlight_restoreflag(%d) ", backlight_restore); } if (conf.fulldim) backlight = 1; else backlight = conf.minbacklight; } else { backlight = backlight_restore; backlight_restoreflag = 0; if (debug == 2 || debug == 3) printf ("backlight_restored(%d) ", backlight_restore); } } } } if (conf.workmode == 1 || conf.workmode == 3) { if ((conf.idleoff != 0) && (idletime > conf.idleoff)) { brightness = conf.minbrightness; } } if (conf.workmode == 2 || conf.workmode == 3) { if ((conf.screenidle != 0) && (idletime > conf.screenidle)) { if (conf.fulldim) backlight = 1; else backlight = conf.minbacklight; } } if (conf.queryscreensaver) { screensaver = get_screensaver_active (); if (verbose) printf ("screensaver: %d ", screensaver); if (screensaver) { brightness = 0; backlight = conf.minbacklight; } } if (conf.workmode == 1 || conf.workmode == 3) if (verbose) printf ("brightness: %d/%d ", brightness, conf.maxbrightness); if (conf.workmode == 2 || conf.workmode == 3) if (verbose) printf ("backlight: %d/%d ", backlight, conf.maxbacklight); // keyboard brightness if (conf.workmode == 1 || conf.workmode == 3) { if (brightness != brightness_prev) { if (!conf.manualmode) { brightness_restore = get_keyboard_brightness_value (); if (brightness_restore < conf.minbrightness) brightness_restore = conf.minbrightness; if (debug == 1 || debug == 3) printf ("\ncurrent brightness: %d\n", brightness_restore); if ((brightness_restore != brightness_prev) && (brightness_restoreflag)) { if (!conf.ignoreuser) { /* make sure maxbrightness is never <4 */ if (brightness_restore < 4) conf.maxbrightness = 4; else conf.maxbrightness = brightness_restore; if (verbose) printf ("-> Detected user brightness change, setting maxbrightness to %d\n", conf.maxbrightness); brightness_prev = brightness_restore; } else { if (verbose) printf ("-> Ignoring user brightness change, wants to set maxbrightness to %d\n", brightness_restore); } brightness = calculate_keyboard_brightness_value (light, conf. maxbrightness, conf. minbrightness); } brightness_restoreflag = 1; } if (debug == 1 || debug == 3) printf ("-> set keyboard brightness: %d -> %d\n", brightness_prev, brightness); fading (brightness_prev, brightness); usleep (1500); brightness = get_keyboard_brightness_value (); brightness_prev = brightness; } if (!conf.manualmode) { tmp = get_keyboard_brightness_value (); if (tmp != brightness) { if (verbose) printf ("-> Detected user brightness change, current brightness is set to %d\n", tmp); if (conf.ignoreuser) { if (debug == 1 || debug == 3) printf ("\n*** forcing brightness from %d to %d\n", tmp, brightness); fading (tmp, brightness); } } } } // screen backlight if (conf.workmode == 2 || conf.workmode == 3) { if (backlight != backlight_prev) { if (!conf.manualmode) { backlight_restore = get_screen_backlight_value (); if (debug == 2 || debug == 3) printf ("\ncurrent backlight: %d\n", backlight_restore); if ((backlight_restore != backlight_prev) && (backlight_restoreflag)) { if (!conf.ignoreuser) { if (verbose) printf ("-> Detected user backlight change, switching to manualmode\n"); conf.manualmode = 1; backlight_prev = backlight_restore; backlight = backlight_restore; } else { if (verbose) printf ("-> Ignoring user backlight change, wants to set maxbacklight to %d\n", backlight_restore); backlight = calculate_screen_backlight_value (light, conf. maxbacklight, conf. minbacklight); } } backlight_restoreflag = 1; } if (debug == 2 || debug == 3) printf ("-> set screen backlight: %d -> %d\n", backlight_prev, backlight); backlight_fading (backlight_prev, backlight, dbus_backend); usleep (1500); backlight = get_screen_backlight_value (); backlight_prev = backlight; } if (!conf.manualmode) { tmp = get_screen_backlight_value (); if (tmp != backlight) { if (verbose) printf ("-> Detected user backlight change, current backlight is set to %d\n", tmp); if (conf.ignoreuser) { if (debug == 2 || debug == 3) printf ("\n*** forcing backlight from %d to %d\n", tmp, backlight); backlight_fading (tmp, backlight, dbus_backend); } } } } if (verbose) printf ("\n"); usleep (conf.polltime * 1000); } // we should never reach here. //if (conf.idleoff != 0) XCloseDisplay(display); //dbus_g_connection_unref(connection); exit (1); }
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; }
int main (int argc, char **argv) { int res, c, verbose=FALSE; int fan, temp, newpwm, oldpwm=0; pid_t pid; uid_t uid; printf("eeepc-fanctld v%s - (c)2012 Pau Oliva Fora <*****@*****.**>\n",VERSION); while ((c = getopt(argc, argv, "vh?")) != EOF) { switch(c) { case 'v': verbose=TRUE; break; case 'h': printf("usage: eeepc-fanctld [-v]\n"); return 0; break; default: fprintf(stderr,"usage: eeepc-fanctld [-v]\n"); return 1; break; } } uid = getuid(); if (uid != 0) { fprintf(stderr, "Error: this daemon must be run as root user.\n"); return 1; } find_eeepc(); sensors_init(NULL); if (!init_sensor_data()) { fprintf(stderr, "Error: Could not find needed sensors\n"); return 1; } if (!pwm_enable(1)) { fprintf(stderr, "Error: could not enable pwm\n"); return 1; } if (!verbose) { if ((pid = fork()) < 0) exit(1); else if (pid != 0) exit(0); /* daemon running here */ setsid(); res=chdir("/"); if (res != 0) { perror("Error: Could not chdir"); exit(1); } umask(0); } signal_installer(); while(1) { temp=get_temp(); if (verbose) { fan=get_fan(); printf("FAN: %d RPM, TEMP: %dºC\n", fan, temp); } if (temp < 55) newpwm=0; else if(temp < 60) newpwm=(10*255)/100; else if(temp < 65) newpwm=(20*255)/100; else if(temp < 67) newpwm=(30*255)/100; else if(temp < 69) newpwm=(40*255)/100; else if(temp < 74) newpwm=(50*255)/100; else if(temp < 77) newpwm=(60*255)/100; else if(temp < 81) newpwm=(65*255)/100; else if(temp < 85) newpwm=(70*255)/100; else if(temp < 91) newpwm=(80*255)/100; else newpwm=255; if (newpwm != oldpwm) { if(verbose) printf("Changing fan speed from: %d to %d\n", oldpwm, newpwm); set_fan(newpwm); oldpwm=newpwm; } usleep(POLLTIME*1000000); } return 0; }