blanker.c
Go to the documentation of this file.00001
00039 #include "blanker.h"
00040 #include "hw/hw_blanker.h"
00041
00042 #include <drv/kbd.h>
00043 #include <drv/timer.h>
00044
00045
00046 #define BLK_BLANKTIMEOUT (15 * 1000)
00047
00048
00049 #warning FIXME:Revise me!
00050
00052 static KbdHandler blk_KbdHandler;
00053
00055 static ticks_t blk_lastevent;
00056
00058 static bool blk_enabled;
00059
00061 static bool blk_active;
00062
00063
00064 static bool blk_on(void)
00065 {
00066 if (!blk_active)
00067 {
00068 blk_active = true;
00069 BLK_LCDOFF;
00070 }
00071 return true;
00072 }
00073
00074
00075 static void blk_off(void)
00076 {
00077 if (blk_active)
00078 {
00079 blk_active = false;
00080 BLK_LCDON;
00081 }
00082 }
00083
00084
00085 void blk_retrigger(void)
00086 {
00087 blk_lastevent = timer_clock();
00088 blk_off();
00089 }
00090
00091 #if 0
00092
00095 static void blk_hack(void)
00096 {
00097 static signed char blk_colstart[CONFIG_LCD_COLS];
00098 UBYTE row, col;
00099
00100
00101 if (rand()%3 == 0)
00102 {
00103
00104 col = rand() % CONFIG_LCD_COLS;
00105 blk_colstart[col] += rand() % 12 - 5;
00106 }
00107
00108 for (col = 0; col < CONFIG_LCD_COLS; ++col)
00109 {
00110 if (blk_colstart[col] > 0)
00111 {
00112 --blk_colstart[col];
00113
00114
00115 for(row = CONFIG_LCD_ROWS-1; row; --row)
00116 {
00117 lcd_SetAddr(blk_layer, LCD_POS(col,row));
00118 lcd_PutChar(blk_layer->Buf[LCD_POS(col,row-1)], blk_layer);
00119 }
00120
00121
00122 lcd_SetAddr(blk_layer, LCD_POS(col,0));
00123 lcd_PutChar((char)(rand() % 127 + 128), blk_layer);
00124 }
00125 else if (blk_colstart[col] < 0)
00126 {
00127 ++blk_colstart[col];
00128
00129
00130 for(row = 0; row < CONFIG_LCD_ROWS; ++row)
00131 {
00132 if (blk_layer->Buf[LCD_POS(col,row)] != ' ')
00133 {
00134 lcd_SetAddr(blk_layer, LCD_POS(col,row));
00135 lcd_PutChar(' ', blk_layer);
00136 break;
00137 }
00138 }
00139 }
00140 }
00141 }
00142 #endif
00143
00144
00145 static keymask_t blk_handlerFunc(keymask_t key)
00146 {
00147
00148 static keymask_t offkey;
00149
00150 ticks_t now = timer_clock();
00151
00152
00153 if (key != 0)
00154 {
00155 blk_lastevent = now;
00156 if (blk_active)
00157 {
00158 blk_off();
00159
00160
00161 offkey = key;
00162 key = 0;
00163 }
00164 else if (key == offkey)
00165 {
00166
00167 key = 0;
00168 }
00169
00170
00171 return key;
00172 }
00173
00174
00175 offkey = 0;
00176
00177
00178 if (now - blk_lastevent > ms_to_ticks(BLK_BLANKTIMEOUT))
00179 {
00180
00181 if (!blk_active && !blk_on())
00182 return 0;
00183
00184 #if 0
00185
00186 blk_hack();
00187 #endif
00188 }
00189
00190 return 0;
00191 }
00192
00193
00194 void blk_enable(void)
00195 {
00196 if (!blk_enabled)
00197 {
00198 blk_active = false;
00199 blk_lastevent = timer_clock();
00200
00201
00202 blk_KbdHandler.hook = blk_handlerFunc;
00203 blk_KbdHandler.pri = 100;
00204 blk_KbdHandler.flags = KHF_RAWKEYS;
00205 kbd_addHandler(&blk_KbdHandler);
00206
00207 blk_enabled = true;
00208 }
00209 }
00210
00211
00212 void blk_disable(void)
00213 {
00214 if (blk_enabled)
00215 {
00216 kbd_remHandler(&blk_KbdHandler);
00217 blk_off();
00218 blk_enabled = false;
00219 }
00220 }
00221