Exemple #1
0
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);
}
Exemple #2
0
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;
}
Exemple #3
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;
}