Trackball based on the NXP LPC11U24 and the ADNS-9500
Dependencies: ADNS9500 USBDevice mbed 25LCxxx_SPI
main.h@8:5674f5ab61cd, 2013-03-14 (annotated)
- Committer:
- xxann5
- Date:
- Thu Mar 14 13:48:14 2013 +0000
- Revision:
- 8:5674f5ab61cd
- Parent:
- 7:d6ee49a89009
* support for 4th and 5th buttons.; * support for horizontal scrolling.; * support for 16bit x and y coordinates.; * added dispatch table for buttons. They are now programmable.; * support for programming the eeprom
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
xxann5 | 8:5674f5ab61cd | 1 | /* |
xxann5 | 8:5674f5ab61cd | 2 | * loststone is free sofware: you can redistribute it and/or modify |
xxann5 | 8:5674f5ab61cd | 3 | * it under the terms of the GNU General Public License 3 as published by |
xxann5 | 8:5674f5ab61cd | 4 | * the Free Software Foundation. |
xxann5 | 8:5674f5ab61cd | 5 | * |
xxann5 | 8:5674f5ab61cd | 6 | * loststone is distributed in the hope that it will be useful, |
xxann5 | 8:5674f5ab61cd | 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
xxann5 | 8:5674f5ab61cd | 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
xxann5 | 8:5674f5ab61cd | 9 | * GNU General Public License for more details. |
xxann5 | 8:5674f5ab61cd | 10 | * |
xxann5 | 8:5674f5ab61cd | 11 | * You should have received a copy of the GNU General Public License |
xxann5 | 8:5674f5ab61cd | 12 | * along with loststone. If not, see <http://www.gnu.org/licenses/gpl.txt>. |
xxann5 | 8:5674f5ab61cd | 13 | * |
xxann5 | 8:5674f5ab61cd | 14 | * Copyright (c) 2012-2013 Chris Majoros(chris@majoros.us), GNU3 |
xxann5 | 8:5674f5ab61cd | 15 | */ |
xxann5 | 6:4cb2c9a3abcd | 16 | |
xxann5 | 5:c7056267daa7 | 17 | #include "mbed.h" |
xxann5 | 5:c7056267daa7 | 18 | #include "USBHID.h" |
xxann5 | 5:c7056267daa7 | 19 | #include "USBMouse.h" |
xxann5 | 5:c7056267daa7 | 20 | #include "Ser25lcxxx.h" |
xxann5 | 5:c7056267daa7 | 21 | |
xxann5 | 8:5674f5ab61cd | 22 | #include <stdint.h> |
xxann5 | 7:d6ee49a89009 | 23 | |
xxann5 | 8:5674f5ab61cd | 24 | #define ADNS9500_SROM_91 |
xxann5 | 8:5674f5ab61cd | 25 | #define ADNS9500_CRCHI (0xBE) |
xxann5 | 8:5674f5ab61cd | 26 | #define ADNS9500_CRCLO (0xEF) |
xxann5 | 8:5674f5ab61cd | 27 | #define ADNS9500_ID (0x56) |
xxann5 | 8:5674f5ab61cd | 28 | #define ADNS6010_FIRMWARE_CRC (0xBEEF) |
xxann5 | 8:5674f5ab61cd | 29 | #define ADNS9500_FIRMWARE_LEN 3070 |
xxann5 | 7:d6ee49a89009 | 30 | |
xxann5 | 8:5674f5ab61cd | 31 | #include "adns9500.hpp" |
xxann5 | 5:c7056267daa7 | 32 | |
xxann5 | 5:c7056267daa7 | 33 | |
xxann5 | 7:d6ee49a89009 | 34 | #define UINT16(ub, lb) (uint16_t)(((ub & 0xff) << 8) | (lb & 0xff)) |
xxann5 | 7:d6ee49a89009 | 35 | #define INT16(ub, lb) (int16_t)(((ub & 0xff) << 8) | (lb & 0xff)) |
xxann5 | 8:5674f5ab61cd | 36 | |
xxann5 | 8:5674f5ab61cd | 37 | #define SETTINGS_BASE 0x00 |
xxann5 | 8:5674f5ab61cd | 38 | #define PROFILE_BASE 0xff |
xxann5 | 8:5674f5ab61cd | 39 | #define PROFILE_LEN 0x13 |
xxann5 | 8:5674f5ab61cd | 40 | |
xxann5 | 8:5674f5ab61cd | 41 | #define MBED |
xxann5 | 8:5674f5ab61cd | 42 | |
xxann5 | 8:5674f5ab61cd | 43 | typedef void (*fn)(void); |
xxann5 | 8:5674f5ab61cd | 44 | |
xxann5 | 8:5674f5ab61cd | 45 | enum cli_actions { |
xxann5 | 8:5674f5ab61cd | 46 | SET = 0x01, |
xxann5 | 8:5674f5ab61cd | 47 | GET = 0x02, |
xxann5 | 8:5674f5ab61cd | 48 | LOAD_DATA = 0x03, |
xxann5 | 8:5674f5ab61cd | 49 | GET_DATA = 0x04, |
xxann5 | 8:5674f5ab61cd | 50 | CLEAR = 0x05, |
xxann5 | 8:5674f5ab61cd | 51 | INIT = 0x06 |
xxann5 | 8:5674f5ab61cd | 52 | }; |
xxann5 | 8:5674f5ab61cd | 53 | |
xxann5 | 8:5674f5ab61cd | 54 | enum cli_replies { |
xxann5 | 8:5674f5ab61cd | 55 | retval = 0x01, |
xxann5 | 8:5674f5ab61cd | 56 | message = 0x02 |
xxann5 | 8:5674f5ab61cd | 57 | }; |
xxann5 | 5:c7056267daa7 | 58 | |
xxann5 | 8:5674f5ab61cd | 59 | enum buttons { |
xxann5 | 8:5674f5ab61cd | 60 | BUTTON_LEFT = 0x00, //explisitly showing we start at zero |
xxann5 | 8:5674f5ab61cd | 61 | BUTTON_MIDDLE, |
xxann5 | 8:5674f5ab61cd | 62 | BUTTON_RIGHT, |
xxann5 | 8:5674f5ab61cd | 63 | BUTTON_FORWORD, |
xxann5 | 8:5674f5ab61cd | 64 | BUTTON_BACK, |
xxann5 | 8:5674f5ab61cd | 65 | BUTTON_Z, |
xxann5 | 8:5674f5ab61cd | 66 | BUTTON_HIGH_RES, |
xxann5 | 8:5674f5ab61cd | 67 | }; |
xxann5 | 8:5674f5ab61cd | 68 | enum settings { |
xxann5 | 8:5674f5ab61cd | 69 | CPI_X = 0x00, //explisitly showing we start at zero |
xxann5 | 8:5674f5ab61cd | 70 | CPI_Y, |
xxann5 | 8:5674f5ab61cd | 71 | CPI_X_MULITIPLYER, |
xxann5 | 8:5674f5ab61cd | 72 | CPI_Y_MULITIPLYER, |
xxann5 | 8:5674f5ab61cd | 73 | CPI_MAX, // Not currently used. |
xxann5 | 8:5674f5ab61cd | 74 | CPI_MIN, // Not currently used. |
xxann5 | 8:5674f5ab61cd | 75 | CPI_STEP, // Not currently used. |
xxann5 | 8:5674f5ab61cd | 76 | CPI_Z, |
xxann5 | 8:5674f5ab61cd | 77 | CPI_H, |
xxann5 | 8:5674f5ab61cd | 78 | CPI_HR_X, |
xxann5 | 8:5674f5ab61cd | 79 | CPI_HR_Y, |
xxann5 | 8:5674f5ab61cd | 80 | |
xxann5 | 8:5674f5ab61cd | 81 | BTN_A, |
xxann5 | 8:5674f5ab61cd | 82 | BTN_B, |
xxann5 | 8:5674f5ab61cd | 83 | BTN_C, |
xxann5 | 8:5674f5ab61cd | 84 | BTN_D, |
xxann5 | 8:5674f5ab61cd | 85 | BTN_E, |
xxann5 | 8:5674f5ab61cd | 86 | BTN_F, |
xxann5 | 8:5674f5ab61cd | 87 | BTN_G, |
xxann5 | 8:5674f5ab61cd | 88 | |
xxann5 | 8:5674f5ab61cd | 89 | LED_ACTION, // Not currently used |
xxann5 | 8:5674f5ab61cd | 90 | |
xxann5 | 8:5674f5ab61cd | 91 | VID, |
xxann5 | 8:5674f5ab61cd | 92 | PID, |
xxann5 | 8:5674f5ab61cd | 93 | RELEASE, |
xxann5 | 8:5674f5ab61cd | 94 | |
xxann5 | 8:5674f5ab61cd | 95 | PROFILE_DEFAULT, |
xxann5 | 8:5674f5ab61cd | 96 | PROFILE_CURRENT, |
xxann5 | 8:5674f5ab61cd | 97 | |
xxann5 | 8:5674f5ab61cd | 98 | |
xxann5 | 8:5674f5ab61cd | 99 | |
xxann5 | 8:5674f5ab61cd | 100 | ADNS_CRC, |
xxann5 | 8:5674f5ab61cd | 101 | ADNS_ID, |
xxann5 | 8:5674f5ab61cd | 102 | ADNS_FW_LEN, |
xxann5 | 8:5674f5ab61cd | 103 | ADNS_FW_OFFSET, |
xxann5 | 8:5674f5ab61cd | 104 | }; |
xxann5 | 8:5674f5ab61cd | 105 | |
xxann5 | 5:c7056267daa7 | 106 | |
xxann5 | 8:5674f5ab61cd | 107 | |
xxann5 | 8:5674f5ab61cd | 108 | |
xxann5 | 8:5674f5ab61cd | 109 | #ifdef MBED |
xxann5 | 8:5674f5ab61cd | 110 | DigitalIn run_mode(p36); |
xxann5 | 8:5674f5ab61cd | 111 | |
xxann5 | 8:5674f5ab61cd | 112 | DigitalIn motion_in(p14); |
xxann5 | 8:5674f5ab61cd | 113 | |
xxann5 | 8:5674f5ab61cd | 114 | DigitalOut activity(p35); |
xxann5 | 8:5674f5ab61cd | 115 | |
xxann5 | 8:5674f5ab61cd | 116 | InterruptIn debug(p29); |
xxann5 | 8:5674f5ab61cd | 117 | |
xxann5 | 8:5674f5ab61cd | 118 | InterruptIn btn_a(p21); |
xxann5 | 8:5674f5ab61cd | 119 | InterruptIn btn_b(p22); |
xxann5 | 8:5674f5ab61cd | 120 | InterruptIn btn_c(p23); |
xxann5 | 8:5674f5ab61cd | 121 | InterruptIn btn_d(p24); |
xxann5 | 8:5674f5ab61cd | 122 | InterruptIn btn_e(p25); |
xxann5 | 8:5674f5ab61cd | 123 | InterruptIn btn_f(p26); |
xxann5 | 8:5674f5ab61cd | 124 | InterruptIn btn_g(p27); |
xxann5 | 6:4cb2c9a3abcd | 125 | |
xxann5 | 8:5674f5ab61cd | 126 | InterruptIn prfl_a(p20); |
xxann5 | 8:5674f5ab61cd | 127 | InterruptIn prfl_b(p19); |
xxann5 | 8:5674f5ab61cd | 128 | InterruptIn prfl_c(p18); |
xxann5 | 8:5674f5ab61cd | 129 | InterruptIn prfl_d(p17); |
xxann5 | 8:5674f5ab61cd | 130 | InterruptIn prfl_e(p16); |
xxann5 | 8:5674f5ab61cd | 131 | #elif |
xxann5 | 8:5674f5ab61cd | 132 | DigitalIn run_mode(P1_29); |
xxann5 | 8:5674f5ab61cd | 133 | |
xxann5 | 8:5674f5ab61cd | 134 | DigitalIn motion_in(P0_22); |
xxann5 | 8:5674f5ab61cd | 135 | |
xxann5 | 8:5674f5ab61cd | 136 | DigitalOut activity(P1_28); |
xxann5 | 8:5674f5ab61cd | 137 | |
xxann5 | 8:5674f5ab61cd | 138 | InterruptIn btn_a(P0_18); |
xxann5 | 8:5674f5ab61cd | 139 | InterruptIn btn_b(P0_16); |
xxann5 | 8:5674f5ab61cd | 140 | InterruptIn btn_c(P0_17); |
xxann5 | 8:5674f5ab61cd | 141 | InterruptIn btn_d(P0_23); |
xxann5 | 8:5674f5ab61cd | 142 | InterruptIn btn_e(P1_15); |
xxann5 | 8:5674f5ab61cd | 143 | InterruptIn btn_f(P1_??); |
xxann5 | 8:5674f5ab61cd | 144 | InterruptIn btn_g(P1_??); |
xxann5 | 8:5674f5ab61cd | 145 | |
xxann5 | 8:5674f5ab61cd | 146 | InterruptIn prfl_a(P0_4); |
xxann5 | 8:5674f5ab61cd | 147 | InterruptIn prfl_b(P0_5); |
xxann5 | 8:5674f5ab61cd | 148 | InterruptIn prfl_c(P0_21); |
xxann5 | 8:5674f5ab61cd | 149 | InterruptIn prfl_d(P1_23); |
xxann5 | 8:5674f5ab61cd | 150 | InterruptIn prfl_e(P1_24); |
xxann5 | 8:5674f5ab61cd | 151 | #endif |
xxann5 | 8:5674f5ab61cd | 152 | |
xxann5 | 8:5674f5ab61cd | 153 | // We are global for the callbacks |
xxann5 | 6:4cb2c9a3abcd | 154 | USBMouse *mouse; |
xxann5 | 5:c7056267daa7 | 155 | |
xxann5 | 8:5674f5ab61cd | 156 | bool motion_triggered = true; |
xxann5 | 8:5674f5ab61cd | 157 | bool z_axis_active = false; |
xxann5 | 8:5674f5ab61cd | 158 | bool high_rez_active = false; |
xxann5 | 8:5674f5ab61cd | 159 | bool profile_load = true; // Always inishally load the profile even if it might be the same. |
xxann5 | 8:5674f5ab61cd | 160 | bool set_res_hr = false; |
xxann5 | 8:5674f5ab61cd | 161 | bool set_res_z = false; |
xxann5 | 8:5674f5ab61cd | 162 | bool set_res_default = false; |
xxann5 | 8:5674f5ab61cd | 163 | //uint32_t rest_counter; |
xxann5 | 5:c7056267daa7 | 164 | |
xxann5 | 8:5674f5ab61cd | 165 | uint16_t s[28] = { |
xxann5 | 8:5674f5ab61cd | 166 | 540, // CPI_X |
xxann5 | 8:5674f5ab61cd | 167 | 540, // CPI_Y |
xxann5 | 8:5674f5ab61cd | 168 | 40, // CPI_X_MULITIPLYER |
xxann5 | 8:5674f5ab61cd | 169 | 40, // CPI_Y_MULITIPLYER |
xxann5 | 7:d6ee49a89009 | 170 | 5040, // CPI_MAX |
xxann5 | 7:d6ee49a89009 | 171 | 0, // CPI_MIN |
xxann5 | 7:d6ee49a89009 | 172 | 90, // CPI_STEP |
xxann5 | 8:5674f5ab61cd | 173 | 0, // CPI_Z |
xxann5 | 8:5674f5ab61cd | 174 | 0, // CPI_H |
xxann5 | 8:5674f5ab61cd | 175 | 360, // CPI_HR_X |
xxann5 | 8:5674f5ab61cd | 176 | 360, // CPI_HR_Y |
xxann5 | 8:5674f5ab61cd | 177 | BUTTON_LEFT, |
xxann5 | 8:5674f5ab61cd | 178 | BUTTON_MIDDLE, |
xxann5 | 8:5674f5ab61cd | 179 | BUTTON_RIGHT, |
xxann5 | 8:5674f5ab61cd | 180 | BUTTON_Z, |
xxann5 | 8:5674f5ab61cd | 181 | BUTTON_HIGH_RES, |
xxann5 | 8:5674f5ab61cd | 182 | BUTTON_FORWORD, |
xxann5 | 8:5674f5ab61cd | 183 | BUTTON_BACK, |
xxann5 | 8:5674f5ab61cd | 184 | 0x00, // LED_ACTION |
xxann5 | 8:5674f5ab61cd | 185 | 0x192f, // VID (No default, must be set) |
xxann5 | 8:5674f5ab61cd | 186 | 0x0000, // PID (No default, must be set) |
xxann5 | 8:5674f5ab61cd | 187 | 0x00, // PROFILE_DEFAULT |
xxann5 | 8:5674f5ab61cd | 188 | 0x00, // PROFILE_CURRENT |
xxann5 | 8:5674f5ab61cd | 189 | 0x0000, // RELEASE |
xxann5 | 8:5674f5ab61cd | 190 | 0xffff, // ADNS_CRC (No default, must be set) |
xxann5 | 8:5674f5ab61cd | 191 | 0xffff, // ADNS_ID (No default, must be set) |
xxann5 | 8:5674f5ab61cd | 192 | 0xffff, // ADNS_FW_LEN (No default, must be set) |
xxann5 | 8:5674f5ab61cd | 193 | 0xea60 // ADNS_FW_OFFSET |
xxann5 | 7:d6ee49a89009 | 194 | }; |
xxann5 | 7:d6ee49a89009 | 195 | |
xxann5 | 8:5674f5ab61cd | 196 | |
xxann5 | 5:c7056267daa7 | 197 | |
xxann5 | 8:5674f5ab61cd | 198 | void track( Ser25LCxxx *eeprom ); |
xxann5 | 8:5674f5ab61cd | 199 | void program( Ser25LCxxx *eeprom ); |
xxann5 | 5:c7056267daa7 | 200 | |
xxann5 | 6:4cb2c9a3abcd | 201 | void motionCallback( void ); |
xxann5 | 6:4cb2c9a3abcd | 202 | |
xxann5 | 6:4cb2c9a3abcd | 203 | void btn_hr_press( void ); |
xxann5 | 6:4cb2c9a3abcd | 204 | void btn_hr_release( void ); |
xxann5 | 5:c7056267daa7 | 205 | |
xxann5 | 6:4cb2c9a3abcd | 206 | void btn_z_press( void ); |
xxann5 | 6:4cb2c9a3abcd | 207 | void btn_z_release( void ); |
xxann5 | 5:c7056267daa7 | 208 | |
xxann5 | 6:4cb2c9a3abcd | 209 | void btn_l_press(void); |
xxann5 | 6:4cb2c9a3abcd | 210 | void btn_l_release( void ); |
xxann5 | 6:4cb2c9a3abcd | 211 | |
xxann5 | 6:4cb2c9a3abcd | 212 | void btn_m_press( void ); |
xxann5 | 6:4cb2c9a3abcd | 213 | void btn_m_release( void ); |
xxann5 | 6:4cb2c9a3abcd | 214 | |
xxann5 | 6:4cb2c9a3abcd | 215 | void btn_r_press( void ); |
xxann5 | 6:4cb2c9a3abcd | 216 | void btn_r_release( void ); |
xxann5 | 5:c7056267daa7 | 217 | |
xxann5 | 8:5674f5ab61cd | 218 | void btn_f_press( void ); |
xxann5 | 8:5674f5ab61cd | 219 | void btn_f_release( void ); |
xxann5 | 8:5674f5ab61cd | 220 | |
xxann5 | 8:5674f5ab61cd | 221 | void btn_b_press( void ); |
xxann5 | 8:5674f5ab61cd | 222 | void btn_b_release( void ); |
xxann5 | 7:d6ee49a89009 | 223 | |
xxann5 | 8:5674f5ab61cd | 224 | void prfl_a_set( void ); |
xxann5 | 8:5674f5ab61cd | 225 | void prfl_b_set( void ); |
xxann5 | 8:5674f5ab61cd | 226 | void prfl_c_set( void ); |
xxann5 | 8:5674f5ab61cd | 227 | void prfl_d_set( void ); |
xxann5 | 8:5674f5ab61cd | 228 | void prfl_e_set( void ); |
xxann5 | 7:d6ee49a89009 | 229 | |
xxann5 | 8:5674f5ab61cd | 230 | void prfl_stub( void ); |
xxann5 | 8:5674f5ab61cd | 231 | void debug_out(void); |
xxann5 | 8:5674f5ab61cd | 232 | |
xxann5 | 8:5674f5ab61cd | 233 | int set_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val, uint16_t base_address ); |
xxann5 | 8:5674f5ab61cd | 234 | uint16_t get_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address ); |
xxann5 | 8:5674f5ab61cd | 235 | void clear_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address ); |
xxann5 | 8:5674f5ab61cd | 236 | |
xxann5 | 8:5674f5ab61cd | 237 | void load_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len, const uint8_t* data ); |
xxann5 | 8:5674f5ab61cd | 238 | |
xxann5 | 8:5674f5ab61cd | 239 | uint8_t* get_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len ); |