1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <fcntl.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <time.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/select.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/inotify.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//#include <linux/input.h> // this does not compile 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// from <linux/input.h> 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct input_event { 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval time; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __u16 type; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __u16 code; 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project __s32 value; 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global keystate */ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */ 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */ 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */ 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */ 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */ 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */ 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */ 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Event types 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_SYN 0x00 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_KEY 0x01 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_REL 0x02 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_ABS 0x03 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_MSC 0x04 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_SW 0x05 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_LED 0x11 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_SND 0x12 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_REP 0x14 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_FF 0x15 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_PWR 0x16 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_FF_STATUS 0x17 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define EV_MAX 0x1f 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define KEY_POWER 116 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define KEY_SLEEP 142 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define SW_0 0x00 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// end <linux/input.h> 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct notify_entry { 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int id; 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int (*handler)(struct notify_entry *entry, struct inotify_event *event); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *filename; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint charging_state_notify_handler(struct notify_entry *entry, struct inotify_event *event) 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project static int state = -1; 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int last_state; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[40]; 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int read_len; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int fd; 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project last_state = state; 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd = open(entry->filename, O_RDONLY); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project read_len = read(fd, buf, sizeof(buf)); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(read_len > 0) { 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("charging_state_notify_handler: \"%s\"\n", buf); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project state = !(strncmp(buf, "Unknown", 7) == 0 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project || strncmp(buf, "Discharging", 11) == 0); 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(fd); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("charging_state_notify_handler: %d -> %d\n", last_state, state); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return state > last_state; 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct notify_entry watched_files[] = { 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .filename = "/sys/android_power/charging_state", 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project .handler = charging_state_notify_handler 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint call_notify_handler(struct inotify_event *event) 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int start, i; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start = event->wd - watched_files[0].id; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(start >= ARRAY_SIZE(watched_files)) 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project start = 0; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : ""); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = start; i < ARRAY_SIZE(watched_files); i++) { 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event->wd == watched_files[i].id) { 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(watched_files[i].handler) { 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return watched_files[i].handler(&watched_files[i], event); 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; i < start; i++) { 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event->wd == watched_files[i].id) { 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(watched_files[i].handler) { 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return watched_files[i].handler(&watched_files[i], event); 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint handle_inotify_event(int nfd) 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int wake_up = 0; 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct inotify_event *event; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char event_buf[512]; 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event_pos = 0; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = read(nfd, event_buf, sizeof(event_buf)); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < (int)sizeof(*event)) { 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(errno == EINTR) 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not get event, %s\n", strerror(errno)); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("got %d bytes of event information\n", res); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(res >= (int)sizeof(*event)) { 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event_size; 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event = (struct inotify_event *)(event_buf + event_pos); 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project wake_up |= call_notify_handler(event); 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event_size = sizeof(*event) + event->len; 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res -= event_size; 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event_pos += event_size; 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return wake_up; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint powerd_main(int argc, char *argv[]) 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int c; 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int i; 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int res; 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval tv; 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int eventfd; 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int notifyfd; 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int powerfd; 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int powerfd_is_sleep; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int user_activity_fd; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int acquire_partial_wake_lock_fd; 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int acquire_full_wake_lock_fd; 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int release_wake_lock_fd; 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *eventdev = "/dev/input/event0"; 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_sleepdev = "/sys/android_power/request_sleep"; 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_autooff_dev = "/sys/android_power/auto_off_timeout"; 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_user_activity_dev = "/sys/android_power/last_user_activity"; 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_acquire_partial_wake_lock_dev = "/sys/android_power/acquire_partial_wake_lock"; 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_acquire_full_wake_lock_dev = "/sys/android_power/acquire_full_wake_lock"; 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *android_release_wake_lock_dev = "/sys/android_power/release_wake_lock"; 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *powerdev = "/sys/power/state"; 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char suspendstring[] = "standby"; 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char wakelockstring[] = "powerd"; 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fd_set rfds; 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct input_event event; 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct input_event light_event; 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct input_event light_event2; 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int gotkey = 1; 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t idle_time = 5; 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char *idle_time_string = "5"; 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t lcd_light_time = 0; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project time_t key_light_time = 0; 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int verbose = 1; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int event_sleep = 0; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int got_power_key_down = 0; 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct timeval power_key_down_time = { 0, 0 }; 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.type = EV_LED; 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.code = 4; // bright lcd backlight 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.value = 0; // light off -- sleep after timeout 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.type = EV_LED; 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.code = 8; // keyboard backlight 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.value = 0; // light off -- sleep after timeout 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = getopt(argc, argv, "e:ni:vql:k:"); 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c == EOF) 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c) { 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'e': 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project eventdev = optarg; 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'n': 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gotkey = 0; 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'i': 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project idle_time = atoi(optarg); 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project idle_time_string = optarg; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'v': 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project verbose = 2; 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'q': 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project verbose = 0; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'l': 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lcd_light_time = atoi(optarg); 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 'k': 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_light_time = atoi(optarg); 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case '?': 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "%s: invalid option -%c\n", 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[0], optopt); 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(1); 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (1); 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(optind != argc) { 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"%s [-e eventdev]\n", argv[0]); 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project eventfd = open(eventdev, O_RDWR | O_NONBLOCK); 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(eventfd < 0) { 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not open %s, %s\n", eventdev, strerror(errno)); 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(key_light_time >= lcd_light_time) { 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project lcd_light_time = key_light_time + 1; 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"lcd bright backlight time must be longer than keyboard backlight time.\n" 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "Setting lcd bright backlight time to %ld seconds\n", lcd_light_time); 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project user_activity_fd = open(android_user_activity_dev, O_RDWR); 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(user_activity_fd >= 0) { 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int auto_off_fd = open(android_autooff_dev, O_RDWR); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(auto_off_fd, idle_time_string, strlen(idle_time_string)); 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project close(auto_off_fd); 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project powerfd = open(android_sleepdev, O_RDWR); 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(powerfd >= 0) { 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project powerfd_is_sleep = 1; 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(verbose > 0) 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Using android sleep dev: %s\n", android_sleepdev); 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project powerfd_is_sleep = 0; 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project powerfd = open(powerdev, O_RDWR); 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(powerfd >= 0) { 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(verbose > 0) 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Using linux power dev: %s\n", powerdev); 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(powerfd < 0) { 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not open %s, %s\n", powerdev, strerror(errno)); 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project notifyfd = inotify_init(); 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(notifyfd < 0) { 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "inotify_init failed, %s\n", strerror(errno)); 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fcntl(notifyfd, F_SETFL, O_NONBLOCK | fcntl(notifyfd, F_GETFL)); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for(i = 0; i < ARRAY_SIZE(watched_files); i++) { 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project watched_files[i].id = inotify_add_watch(notifyfd, watched_files[i].filename, IN_MODIFY); 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Watching %s, id %d\n", watched_files[i].filename, watched_files[i].id); 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project acquire_partial_wake_lock_fd = open(android_acquire_partial_wake_lock_dev, O_RDWR); 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project acquire_full_wake_lock_fd = open(android_acquire_full_wake_lock_dev, O_RDWR); 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project release_wake_lock_fd = open(android_release_wake_lock_dev, O_RDWR); 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(user_activity_fd >= 0) { 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project idle_time = 60*60*24; // driver handles real timeout 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(gotkey) { 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = idle_time; 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_usec = 0; 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = 0; 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_usec = 500000; 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(1) { 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FD_ZERO(&rfds); 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //FD_SET(0, &rfds); 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FD_SET(eventfd, &rfds); 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FD_SET(notifyfd, &rfds); 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = select(((notifyfd > eventfd) ? notifyfd : eventfd) + 1, &rfds, NULL, NULL, &tv); 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < 0) { 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "select failed, %s\n", strerror(errno)); 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res == 0) { 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(light_event2.value == 1) 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto light2_off; 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(light_event.value == 1) 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto light_off; 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(user_activity_fd < 0) { 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(gotkey && verbose > 0) 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Idle - sleep\n"); 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!gotkey && verbose > 1) 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Reenter sleep\n"); 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto sleep; 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = 60*60*24; 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_usec = 0; 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res > 0) { 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //if(FD_ISSET(0, &rfds)) { 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // printf("goto data on stdin quit\n"); 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // return 0; 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //} 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(FD_ISSET(notifyfd, &rfds)) { 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(acquire_partial_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(handle_inotify_event(notifyfd) > 0) { 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(acquire_full_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(release_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(FD_ISSET(eventfd, &rfds)) { 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(acquire_partial_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project res = read(eventfd, &event, sizeof(event)); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(res < (int)sizeof(event)) { 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "could not get event\n"); 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(release_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event.type == EV_PWR && event.code == KEY_SLEEP) { 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project event_sleep = event.value; 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event.type == EV_KEY || (event.type == EV_SW && event.code == SW_0 && event.value == 1)) { 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gotkey = 1; 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(user_activity_fd >= 0) { 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[32]; 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = sprintf(buf, "%ld%06lu000", event.time.tv_sec, event.time.tv_usec); 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(user_activity_fd, buf, len); 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(lcd_light_time | key_light_time) { 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = key_light_time; 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.value = 1; 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event, sizeof(light_event)); 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.value = 1; 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event2, sizeof(light_event2)); 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = idle_time; 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_usec = 0; 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(verbose > 1) 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("got %s %s %d%s\n", event.type == EV_KEY ? "key" : "switch", event.value ? "down" : "up", event.code, event_sleep ? " from sleep" : ""); 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event.code == KEY_POWER) { 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event.value == 0) { 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int tmp_got_power_key_down = got_power_key_down; 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project got_power_key_down = 0; 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(tmp_got_power_key_down) { 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // power key released 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(verbose > 0) 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Power key released - sleep\n"); 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(release_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto sleep; 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if(event_sleep == 0) { 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project got_power_key_down = 1; 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project power_key_down_time = event.time; 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(event.type == EV_SW && event.code == SW_0 && event.value == 0) { 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(verbose > 0) 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("Flip closed - sleep\n"); 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project power_key_down_time = event.time; 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(release_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto sleep; 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(release_wake_lock_fd, wakelockstring, sizeof(wakelockstring) - 1); 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(0) { 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlight_off: 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.value = 0; 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event, sizeof(light_event)); 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = idle_time - lcd_light_time; 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(0) { 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlight2_off: 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.value = 0; 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event2, sizeof(light_event2)); 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = lcd_light_time - key_light_time; 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(0) { 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsleep: 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(light_event.value == 1) { 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event.value = 0; 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event, sizeof(light_event)); 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project light_event2.value = 0; 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(eventfd, &light_event2, sizeof(light_event2)); 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = idle_time - lcd_light_time; 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(powerfd_is_sleep) { 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char buf[32]; 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int len; 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project len = sprintf(buf, "%ld%06lu000", power_key_down_time.tv_sec, power_key_down_time.tv_usec); 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(powerfd, buf, len); 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project write(powerfd, suspendstring, sizeof(suspendstring) - 1); 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gotkey = 0; 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_sec = 0; 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tv.tv_usec = 500000; 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 442