00001
00048 #include "controller.h"
00049 #include "board.h"
00050 #include "gpio.h"
00051 #include "spi.h"
00052 #include "qt60168.h"
00053 #include "conf_qt60168.h"
00054 #include "cycle_counter.h"
00055
00056 #define CLEAR_PRESSED_STATE(x) controller_state &= ~STATE_##x##_PRESSED
00057 #define CLEAR_RELEASED_STATE(x) controller_state &= ~STATE_##x##_RELEASED
00058 #define SET_PRESSED_STATE(x) controller_state = (controller_state & ~STATE_##x##_RELEASED) | STATE_##x##_PRESSED
00059 #define SET_RELEASED_STATE(x) controller_state = (controller_state & ~STATE_##x##_PRESSED) | STATE_##x##_RELEASED
00060
00061 static enum
00062 {
00063 TOUCH_IDLE = 0,
00064 TOUCH_PRESS = 1,
00065 TOUCH_RELEASE = 2
00066 } touch_states[QT60168_TOUCH_NUMBER_OF_SENSORS];
00067
00068 static enum
00069 {
00070 STATE_IDLE = 0x0000,
00071 STATE_BACK_PRESSED = 0x0001,
00072 STATE_FCT1_PRESSED = 0x0002,
00073 STATE_FCT2_PRESSED = 0x0004,
00074 STATE_FCT3_PRESSED = 0x0008,
00075 STATE_BACK_RELEASED = 0x0010,
00076 STATE_FCT1_RELEASED = 0x0020,
00077 STATE_FCT2_RELEASED = 0x0040,
00078 STATE_FCT3_RELEASED = 0x0080,
00079 STATE_WHEEL_LEFT = 0x0100,
00080 STATE_WHEEL_RIGHT = 0x0200,
00081 STATE_BACK_PRESSING = 0x0400,
00082 STATE_BACK_LONG_PRESS = 0x0800
00083 } controller_state = STATE_IDLE;
00084
00085 static int wheel_step_counter = 0;
00086 static t_cpu_time long_press_timer;
00087 static int controller_cpu_hz;
00088
00089 static inline void set_wheel_right()
00090 {
00091 if (controller_state & STATE_WHEEL_LEFT)
00092 {
00093 controller_state &= ~STATE_WHEEL_LEFT;
00094 wheel_step_counter = 0;
00095 }
00096 controller_state |= STATE_WHEEL_RIGHT;
00097 wheel_step_counter++;
00098 }
00099 static inline void set_wheel_left()
00100 {
00101 if (controller_state & STATE_WHEEL_RIGHT)
00102 {
00103 controller_state &= ~STATE_WHEEL_RIGHT;
00104 wheel_step_counter = 0;
00105 }
00106 controller_state |= STATE_WHEEL_LEFT;
00107 wheel_step_counter++;
00108 }
00109
00110 static void update_controller_state(void)
00111 {
00112
00113 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_0] == TOUCH_RELEASE)
00114 controller_state &= ~STATE_BACK_PRESSING;
00115 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_0] == TOUCH_PRESS)
00116 {
00117 if (!(controller_state & STATE_BACK_PRESSING))
00118 {
00119 controller_state |= STATE_BACK_PRESSING;
00120 cpu_set_timeout(cpu_ms_2_cy(CONTROLLER_LONG_PRESS_TIME_MS, controller_cpu_hz), &long_press_timer);
00121 }
00122 if (cpu_is_timeout(&long_press_timer))
00123 controller_state |= STATE_BACK_LONG_PRESS;
00124 }
00125
00126
00127 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_0] == TOUCH_PRESS)
00128 SET_PRESSED_STATE(BACK);
00129 else if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_0] == TOUCH_RELEASE)
00130 SET_RELEASED_STATE(BACK);
00131
00132 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_1] == TOUCH_PRESS)
00133 SET_PRESSED_STATE(FCT1);
00134 else if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_1] == TOUCH_RELEASE)
00135 SET_RELEASED_STATE(FCT1);
00136
00137 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_2] == TOUCH_PRESS)
00138 SET_PRESSED_STATE(FCT2);
00139 else if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_2] == TOUCH_RELEASE)
00140 SET_RELEASED_STATE(FCT2);
00141
00142 if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_3] == TOUCH_PRESS)
00143 SET_PRESSED_STATE(FCT3);
00144 else if (touch_states[QT60168_TOUCH_SENSOR_BUTTON_3] == TOUCH_RELEASE)
00145 SET_RELEASED_STATE(FCT3);
00146
00147
00148 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_0] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_1] == TOUCH_PRESS)
00149 set_wheel_right();
00150 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_1] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_2] == TOUCH_PRESS)
00151 set_wheel_right();
00152 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_2] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_3] == TOUCH_PRESS)
00153 set_wheel_right();
00154 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_3] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_4] == TOUCH_PRESS)
00155 set_wheel_right();
00156 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_4] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_5] == TOUCH_PRESS)
00157 set_wheel_right();
00158 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_5] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_6] == TOUCH_PRESS)
00159 set_wheel_right();
00160 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_6] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_7] == TOUCH_PRESS)
00161 set_wheel_right();
00162 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_7] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_8] == TOUCH_PRESS)
00163 set_wheel_right();
00164 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_8] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_9] == TOUCH_PRESS)
00165 set_wheel_right();
00166 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_9] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_10] == TOUCH_PRESS)
00167 set_wheel_right();
00168 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_10] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_11] == TOUCH_PRESS)
00169 set_wheel_right();
00170 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_11] == TOUCH_RELEASE && touch_states[QT60168_TOUCH_SENSOR_WHEEL_0] == TOUCH_PRESS)
00171 set_wheel_right();
00172
00173 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_11] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_0] == TOUCH_RELEASE)
00174 set_wheel_left();
00175 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_10] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_11] == TOUCH_RELEASE)
00176 set_wheel_left();
00177 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_9] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_10] == TOUCH_RELEASE)
00178 set_wheel_left();
00179 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_8] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_9] == TOUCH_RELEASE)
00180 set_wheel_left();
00181 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_7] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_8] == TOUCH_RELEASE)
00182 set_wheel_left();
00183 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_6] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_7] == TOUCH_RELEASE)
00184 set_wheel_left();
00185 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_5] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_6] == TOUCH_RELEASE)
00186 set_wheel_left();
00187 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_4] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_5] == TOUCH_RELEASE)
00188 set_wheel_left();
00189 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_3] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_4] == TOUCH_RELEASE)
00190 set_wheel_left();
00191 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_2] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_3] == TOUCH_RELEASE)
00192 set_wheel_left();
00193 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_1] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_2] == TOUCH_RELEASE)
00194 set_wheel_left();
00195 if (touch_states[QT60168_TOUCH_SENSOR_WHEEL_0] == TOUCH_PRESS && touch_states[QT60168_TOUCH_SENSOR_WHEEL_1] == TOUCH_RELEASE)
00196 set_wheel_left();
00197 }
00198
00201 static void qt60168_resources_init(int cpu_hz)
00202 {
00203 static const gpio_map_t QT60168_SPI_GPIO_MAP =
00204 {
00205 {QT60168_SPI_SCK_PIN, QT60168_SPI_SCK_FUNCTION },
00206 {QT60168_SPI_MISO_PIN, QT60168_SPI_MISO_FUNCTION },
00207 {QT60168_SPI_MOSI_PIN, QT60168_SPI_MOSI_FUNCTION },
00208 {QT60168_SPI_NPCS0_PIN, QT60168_SPI_NPCS0_FUNCTION}
00209 };
00210
00211
00212 spi_options_t spiOptions =
00213 {
00214 .reg = QT60168_SPI_NCPS,
00215 .baudrate = QT60168_SPI_MASTER_SPEED,
00216 .bits = QT60168_SPI_BITS,
00217 .spck_delay = 0,
00218 .trans_delay = 0,
00219 .stay_act = 0,
00220 .spi_mode = 3,
00221 .modfdis = 1
00222 };
00223
00224
00225 gpio_enable_module(QT60168_SPI_GPIO_MAP,
00226 sizeof(QT60168_SPI_GPIO_MAP) / sizeof(QT60168_SPI_GPIO_MAP[0]));
00227
00228
00229 spi_initMaster(QT60168_SPI, &spiOptions);
00230
00231
00232 spi_selectionMode(QT60168_SPI, 0, 0, 0);
00233
00234
00235 spi_enable(QT60168_SPI);
00236
00237
00238 spi_setupChipReg(QT60168_SPI, &spiOptions, cpu_hz);
00239 }
00240
00241 Bool controller_key_pressed(void)
00242 {
00243 if (controller_state == STATE_IDLE)
00244 return FALSE;
00245 return TRUE;
00246 }
00247
00248 Bool controller_key_released(void)
00249 {
00250 if (controller_state & STATE_BACK_RELEASED ||
00251 controller_state & STATE_FCT1_RELEASED ||
00252 controller_state & STATE_FCT2_RELEASED ||
00253 controller_state & STATE_FCT3_RELEASED)
00254 return TRUE;
00255 return FALSE;
00256 }
00257
00258 Bool controller_wheel_pressed(void)
00259 {
00260 if (controller_state & STATE_WHEEL_LEFT ||
00261 controller_state & STATE_WHEEL_RIGHT)
00262 return TRUE;
00263 return FALSE;
00264 }
00265
00266 Bool controller_key_back(void)
00267 {
00268 if (controller_state & STATE_BACK_RELEASED)
00269 {
00270 CLEAR_RELEASED_STATE(BACK);
00271 return TRUE;
00272 }
00273 return FALSE;
00274 }
00275
00276 Bool controller_key_reset(void)
00277 {
00278 if (controller_state & STATE_BACK_LONG_PRESS)
00279 {
00280 controller_state &= ~STATE_BACK_LONG_PRESS;
00281 return TRUE;
00282 }
00283 return FALSE;
00284 }
00285
00286 Bool controller_key_fct1(void)
00287 {
00288 if (controller_state & STATE_FCT1_RELEASED)
00289 {
00290 CLEAR_RELEASED_STATE(FCT1);
00291 return TRUE;
00292 }
00293 return FALSE;
00294 }
00295
00296 Bool controller_key_fct2(void)
00297 {
00298 if (controller_state & STATE_FCT2_RELEASED)
00299 {
00300 CLEAR_RELEASED_STATE(FCT2);
00301 return TRUE;
00302 }
00303 return FALSE;
00304 }
00305
00306 Bool controller_key_fct3(void)
00307 {
00308 if (controller_state & STATE_FCT3_RELEASED)
00309 {
00310 CLEAR_RELEASED_STATE(FCT3);
00311 return TRUE;
00312 }
00313 return FALSE;
00314 }
00315
00316 Bool controller_key_fct1_pressed(void)
00317 {
00318 if (controller_state & STATE_FCT1_PRESSED)
00319 return TRUE;
00320 return FALSE;
00321 }
00322
00323 Bool controller_key_fct2_pressed(void)
00324 {
00325 if (controller_state & STATE_FCT2_PRESSED)
00326 return TRUE;
00327 return FALSE;
00328 }
00329
00330 Bool controller_key_fct3_pressed(void)
00331 {
00332 if (controller_state & STATE_FCT3_PRESSED)
00333 return TRUE;
00334 return FALSE;
00335 }
00336
00337 Bool controller_wheel_right(int wheel_inc)
00338 {
00339 if (wheel_step_counter >= wheel_inc && controller_state & STATE_WHEEL_RIGHT)
00340 {
00341 wheel_step_counter -= wheel_inc;
00342 return TRUE;
00343 }
00344 return FALSE;
00345 }
00346
00347 Bool controller_wheel_left(int wheel_inc)
00348 {
00349 if (wheel_step_counter >= wheel_inc && controller_state & STATE_WHEEL_LEFT)
00350 {
00351 wheel_step_counter -= wheel_inc;
00352 return TRUE;
00353 }
00354 return FALSE;
00355 }
00356
00357 void controller_reset(void)
00358 {
00359 controller_state = STATE_IDLE;
00360 wheel_step_counter = 0;
00361 }
00362
00363 void controller_init(int cpu_hz, int hsb_hz, int pba_hz, int pbb_hz)
00364 {
00365 int i;
00366
00367 qt60168_resources_init(cpu_hz);
00368
00369 qt60168_init(cpu_hz);
00370
00371 for (i=0; i<QT60168_TOUCH_NUMBER_OF_SENSORS; i++ )
00372 touch_states[i] = TOUCH_IDLE;
00373 controller_cpu_hz = cpu_hz;
00374 }
00375
00376 void controller_task(void)
00377 {
00378 int i;
00379
00380 for (i=0; i<QT60168_TOUCH_NUMBER_OF_SENSORS; i++ )
00381 {
00382 if (qt60168_is_key_pressed(i))
00383 touch_states[i] = TOUCH_PRESS;
00384 else if (touch_states[i] == TOUCH_PRESS)
00385 touch_states[i] = TOUCH_RELEASE;
00386 else
00387 touch_states[i] = TOUCH_IDLE;
00388 }
00389 update_controller_state();
00390 }