summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDima Zavin2011-10-12 18:16:05 -0500
committerDima Zavin2011-10-12 18:16:07 -0500
commit2471a6a3956c591b3979b9b73a0d68f3b214da57 (patch)
tree9728f0b6300d69b064b2195cd2214589bdd18b91
parentd11e1a0278c602c761ac37d843926e1eba5a63f1 (diff)
downloadplatform-system-core-2471a6a3956c591b3979b9b73a0d68f3b214da57.tar.gz
platform-system-core-2471a6a3956c591b3979b9b73a0d68f3b214da57.tar.xz
platform-system-core-2471a6a3956c591b3979b9b73a0d68f3b214da57.zip
charger: sync with the current key state on boot
If the power key was down when we booted, we would not have gotten the down event and thus the device would not have rebooted until the user released and pressed it again. Change-Id: Iecb8c3dba773bce4647748715d056e8e1d77f7e0 Signed-off-by: Dima Zavin <dima@android.com>
-rw-r--r--charger/charger.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/charger/charger.c b/charger/charger.c
index ad0aab761..b63312cc2 100644
--- a/charger/charger.c
+++ b/charger/charger.c
@@ -745,30 +745,40 @@ static void update_screen_state(struct charger *charger, int64_t now)
745 } 745 }
746} 746}
747 747
748static void update_input_state(struct charger *charger, 748static int set_key_callback(int code, int value, void *data)
749 struct input_event *ev,
750 int64_t now)
751{ 749{
752 int down = !!ev->value; 750 struct charger *charger = data;
751 int64_t now = curr_time_ms();
752 int down = !!value;
753 753
754 if (ev->type != EV_KEY || ev->code > KEY_MAX) 754 if (code > KEY_MAX)
755 return; 755 return -1;
756 756
757 /* only record the down even timestamp, as the amount 757 /* only record the down even timestamp, as the amount
758 * of time the key spent not being pressed is not useful */ 758 * of time the key spent not being pressed is not useful */
759 if (down) 759 if (down)
760 charger->keys[ev->code].timestamp = now; 760 charger->keys[code].timestamp = now;
761 charger->keys[ev->code].down = down; 761 charger->keys[code].down = down;
762 charger->keys[ev->code].pending = true; 762 charger->keys[code].pending = true;
763 if (down) { 763 if (down) {
764 LOGV("[%lld] key[%d] down\n", now, ev->code); 764 LOGV("[%lld] key[%d] down\n", now, code);
765 } else { 765 } else {
766 int64_t duration = now - charger->keys[ev->code].timestamp; 766 int64_t duration = now - charger->keys[code].timestamp;
767 int64_t secs = duration / 1000; 767 int64_t secs = duration / 1000;
768 int64_t msecs = duration - secs * 1000; 768 int64_t msecs = duration - secs * 1000;
769 LOGV("[%lld] key[%d] up (was down for %lld.%lldsec)\n", now, 769 LOGV("[%lld] key[%d] up (was down for %lld.%lldsec)\n", now,
770 ev->code, secs, msecs); 770 code, secs, msecs);
771 } 771 }
772
773 return 0;
774}
775
776static void update_input_state(struct charger *charger,
777 struct input_event *ev)
778{
779 if (ev->type != EV_KEY)
780 return;
781 set_key_callback(ev->code, ev->value, charger);
772} 782}
773 783
774static void set_next_key_check(struct charger *charger, 784static void set_next_key_check(struct charger *charger,
@@ -876,7 +886,7 @@ static int input_callback(int fd, short revents, void *data)
876 ret = ev_get_input(fd, revents, &ev); 886 ret = ev_get_input(fd, revents, &ev);
877 if (ret) 887 if (ret)
878 return -1; 888 return -1;
879 update_input_state(charger, &ev, curr_time_ms()); 889 update_input_state(charger, &ev);
880 return 0; 890 return 0;
881} 891}
882 892
@@ -949,6 +959,8 @@ int main(int argc, char **argv)
949 } 959 }
950 } 960 }
951 961
962 ev_sync_key_state(set_key_callback, charger);
963
952 gr_fb_blank(true); 964 gr_fb_blank(true);
953 965
954 charger->next_screen_transition = now - 1; 966 charger->next_screen_transition = now - 1;