00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <remote.h>
00029
00030 #if defined(CONF_LR_HANDLER)
00031
00032 #include <sys/lcd.h>
00033 #include <unistd.h>
00034 #include <lnp/lnp.h>
00035 #include <time.h>
00036 #include <dmotor.h>
00037 #include <dsound.h>
00038 #include <conio.h>
00039 #include <tm.h>
00040
00042
00043
00044
00046
00047 time_t lr_timeoff;
00048 unsigned int lr_curkeys;
00049
00050 unsigned int lr_data;
00051 int lr_dataready = 0;
00052
00053 lr_handler_t lr_handler;
00054 tid_t lr_tid;
00055
00057
00058
00059
00061
00063 void lr_getdata(unsigned int x)
00064 {
00065
00066 if (lr_dataready == 0)
00067 {
00068 lr_data = x;
00069 lr_dataready = 1;
00070 }
00071
00072
00073 lr_timeoff = get_system_up_time() + LR_TIMEOUT;
00074 }
00075
00076
00078 void lr_process(unsigned int lr_keys)
00079 {
00080 unsigned int keys_on, keys_off, common_keys, k;
00081
00082
00083 if (lr_keys != lr_curkeys) {
00084
00085
00086 common_keys = (lr_keys & lr_curkeys);
00087 keys_on = lr_keys & ~common_keys;
00088 keys_off = lr_curkeys & ~common_keys;
00089
00090
00091 if (lr_handler) {
00092 for (k=1; k; k<<=1) {
00093 if (keys_on & k)
00094 lr_handler(LREVT_KEYON,k);
00095 if (keys_off & k)
00096 lr_handler(LREVT_KEYOFF,k);
00097 }
00098 }
00099
00100
00101 lr_curkeys = lr_keys;
00102 }
00103 return;
00104 }
00105
00106 wakeup_t lr_waitdata(wakeup_t data)
00107 {
00108
00109 if (get_system_up_time() > lr_timeoff && lr_curkeys != 0) {
00110 lr_data = 0;
00111 lr_dataready = 1;
00112 }
00113
00114
00115 return lr_dataready;
00116 }
00117
00119 int lr_thread(int argc, char *argv[]) {
00120 unsigned int lr_keys;
00121 while(!shutdown_requested()) {
00122 if (wait_event(&lr_waitdata, 0) != 0) {
00123
00124 lr_keys = lr_data;
00125
00126 lr_dataready = 0;
00127
00128 lr_process(lr_keys);
00129 }
00130 }
00131 return 0;
00132 }
00133
00135 void lr_init()
00136 {
00137 lnp_remote_set_handler(lr_getdata);
00138 return;
00139 }
00140
00141
00143 void lr_startup()
00144 {
00145
00146 lr_curkeys = 0;
00147 lr_timeoff = get_system_up_time() + LR_TIMEOUT;
00148 lr_handler = NULL;
00149
00150
00151 lr_tid = execi(&lr_thread,0,0,PRIO_HIGHEST,DEFAULT_STACK_SIZE);
00152 lr_init();
00153
00154 return;
00155 }
00156
00158 void lr_shutdown()
00159 {
00160
00161 lnp_remote_set_handler(LNP_DUMMY_REMOTE);
00162 lr_set_handler(LR_DUMMY_HANDLER);
00163
00164
00165 kill(lr_tid);
00166
00167 return;
00168 }
00169
00170 #endif // CONF_LR_HANDLER