00001 #include "ButtonListener.h"
00002 #include <stdlib.h>
00003 #include <stdio.h>
00004 #include <errno.h>
00005 #include <sys/fcntl.h>
00006 #include <poll.h>
00007 #include <unistd.h>
00008
00009 #include <sstream>
00010
00011 #include "../Event.h"
00012 #include "../Time.h"
00013
00014 namespace FCam {
00015 namespace N900 {
00016
00017 void *button_listener_thread_(void *arg) {
00018 ButtonListener *b = (ButtonListener *)arg;
00019 b->run();
00020 pthread_exit(NULL);
00021 return NULL;
00022 }
00023
00024 ButtonListener *ButtonListener::instance() {
00025 if (!_instance) {
00026 _instance = new ButtonListener;
00027 }
00028 return _instance;
00029 }
00030
00031 ButtonListener::ButtonListener() : stop(false) {
00032 pthread_attr_t attr;
00033 struct sched_param param;
00034
00035
00036
00037 param.sched_priority = sched_get_priority_max(SCHED_OTHER);
00038
00039 pthread_attr_init(&attr);
00040
00041 if ((errno =
00042 -(pthread_attr_setschedparam(&attr, ¶m) ||
00043 pthread_attr_setschedpolicy(&attr, SCHED_OTHER) ||
00044 pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) ||
00045 pthread_create(&thread, &attr, button_listener_thread_, this)))) {
00046 perror("Error creating button listener thread");
00047 }
00048
00049 }
00050
00051 ButtonListener::~ButtonListener() {
00052 stop = true;
00053 pthread_join(thread, NULL);
00054 }
00055
00056 void ButtonListener::run() {
00057 #define BUTTONS 4
00058
00059 const char *fnames[BUTTONS] = {"/sys/devices/platform/gpio-switch/cam_shutter/state",
00060 "/sys/devices/platform/gpio-switch/cam_focus/state",
00061 "/sys/devices/platform/gpio-switch/cam_launch/state",
00062 "/sys/devices/platform/gpio-switch/slide/state"};
00063
00064 char buf[81];
00065
00066 bool state[BUTTONS];
00067
00068 int event[BUTTONS*2] = {Event::N900LensOpened,
00069 Event::N900LensClosed,
00070 Event::FocusPressed,
00071 Event::FocusReleased,
00072 Event::ShutterPressed,
00073 Event::ShutterReleased,
00074 Event::N900SlideOpened,
00075 Event::N900SlideClosed};
00076
00077 int rval;
00078 struct pollfd fds[BUTTONS];
00079 for (int i = 0; i < BUTTONS; i++) {
00080 fds[i].fd = open(fnames[i], O_RDONLY);
00081 fds[i].events = POLLPRI;
00082 fds[i].revents = 0;
00083 }
00084
00085
00086 for (int i = 0; i < BUTTONS; i++) {
00087 rval = read(fds[i].fd, &buf, 80);
00088 buf[rval] = 0;
00089 switch (buf[0]) {
00090 case 'c':
00091 case 'i':
00092 state[i] = false;
00093 break;
00094 case 'o':
00095 case 'a':
00096 state[i] = true;
00097 break;
00098 default:
00099 printf("ButtonListener: Unknown state: %s\n", buf);
00100 }
00101 }
00102
00103 while (!stop) {
00104
00105 rval = poll(fds, BUTTONS, 1000);
00106 if (rval == -1) {
00107 perror("poll");
00108 break;
00109 }
00110 if (rval == 0) continue;
00111
00112 for (int i = 0; i < BUTTONS; i++) {
00113 if (fds[i].revents & POLLPRI) {
00114 close(fds[i].fd);
00115 fds[i].fd = open(fnames[i], O_RDONLY, 0);
00116 rval = read(fds[i].fd, &buf, 80);
00117 buf[rval] = 0;
00118 switch (buf[0]) {
00119 case 'c':
00120 case 'i':
00121 if (state[i] != false) {
00122 state[i] = false;
00123 Event e;
00124 e.type = event[i*2+1];
00125 e.iData = 0;
00126 e.time = Time::now();
00127 postEvent(e);
00128 }
00129 break;
00130 case 'o':
00131 case 'a':
00132 if (state[i] != true) {
00133 state[i] = true;
00134 Event e;
00135 e.type = event[i*2];
00136 e.iData = 0;
00137 e.time = Time::now();
00138 postEvent(e);
00139 }
00140 break;
00141 default:
00142 printf("ButtonListener: Unknown state: %s\n", buf);
00143 }
00144 }
00145 }
00146 }
00147
00148 for (int i = 0; i < BUTTONS; i++) {
00149 close(fds[i].fd);
00150 }
00151 }
00152
00153 int event[BUTTONS*2] = {Event::N900LensOpened,
00154 Event::N900LensClosed,
00155 Event::FocusPressed,
00156 Event::FocusReleased,
00157 Event::ShutterPressed,
00158 Event::ShutterReleased,
00159 Event::N900SlideOpened,
00160 Event::N900SlideClosed};
00161
00162 std::string ButtonListener::getEventString(const Event &e) const {
00163 std::string str;
00164 switch (e.type) {
00165 case Event::ShutterPressed:
00166 str = "Shutter button pressed";
00167 return str;
00168 case Event::ShutterReleased:
00169 str = "Shutter button released";
00170 return str;
00171 case Event::FocusPressed:
00172 str = "Focus button pressed";
00173 return str;
00174 case Event::FocusReleased:
00175 str = "Focus button released";
00176 return str;
00177 case Event::N900LensOpened:
00178 str = "Lens cover opened";
00179 return str;
00180 case Event::N900LensClosed:
00181 str = "Lens cover closed";
00182 return str;
00183 case Event::N900SlideOpened:
00184 str = "Keyboard slide opened";
00185 return str;
00186 case Event::N900SlideClosed:
00187 str = "Keyboard slide closed";
00188 return str;
00189 };
00190
00191 str = "Unknown N900 Button Event";
00192 return str;
00193 }
00194
00195 ButtonListener *ButtonListener::_instance = NULL;
00196 }
00197 }
00198
00199