int main(void) { int ifd = openfd(); if (ifd < 0) { ALOGE("could not find any tablet mode switch, exiting."); return -1; } sleep(10); //wait some time or otherwise EventHub might not pick up our events correctly!? int ufd = open("/dev/uinput", O_WRONLY | O_NDELAY); if (ufd >= 0) { struct uinput_user_dev ud; memset(&ud, 0, sizeof(struct uinput_user_dev)); strcpy(ud.name, "Android Tablet Lid Switch"); write(ufd, &ud, sizeof(struct uinput_user_dev)); ioctl(ufd, UI_SET_EVBIT, EV_SW); ioctl(ufd, UI_SET_SWBIT, SW_LID); ioctl(ufd, UI_DEV_CREATE, 0); } else { ALOGE("could not open uinput device: %s", strerror(errno)); return -1; } // send initial switch state unsigned long sw_state[NBITS(SW_TABLET_MODE+1)]; memset(sw_state, 0, sizeof(sw_state)); if (ioctl(ifd, EVIOCGSW(sizeof(sw_state)), sw_state) >= 0) { send_switch(ufd, test_bit(SW_TABLET_MODE, sw_state) ? 1 : 0); } // read events and pass them on modified while (1) { struct input_event iev; size_t res = read(ifd, &iev, sizeof(struct input_event)); if (res < sizeof(struct input_event)) { ALOGW("insufficient input data(%d)? fd=%d", res, ifd); continue; } //LOGV("type=%d scancode=%d value=%d from fd=%d", iev.type, iev.code, iev.value, ifd); if (iev.type == EV_SW && iev.code == SW_TABLET_MODE) { send_switch(ufd, iev.value); } } return 0; }
void cam_power_show(void) { if(cams[ctrl_selected_cam].power_state) { lcd_gotoxy(0,3); lcd_putc('>'); lcd_gotoxy(3,3); lcd_putc('<'); lcd_putc(' '); lcd_gotoxy(8,3); lcd_putc(' '); } else { lcd_gotoxy(0,3); lcd_putc(' '); lcd_gotoxy(3,3); lcd_putc(' '); lcd_putc('>'); lcd_gotoxy(8,3); lcd_putc('<'); } if(cams[ctrl_selected_cam].button_state) { cams[ctrl_selected_cam].button_state=1; lcd_gotoxy(10,3); lcd_putc('>'); lcd_gotoxy(14,3); lcd_putc('<'); } else { lcd_gotoxy(10,3); lcd_putc(' '); lcd_gotoxy(14,3); lcd_putc(' '); } send_switch(); }