Trackball based on the NXP LPC11U24 and the ADNS-9500
Dependencies: ADNS9500 USBDevice mbed 25LCxxx_SPI
main.cpp@9:ee05aa95f5c9, 2013-03-14 (annotated)
- Committer:
- xxann5
- Date:
- Thu Mar 14 14:04:07 2013 +0000
- Revision:
- 9:ee05aa95f5c9
- Parent:
- 8:5674f5ab61cd
Updated USBDevice.lib
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 | 2:72a8d2b11320 | 17 | #include "main.h" |
xxann5 | 1:34085d7e0991 | 18 | |
xxann5 | 7:d6ee49a89009 | 19 | |
xxann5 | 6:4cb2c9a3abcd | 20 | int main(void) |
xxann5 | 6:4cb2c9a3abcd | 21 | { |
xxann5 | 8:5674f5ab61cd | 22 | |
xxann5 | 8:5674f5ab61cd | 23 | printf("And away we go.\n\r"); |
xxann5 | 8:5674f5ab61cd | 24 | activity = 1; |
xxann5 | 8:5674f5ab61cd | 25 | run_mode.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 26 | Ser25LCxxx *eeprom; |
xxann5 | 8:5674f5ab61cd | 27 | |
xxann5 | 8:5674f5ab61cd | 28 | #ifdef MBED |
xxann5 | 8:5674f5ab61cd | 29 | SPI eeprom_spi( p11, p12, p13); // mosi, miso, sclk |
xxann5 | 8:5674f5ab61cd | 30 | #elif |
xxann5 | 8:5674f5ab61cd | 31 | SPI eeprom_spi( P0_21, P0_22, P1_20); // mosi, miso, sclk |
xxann5 | 8:5674f5ab61cd | 32 | #endif |
xxann5 | 8:5674f5ab61cd | 33 | |
xxann5 | 8:5674f5ab61cd | 34 | eeprom_spi.format(8,3); |
xxann5 | 8:5674f5ab61cd | 35 | eeprom_spi.frequency(1000000); |
xxann5 | 8:5674f5ab61cd | 36 | |
xxann5 | 8:5674f5ab61cd | 37 | #ifdef MBED |
xxann5 | 8:5674f5ab61cd | 38 | eeprom = new Ser25LCxxx( &eeprom_spi, p15, 0x10000, 0x20 ); |
xxann5 | 8:5674f5ab61cd | 39 | #elif |
xxann5 | 8:5674f5ab61cd | 40 | eeprom = new Ser25LCxxx( &eeprom_spi, P1_27, 0x10000, 0x20 ); |
xxann5 | 8:5674f5ab61cd | 41 | #endif |
xxann5 | 6:4cb2c9a3abcd | 42 | |
xxann5 | 8:5674f5ab61cd | 43 | //retreave default and system settings from the EEPROM and override the default values. |
xxann5 | 8:5674f5ab61cd | 44 | printf("Loading settings\n\r"); |
xxann5 | 8:5674f5ab61cd | 45 | for( int i = 0; i < sizeof(s)/sizeof(uint16_t); i++ ){ |
xxann5 | 8:5674f5ab61cd | 46 | printf("Setting %d: %X\r\n", i, s[i]); |
xxann5 | 8:5674f5ab61cd | 47 | //set_setting( eeprom, i, s[i], SETTINGS_BASE ); |
xxann5 | 8:5674f5ab61cd | 48 | //s[i] = get_setting( eeprom, i, SETTINGS_BASE ); |
xxann5 | 8:5674f5ab61cd | 49 | printf("Setting %d: %X\r\n", i, s[i]); |
xxann5 | 8:5674f5ab61cd | 50 | } |
xxann5 | 8:5674f5ab61cd | 51 | |
xxann5 | 8:5674f5ab61cd | 52 | //eeprom->write( s[ADNS_FW_OFFSET], ADNS9500_FIRMWARE_LEN, adns9500FWArray ); |
xxann5 | 8:5674f5ab61cd | 53 | |
xxann5 | 8:5674f5ab61cd | 54 | if( run_mode ){ |
xxann5 | 8:5674f5ab61cd | 55 | printf("Tracking mode\n\r"); |
xxann5 | 8:5674f5ab61cd | 56 | track( eeprom ); |
xxann5 | 6:4cb2c9a3abcd | 57 | } |
xxann5 | 6:4cb2c9a3abcd | 58 | else{ |
xxann5 | 8:5674f5ab61cd | 59 | printf("Programming mode\n\r"); |
xxann5 | 8:5674f5ab61cd | 60 | program( eeprom ); |
xxann5 | 6:4cb2c9a3abcd | 61 | } |
xxann5 | 6:4cb2c9a3abcd | 62 | } |
xxann5 | 6:4cb2c9a3abcd | 63 | |
xxann5 | 7:d6ee49a89009 | 64 | void track( Ser25LCxxx *eeprom ){ |
xxann5 | 8:5674f5ab61cd | 65 | activity = 0; |
xxann5 | 6:4cb2c9a3abcd | 66 | /* |
xxann5 | 6:4cb2c9a3abcd | 67 | * mosi miso sclk ncs FREQ, motion |
xxann5 | 6:4cb2c9a3abcd | 68 | */ |
xxann5 | 8:5674f5ab61cd | 69 | mouse = new USBMouse( REL_MOUSE, s[VID], s[PID], s[RELEASE]) ; |
xxann5 | 8:5674f5ab61cd | 70 | |
xxann5 | 8:5674f5ab61cd | 71 | /* |
xxann5 | 8:5674f5ab61cd | 72 | * mosi == p5 / P0_9 |
xxann5 | 8:5674f5ab61cd | 73 | * miso == p6 / P0_8 |
xxann5 | 8:5674f5ab61cd | 74 | * sclk == p7 / P0_10 |
xxann5 | 8:5674f5ab61cd | 75 | * ncs == p8 / P1_16 |
xxann5 | 8:5674f5ab61cd | 76 | * spi_frequency = MAX_SPI_FREQUENCY |
xxann5 | 8:5674f5ab61cd | 77 | * motion == p14 / P0_22 |
xxann5 | 8:5674f5ab61cd | 78 | */ |
xxann5 | 8:5674f5ab61cd | 79 | |
xxann5 | 8:5674f5ab61cd | 80 | printf("Creating sensor object\n\r"); |
xxann5 | 8:5674f5ab61cd | 81 | #ifdef MBED |
xxann5 | 8:5674f5ab61cd | 82 | adns9500::ADNS9500 sensor(p5, p6, p7, p8, adns9500::MAX_SPI_FREQUENCY); |
xxann5 | 8:5674f5ab61cd | 83 | #elif |
xxann5 | 8:5674f5ab61cd | 84 | adns9500::ADNS9500 sensor(P0_9, P0_8, P0_10, P1_16, adns9500::MAX_SPI_FREQUENCY); |
xxann5 | 8:5674f5ab61cd | 85 | #endif |
xxann5 | 6:4cb2c9a3abcd | 86 | |
xxann5 | 8:5674f5ab61cd | 87 | static fn press_funcs[] = { |
xxann5 | 8:5674f5ab61cd | 88 | btn_l_press, |
xxann5 | 8:5674f5ab61cd | 89 | btn_m_press, |
xxann5 | 8:5674f5ab61cd | 90 | btn_r_press, |
xxann5 | 8:5674f5ab61cd | 91 | btn_f_press, |
xxann5 | 8:5674f5ab61cd | 92 | btn_b_press, |
xxann5 | 8:5674f5ab61cd | 93 | btn_z_press, |
xxann5 | 8:5674f5ab61cd | 94 | btn_hr_press}; |
xxann5 | 8:5674f5ab61cd | 95 | |
xxann5 | 8:5674f5ab61cd | 96 | static fn release_funcs[] = { |
xxann5 | 8:5674f5ab61cd | 97 | btn_l_release, |
xxann5 | 8:5674f5ab61cd | 98 | btn_m_release, |
xxann5 | 8:5674f5ab61cd | 99 | btn_r_release, |
xxann5 | 8:5674f5ab61cd | 100 | btn_f_release, |
xxann5 | 8:5674f5ab61cd | 101 | btn_b_release, |
xxann5 | 8:5674f5ab61cd | 102 | btn_z_release, |
xxann5 | 8:5674f5ab61cd | 103 | btn_hr_release}; |
xxann5 | 8:5674f5ab61cd | 104 | |
xxann5 | 8:5674f5ab61cd | 105 | printf("Inisializing buttons\n\r"); |
xxann5 | 6:4cb2c9a3abcd | 106 | |
xxann5 | 8:5674f5ab61cd | 107 | // Mouse buttons |
xxann5 | 8:5674f5ab61cd | 108 | btn_a.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 109 | btn_a.fall(press_funcs[s[BTN_A]]); |
xxann5 | 8:5674f5ab61cd | 110 | btn_a.rise(release_funcs[s[BTN_A]]); |
xxann5 | 8:5674f5ab61cd | 111 | |
xxann5 | 8:5674f5ab61cd | 112 | btn_b.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 113 | btn_b.fall(press_funcs[s[BTN_B]]); |
xxann5 | 8:5674f5ab61cd | 114 | btn_b.rise(release_funcs[s[BTN_B]]); |
xxann5 | 6:4cb2c9a3abcd | 115 | |
xxann5 | 8:5674f5ab61cd | 116 | btn_c.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 117 | btn_c.fall(press_funcs[s[BTN_C]]); |
xxann5 | 8:5674f5ab61cd | 118 | btn_c.rise(release_funcs[s[BTN_C]]); |
xxann5 | 8:5674f5ab61cd | 119 | |
xxann5 | 8:5674f5ab61cd | 120 | btn_d.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 121 | btn_d.fall(press_funcs[s[BTN_D]]); |
xxann5 | 8:5674f5ab61cd | 122 | btn_d.rise(release_funcs[s[BTN_D]]); |
xxann5 | 8:5674f5ab61cd | 123 | |
xxann5 | 8:5674f5ab61cd | 124 | btn_e.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 125 | btn_e.fall(press_funcs[s[BTN_E]]); |
xxann5 | 8:5674f5ab61cd | 126 | btn_e.rise(release_funcs[s[BTN_E]]); |
xxann5 | 6:4cb2c9a3abcd | 127 | |
xxann5 | 8:5674f5ab61cd | 128 | btn_f.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 129 | btn_f.fall(press_funcs[s[BTN_F]]); |
xxann5 | 8:5674f5ab61cd | 130 | btn_f.rise(release_funcs[s[BTN_F]]); |
xxann5 | 8:5674f5ab61cd | 131 | |
xxann5 | 8:5674f5ab61cd | 132 | btn_g.mode(PullNone); |
xxann5 | 8:5674f5ab61cd | 133 | btn_g.fall(press_funcs[s[BTN_G]]); |
xxann5 | 8:5674f5ab61cd | 134 | btn_g.rise(release_funcs[s[BTN_G]]); |
xxann5 | 1:34085d7e0991 | 135 | |
xxann5 | 8:5674f5ab61cd | 136 | // Profile buttons |
xxann5 | 8:5674f5ab61cd | 137 | prfl_a.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 138 | prfl_a.fall(&prfl_a_set); |
xxann5 | 8:5674f5ab61cd | 139 | prfl_a.rise(&prfl_stub); |
xxann5 | 6:4cb2c9a3abcd | 140 | |
xxann5 | 8:5674f5ab61cd | 141 | prfl_b.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 142 | prfl_b.fall(&prfl_b_set); |
xxann5 | 8:5674f5ab61cd | 143 | prfl_b.rise(&prfl_stub); |
xxann5 | 8:5674f5ab61cd | 144 | |
xxann5 | 8:5674f5ab61cd | 145 | prfl_c.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 146 | prfl_c.fall(&prfl_c_set); |
xxann5 | 8:5674f5ab61cd | 147 | prfl_c.rise(&prfl_stub); |
xxann5 | 6:4cb2c9a3abcd | 148 | |
xxann5 | 8:5674f5ab61cd | 149 | prfl_d.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 150 | prfl_d.fall(&prfl_d_set); |
xxann5 | 8:5674f5ab61cd | 151 | prfl_d.rise(&prfl_stub); |
xxann5 | 7:d6ee49a89009 | 152 | |
xxann5 | 8:5674f5ab61cd | 153 | prfl_e.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 154 | prfl_e.fall(&prfl_e_set); |
xxann5 | 8:5674f5ab61cd | 155 | prfl_e.rise(&prfl_stub); |
xxann5 | 8:5674f5ab61cd | 156 | |
xxann5 | 8:5674f5ab61cd | 157 | debug.mode(PullUp); |
xxann5 | 8:5674f5ab61cd | 158 | debug.fall(&debug_out); |
xxann5 | 8:5674f5ab61cd | 159 | debug.rise(&debug_out); |
xxann5 | 7:d6ee49a89009 | 160 | |
xxann5 | 8:5674f5ab61cd | 161 | int16_t dx, dy; |
xxann5 | 8:5674f5ab61cd | 162 | float mx, my; |
xxann5 | 8:5674f5ab61cd | 163 | |
xxann5 | 8:5674f5ab61cd | 164 | sensor.reset(); |
xxann5 | 8:5674f5ab61cd | 165 | |
xxann5 | 8:5674f5ab61cd | 166 | uint8_t *adns_fw; |
xxann5 | 8:5674f5ab61cd | 167 | |
xxann5 | 8:5674f5ab61cd | 168 | //eeprom->write(ADNS_FW_OFFSET, ADNS_FW_LEN, adns9500FWArray); |
xxann5 | 8:5674f5ab61cd | 169 | //adns_fw = eeprom->read( ADNS_FW_OFFSET, ADNS_FW_LEN ); |
xxann5 | 8:5674f5ab61cd | 170 | //eeprom->write( s[ADNS_FW_OFFSET], ADNS9500_FIRMWARE_LEN, adns9500FWArray ); |
xxann5 | 8:5674f5ab61cd | 171 | |
xxann5 | 8:5674f5ab61cd | 172 | activity = 1; |
xxann5 | 8:5674f5ab61cd | 173 | printf("Loading sensor firmware\r\n"); |
xxann5 | 8:5674f5ab61cd | 174 | uint16_t crc = sensor.sromDownload( adns9500FWArray, ADNS9500_FIRMWARE_LEN ); //FIXME |
xxann5 | 8:5674f5ab61cd | 175 | |
xxann5 | 8:5674f5ab61cd | 176 | if( ADNS6010_FIRMWARE_CRC != crc ){ //ADNS6010_FIRMWARE_CRC |
xxann5 | 8:5674f5ab61cd | 177 | printf("Firmware CRC does not match [%X] [%X]\n\r", |
xxann5 | 8:5674f5ab61cd | 178 | ADNS6010_FIRMWARE_CRC, |
xxann5 | 8:5674f5ab61cd | 179 | crc); |
xxann5 | 8:5674f5ab61cd | 180 | while (true){ |
xxann5 | 8:5674f5ab61cd | 181 | activity = 0; |
xxann5 | 8:5674f5ab61cd | 182 | wait(0.2); |
xxann5 | 8:5674f5ab61cd | 183 | activity = 1; |
xxann5 | 8:5674f5ab61cd | 184 | wait(0.2); |
xxann5 | 8:5674f5ab61cd | 185 | } |
xxann5 | 6:4cb2c9a3abcd | 186 | } |
xxann5 | 8:5674f5ab61cd | 187 | else{ |
xxann5 | 8:5674f5ab61cd | 188 | activity = 0; |
xxann5 | 8:5674f5ab61cd | 189 | printf("Firmware CRC matches [%X] [%X]\n\r", |
xxann5 | 8:5674f5ab61cd | 190 | ADNS6010_FIRMWARE_CRC, |
xxann5 | 8:5674f5ab61cd | 191 | crc); |
xxann5 | 8:5674f5ab61cd | 192 | } |
xxann5 | 8:5674f5ab61cd | 193 | |
xxann5 | 7:d6ee49a89009 | 194 | // The firmware was set correctly. Freeing the 3K! of ram. |
xxann5 | 8:5674f5ab61cd | 195 | //delete adns_fw; |
xxann5 | 8:5674f5ab61cd | 196 | |
xxann5 | 8:5674f5ab61cd | 197 | printf("Enableing lazer\n\r"); |
xxann5 | 8:5674f5ab61cd | 198 | sensor.enableLaser(); |
xxann5 | 8:5674f5ab61cd | 199 | sensor.setResolution( s[CPI_X], s[CPI_Y] ); |
xxann5 | 6:4cb2c9a3abcd | 200 | |
xxann5 | 8:5674f5ab61cd | 201 | printf("Starting Loop\n\r"); |
xxann5 | 8:5674f5ab61cd | 202 | activity = 1; |
xxann5 | 8:5674f5ab61cd | 203 | //rest_counter = 0; |
xxann5 | 6:4cb2c9a3abcd | 204 | while (true){ |
xxann5 | 8:5674f5ab61cd | 205 | //rest_counter++; |
xxann5 | 8:5674f5ab61cd | 206 | /* |
xxann5 | 8:5674f5ab61cd | 207 | * Moved the setResolution calls out of the interupt callbacks as they |
xxann5 | 8:5674f5ab61cd | 208 | * havequite a few waits in them. I am hopping this is the reasion why |
xxann5 | 8:5674f5ab61cd | 209 | * the hr and z buttons on occation stick or don't work the first time |
xxann5 | 8:5674f5ab61cd | 210 | * you press them. |
xxann5 | 8:5674f5ab61cd | 211 | */ |
xxann5 | 8:5674f5ab61cd | 212 | if( set_res_hr ){ |
xxann5 | 8:5674f5ab61cd | 213 | printf("Setting High hez\n\r"); |
xxann5 | 8:5674f5ab61cd | 214 | set_res_hr = false; |
xxann5 | 8:5674f5ab61cd | 215 | sensor.setResolution( s[CPI_HR_X], s[CPI_HR_Y] ); |
xxann5 | 8:5674f5ab61cd | 216 | } |
xxann5 | 7:d6ee49a89009 | 217 | |
xxann5 | 8:5674f5ab61cd | 218 | if( set_res_z ){ |
xxann5 | 8:5674f5ab61cd | 219 | printf("Setting Z rez\n\r"); |
xxann5 | 8:5674f5ab61cd | 220 | set_res_z = false; |
xxann5 | 8:5674f5ab61cd | 221 | sensor.setResolution( s[CPI_Z], s[CPI_H] ); |
xxann5 | 6:4cb2c9a3abcd | 222 | } |
xxann5 | 8:5674f5ab61cd | 223 | |
xxann5 | 8:5674f5ab61cd | 224 | if( set_res_default ){ |
xxann5 | 8:5674f5ab61cd | 225 | printf("Setting default rez\n\r"); |
xxann5 | 8:5674f5ab61cd | 226 | set_res_default = false; |
xxann5 | 8:5674f5ab61cd | 227 | sensor.setResolution( s[CPI_X], s[CPI_Y] ); |
xxann5 | 6:4cb2c9a3abcd | 228 | } |
xxann5 | 8:5674f5ab61cd | 229 | |
xxann5 | 8:5674f5ab61cd | 230 | if( !motion_in){ |
xxann5 | 7:d6ee49a89009 | 231 | |
xxann5 | 6:4cb2c9a3abcd | 232 | motion_triggered = false; |
xxann5 | 6:4cb2c9a3abcd | 233 | |
xxann5 | 8:5674f5ab61cd | 234 | sensor.getMotionDelta(dx, dy); |
xxann5 | 8:5674f5ab61cd | 235 | if( dx == 0 and dy == 0 ){ |
xxann5 | 8:5674f5ab61cd | 236 | // FIXME: why is the ADNS9500 dropping the motion pin and then |
xxann5 | 8:5674f5ab61cd | 237 | // giving me no motion? Do I have somthing wired up wrong? |
xxann5 | 8:5674f5ab61cd | 238 | continue; |
xxann5 | 8:5674f5ab61cd | 239 | } |
xxann5 | 6:4cb2c9a3abcd | 240 | /* |
xxann5 | 8:5674f5ab61cd | 241 | * The sensor is not aware of its orientation so we need to muck |
xxann5 | 8:5674f5ab61cd | 242 | * with the values a it. |
xxann5 | 6:4cb2c9a3abcd | 243 | */ |
xxann5 | 6:4cb2c9a3abcd | 244 | if( z_axis_active ){ |
xxann5 | 8:5674f5ab61cd | 245 | printf("scroll,%X,%X,\n\r", -dx, dy); |
xxann5 | 8:5674f5ab61cd | 246 | mouse->scroll( dy, - dx ); |
xxann5 | 6:4cb2c9a3abcd | 247 | } |
xxann5 | 6:4cb2c9a3abcd | 248 | else{ |
xxann5 | 8:5674f5ab61cd | 249 | |
xxann5 | 8:5674f5ab61cd | 250 | mx = (float(abs(dx))/float(s[CPI_X_MULITIPLYER]) + 1.0); |
xxann5 | 8:5674f5ab61cd | 251 | my = (float(abs(dy))/float(s[CPI_Y_MULITIPLYER]) + 1.0); |
xxann5 | 8:5674f5ab61cd | 252 | |
xxann5 | 8:5674f5ab61cd | 253 | printf("motion,%X,%X %.4f,%.4f %X,%X\n\r", -dx, dy, mx, my, int(- (dx * mx)), int(dy * my) ); |
xxann5 | 8:5674f5ab61cd | 254 | |
xxann5 | 8:5674f5ab61cd | 255 | mouse->move( - (dx * mx), (dy * my) ); |
xxann5 | 8:5674f5ab61cd | 256 | //printf("rest_coutner,%d\n\r", rest_counter); |
xxann5 | 8:5674f5ab61cd | 257 | //rest_counter = 0; |
xxann5 | 8:5674f5ab61cd | 258 | } |
xxann5 | 8:5674f5ab61cd | 259 | } |
xxann5 | 8:5674f5ab61cd | 260 | |
xxann5 | 8:5674f5ab61cd | 261 | |
xxann5 | 8:5674f5ab61cd | 262 | // Load the current profile. |
xxann5 | 8:5674f5ab61cd | 263 | // This rights the first 10 16bit values of the s array from the selected profile. |
xxann5 | 8:5674f5ab61cd | 264 | // |
xxann5 | 8:5674f5ab61cd | 265 | // Base is calculated... |
xxann5 | 8:5674f5ab61cd | 266 | // selected profile * profile length * 2 + profile base |
xxann5 | 8:5674f5ab61cd | 267 | // |
xxann5 | 8:5674f5ab61cd | 268 | // (3 * 7 * 2) + 64 (multiplying by two because they are 16bit values. |
xxann5 | 8:5674f5ab61cd | 269 | // TODO: should i move this to a function? |
xxann5 | 8:5674f5ab61cd | 270 | if( profile_load ){ |
xxann5 | 8:5674f5ab61cd | 271 | // for( int i = 0; i < PROFILE_LEN; i++ ){ |
xxann5 | 8:5674f5ab61cd | 272 | // //s[i] = get_setting( eeprom, i, (s[PROFILE_CURRENT] * PROFILE_LEN) + PROFILE_BASE ); |
xxann5 | 8:5674f5ab61cd | 273 | // } |
xxann5 | 8:5674f5ab61cd | 274 | // sensor.setResolution( s[CPI_X], s[CPI_Y] ); |
xxann5 | 8:5674f5ab61cd | 275 | profile_load = false; |
xxann5 | 8:5674f5ab61cd | 276 | } |
xxann5 | 8:5674f5ab61cd | 277 | } |
xxann5 | 8:5674f5ab61cd | 278 | } |
xxann5 | 8:5674f5ab61cd | 279 | |
xxann5 | 8:5674f5ab61cd | 280 | void program( Ser25LCxxx *eeprom ){ |
xxann5 | 8:5674f5ab61cd | 281 | |
xxann5 | 8:5674f5ab61cd | 282 | |
xxann5 | 8:5674f5ab61cd | 283 | //USBHID *hid = new USBHID( 64, 64, 0x192f, 0x0, 0x0); |
xxann5 | 8:5674f5ab61cd | 284 | USBHID *hid = new USBHID(); |
xxann5 | 8:5674f5ab61cd | 285 | //This report will contain data to be sent |
xxann5 | 8:5674f5ab61cd | 286 | HID_REPORT send_rep; |
xxann5 | 8:5674f5ab61cd | 287 | HID_REPORT recv_rep; |
xxann5 | 8:5674f5ab61cd | 288 | |
xxann5 | 8:5674f5ab61cd | 289 | send_rep.length = 64; |
xxann5 | 8:5674f5ab61cd | 290 | uint16_t base; |
xxann5 | 8:5674f5ab61cd | 291 | uint16_t len; |
xxann5 | 8:5674f5ab61cd | 292 | //Fill the report |
xxann5 | 8:5674f5ab61cd | 293 | for (int i = 0; i < send_rep.length; i++) { |
xxann5 | 8:5674f5ab61cd | 294 | send_rep.data[i] = rand() & 0xff; |
xxann5 | 8:5674f5ab61cd | 295 | } |
xxann5 | 8:5674f5ab61cd | 296 | |
xxann5 | 8:5674f5ab61cd | 297 | //Send the report |
xxann5 | 8:5674f5ab61cd | 298 | //hid->send(&send_rep); |
xxann5 | 8:5674f5ab61cd | 299 | |
xxann5 | 8:5674f5ab61cd | 300 | uint8_t *tmp; |
xxann5 | 8:5674f5ab61cd | 301 | |
xxann5 | 8:5674f5ab61cd | 302 | printf("Entering loop\n\r"); |
xxann5 | 8:5674f5ab61cd | 303 | while (1) { |
xxann5 | 8:5674f5ab61cd | 304 | if( hid->readNB(&recv_rep)) { |
xxann5 | 8:5674f5ab61cd | 305 | printf("Receaved some data.\n\r"); |
xxann5 | 8:5674f5ab61cd | 306 | switch ((recv_rep.data[0])){ |
xxann5 | 8:5674f5ab61cd | 307 | case SET: |
xxann5 | 8:5674f5ab61cd | 308 | //set_setting( eeprom, recv_rep.data[1], UINT16(recv_rep.data[2],recv_rep.data[3])); |
xxann5 | 8:5674f5ab61cd | 309 | break; |
xxann5 | 8:5674f5ab61cd | 310 | case GET: |
xxann5 | 8:5674f5ab61cd | 311 | //tmp = get_setting( eeprom, recv_rep.data[1] ); |
xxann5 | 8:5674f5ab61cd | 312 | |
xxann5 | 8:5674f5ab61cd | 313 | //send_rep.data[0] = (int)tmp; |
xxann5 | 8:5674f5ab61cd | 314 | //send_rep.data[1] = (int)(tmp >> 8); |
xxann5 | 8:5674f5ab61cd | 315 | |
xxann5 | 8:5674f5ab61cd | 316 | //hid->send(&send_rep); |
xxann5 | 8:5674f5ab61cd | 317 | |
xxann5 | 8:5674f5ab61cd | 318 | break; |
xxann5 | 8:5674f5ab61cd | 319 | case CLEAR: |
xxann5 | 8:5674f5ab61cd | 320 | //clear_setting( eeprom, recv_rep.data[1] ); |
xxann5 | 8:5674f5ab61cd | 321 | break; |
xxann5 | 8:5674f5ab61cd | 322 | case INIT: |
xxann5 | 8:5674f5ab61cd | 323 | eeprom->clearMem(); |
xxann5 | 8:5674f5ab61cd | 324 | break; |
xxann5 | 8:5674f5ab61cd | 325 | case LOAD_DATA: |
xxann5 | 8:5674f5ab61cd | 326 | printf("LOADING DATA\n\r"); |
xxann5 | 8:5674f5ab61cd | 327 | base = UINT16( recv_rep.data[1], recv_rep.data[2] ); |
xxann5 | 8:5674f5ab61cd | 328 | len = recv_rep.data[3]; |
xxann5 | 8:5674f5ab61cd | 329 | printf("BASE: %X LEN: %X\n\r", base, len); |
xxann5 | 8:5674f5ab61cd | 330 | load_data( eeprom, base, len, &recv_rep.data[4] ); |
xxann5 | 8:5674f5ab61cd | 331 | wait(0.1); |
xxann5 | 8:5674f5ab61cd | 332 | tmp = get_data( eeprom, base, len ); |
xxann5 | 8:5674f5ab61cd | 333 | printf("BASE: %X LEN: %X\n\r", base, len); |
xxann5 | 8:5674f5ab61cd | 334 | for( uint16_t i=0; i < (len); i++){ |
xxann5 | 8:5674f5ab61cd | 335 | printf("%X\n\r", tmp[i]); |
xxann5 | 8:5674f5ab61cd | 336 | send_rep.data[i] = tmp[i]; //FIXME |
xxann5 | 8:5674f5ab61cd | 337 | } |
xxann5 | 8:5674f5ab61cd | 338 | hid->send(&send_rep); |
xxann5 | 8:5674f5ab61cd | 339 | delete( tmp); |
xxann5 | 8:5674f5ab61cd | 340 | break; |
xxann5 | 8:5674f5ab61cd | 341 | case GET_DATA: |
xxann5 | 8:5674f5ab61cd | 342 | //base = UINT16( recv_rep.data[1], recv_rep.data[2] ); |
xxann5 | 8:5674f5ab61cd | 343 | //len = UINT16( recv_rep.data[3], recv_rep.data[4] ); |
xxann5 | 8:5674f5ab61cd | 344 | //tmp = get_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len ){ |
xxann5 | 8:5674f5ab61cd | 345 | default: |
xxann5 | 8:5674f5ab61cd | 346 | // FIXME: error handling. |
xxann5 | 8:5674f5ab61cd | 347 | break; |
xxann5 | 6:4cb2c9a3abcd | 348 | } |
xxann5 | 6:4cb2c9a3abcd | 349 | } |
xxann5 | 6:4cb2c9a3abcd | 350 | } |
xxann5 | 6:4cb2c9a3abcd | 351 | } |
xxann5 | 6:4cb2c9a3abcd | 352 | |
xxann5 | 2:72a8d2b11320 | 353 | void btn_l_press(){ |
xxann5 | 8:5674f5ab61cd | 354 | printf("button,left,press\n\r"); |
xxann5 | 6:4cb2c9a3abcd | 355 | mouse->press(MOUSE_LEFT); |
xxann5 | 2:72a8d2b11320 | 356 | } |
xxann5 | 2:72a8d2b11320 | 357 | void btn_l_release(){ |
xxann5 | 8:5674f5ab61cd | 358 | printf("button,left,release\n\r"); |
xxann5 | 6:4cb2c9a3abcd | 359 | mouse->release(MOUSE_LEFT); |
xxann5 | 2:72a8d2b11320 | 360 | } |
xxann5 | 2:72a8d2b11320 | 361 | |
xxann5 | 2:72a8d2b11320 | 362 | void btn_m_press(){ |
xxann5 | 8:5674f5ab61cd | 363 | //mouse->press(MOUSE_MIDDLE); |
xxann5 | 2:72a8d2b11320 | 364 | } |
xxann5 | 2:72a8d2b11320 | 365 | void btn_m_release(){ |
xxann5 | 8:5674f5ab61cd | 366 | //mouse->release(MOUSE_MIDDLE); |
xxann5 | 2:72a8d2b11320 | 367 | } |
xxann5 | 2:72a8d2b11320 | 368 | |
xxann5 | 2:72a8d2b11320 | 369 | void btn_r_press(){ |
xxann5 | 8:5674f5ab61cd | 370 | printf("button,right,press\n\r"); |
xxann5 | 6:4cb2c9a3abcd | 371 | mouse->press(MOUSE_RIGHT); |
xxann5 | 2:72a8d2b11320 | 372 | } |
xxann5 | 8:5674f5ab61cd | 373 | |
xxann5 | 2:72a8d2b11320 | 374 | void btn_r_release(){ |
xxann5 | 8:5674f5ab61cd | 375 | printf("button,right,release\n\r"); |
xxann5 | 6:4cb2c9a3abcd | 376 | mouse->release(MOUSE_RIGHT); |
xxann5 | 2:72a8d2b11320 | 377 | } |
xxann5 | 1:34085d7e0991 | 378 | |
xxann5 | 8:5674f5ab61cd | 379 | void btn_f_press(){ |
xxann5 | 8:5674f5ab61cd | 380 | printf("button,forword,press\n\r"); |
xxann5 | 8:5674f5ab61cd | 381 | mouse->press(MOUSE_FORWORD); |
xxann5 | 8:5674f5ab61cd | 382 | } |
xxann5 | 8:5674f5ab61cd | 383 | void btn_f_release(){ |
xxann5 | 8:5674f5ab61cd | 384 | printf("button,forword,release\n\r"); |
xxann5 | 8:5674f5ab61cd | 385 | mouse->release(MOUSE_FORWORD); |
xxann5 | 8:5674f5ab61cd | 386 | } |
xxann5 | 8:5674f5ab61cd | 387 | |
xxann5 | 8:5674f5ab61cd | 388 | void btn_b_press(){ |
xxann5 | 8:5674f5ab61cd | 389 | printf("button,back,press\n\r"); |
xxann5 | 8:5674f5ab61cd | 390 | mouse->press(MOUSE_BACK); |
xxann5 | 8:5674f5ab61cd | 391 | } |
xxann5 | 8:5674f5ab61cd | 392 | |
xxann5 | 8:5674f5ab61cd | 393 | void btn_b_release(){ |
xxann5 | 8:5674f5ab61cd | 394 | printf("button,back,release\n\r"); |
xxann5 | 8:5674f5ab61cd | 395 | mouse->release(MOUSE_BACK); |
xxann5 | 8:5674f5ab61cd | 396 | } |
xxann5 | 8:5674f5ab61cd | 397 | |
xxann5 | 8:5674f5ab61cd | 398 | void btn_hr_press(){ |
xxann5 | 8:5674f5ab61cd | 399 | printf("button,high_res,press\n\r"); |
xxann5 | 8:5674f5ab61cd | 400 | set_res_hr = true; |
xxann5 | 8:5674f5ab61cd | 401 | set_res_default = false; |
xxann5 | 8:5674f5ab61cd | 402 | high_rez_active = true; |
xxann5 | 8:5674f5ab61cd | 403 | } |
xxann5 | 8:5674f5ab61cd | 404 | void btn_hr_release(){ |
xxann5 | 8:5674f5ab61cd | 405 | printf("button,high_res,release\n\r"); |
xxann5 | 8:5674f5ab61cd | 406 | set_res_hr = false; |
xxann5 | 8:5674f5ab61cd | 407 | set_res_default = true; |
xxann5 | 8:5674f5ab61cd | 408 | high_rez_active = false; |
xxann5 | 8:5674f5ab61cd | 409 | } |
xxann5 | 8:5674f5ab61cd | 410 | |
xxann5 | 8:5674f5ab61cd | 411 | void btn_z_press(){ |
xxann5 | 8:5674f5ab61cd | 412 | printf("button,z,press\n\r"); |
xxann5 | 8:5674f5ab61cd | 413 | set_res_z = true; |
xxann5 | 8:5674f5ab61cd | 414 | set_res_default = false; |
xxann5 | 8:5674f5ab61cd | 415 | z_axis_active = true; |
xxann5 | 8:5674f5ab61cd | 416 | } |
xxann5 | 8:5674f5ab61cd | 417 | void btn_z_release(){ |
xxann5 | 8:5674f5ab61cd | 418 | printf("button,z,release\n\r"); |
xxann5 | 8:5674f5ab61cd | 419 | set_res_z = false; |
xxann5 | 8:5674f5ab61cd | 420 | set_res_default = true; |
xxann5 | 8:5674f5ab61cd | 421 | z_axis_active = false; |
xxann5 | 8:5674f5ab61cd | 422 | } |
xxann5 | 8:5674f5ab61cd | 423 | |
xxann5 | 8:5674f5ab61cd | 424 | void prfl_a_set(){ |
xxann5 | 8:5674f5ab61cd | 425 | s[PROFILE_CURRENT] = 0; |
xxann5 | 8:5674f5ab61cd | 426 | profile_load = true; |
xxann5 | 8:5674f5ab61cd | 427 | } |
xxann5 | 8:5674f5ab61cd | 428 | |
xxann5 | 8:5674f5ab61cd | 429 | void prfl_b_set(){ |
xxann5 | 8:5674f5ab61cd | 430 | s[PROFILE_CURRENT] = 1; |
xxann5 | 8:5674f5ab61cd | 431 | profile_load = true; |
xxann5 | 8:5674f5ab61cd | 432 | } |
xxann5 | 8:5674f5ab61cd | 433 | |
xxann5 | 8:5674f5ab61cd | 434 | void prfl_c_set(){ |
xxann5 | 8:5674f5ab61cd | 435 | s[PROFILE_CURRENT] = 2; |
xxann5 | 8:5674f5ab61cd | 436 | profile_load = true; |
xxann5 | 8:5674f5ab61cd | 437 | } |
xxann5 | 8:5674f5ab61cd | 438 | |
xxann5 | 8:5674f5ab61cd | 439 | void prfl_d_set(){ |
xxann5 | 8:5674f5ab61cd | 440 | s[PROFILE_CURRENT] = 3; |
xxann5 | 8:5674f5ab61cd | 441 | profile_load = true; |
xxann5 | 8:5674f5ab61cd | 442 | } |
xxann5 | 8:5674f5ab61cd | 443 | |
xxann5 | 8:5674f5ab61cd | 444 | void prfl_e_set(){ |
xxann5 | 8:5674f5ab61cd | 445 | s[PROFILE_CURRENT] = 4; |
xxann5 | 8:5674f5ab61cd | 446 | profile_load = true; |
xxann5 | 8:5674f5ab61cd | 447 | } |
xxann5 | 8:5674f5ab61cd | 448 | |
xxann5 | 8:5674f5ab61cd | 449 | void prfl_stub(){ |
xxann5 | 8:5674f5ab61cd | 450 | } |
xxann5 | 8:5674f5ab61cd | 451 | |
xxann5 | 8:5674f5ab61cd | 452 | void debug_out(){ |
xxann5 | 8:5674f5ab61cd | 453 | printf("motion_triggerd %d\n\r" , motion_triggered); |
xxann5 | 8:5674f5ab61cd | 454 | printf("z_axis_active %d\n\r", z_axis_active); |
xxann5 | 8:5674f5ab61cd | 455 | printf("high_rez_active %d\n\r", high_rez_active); |
xxann5 | 8:5674f5ab61cd | 456 | printf("profile_load %d\n\r", profile_load); // Always inishally load the profile even if it might be the same. |
xxann5 | 8:5674f5ab61cd | 457 | printf("set_res_hr %d\n\r", set_res_hr); |
xxann5 | 8:5674f5ab61cd | 458 | printf("set_res_z %d\n\r" , set_res_z); |
xxann5 | 8:5674f5ab61cd | 459 | printf("set_res_default %d\n\r", set_res_default); |
xxann5 | 8:5674f5ab61cd | 460 | } |
xxann5 | 7:d6ee49a89009 | 461 | |
xxann5 | 7:d6ee49a89009 | 462 | /* |
xxann5 | 7:d6ee49a89009 | 463 | * The settings are kept in the first 'N' addresses of the of the EEPROM. |
xxann5 | 7:d6ee49a89009 | 464 | * They are 16bits long. The default settings are in a uint16_t array. So |
xxann5 | 7:d6ee49a89009 | 465 | * to set/get a setting you use the array value and multiple it by two. |
xxann5 | 7:d6ee49a89009 | 466 | * This way I can easily get all setting at the start of the program by |
xxann5 | 7:d6ee49a89009 | 467 | * simply looping through the array. |
xxann5 | 7:d6ee49a89009 | 468 | */ |
xxann5 | 7:d6ee49a89009 | 469 | |
xxann5 | 7:d6ee49a89009 | 470 | |
xxann5 | 8:5674f5ab61cd | 471 | int set_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val, uint16_t base_address ){ |
xxann5 | 7:d6ee49a89009 | 472 | |
xxann5 | 8:5674f5ab61cd | 473 | uint8_t hl[2]; |
xxann5 | 7:d6ee49a89009 | 474 | |
xxann5 | 7:d6ee49a89009 | 475 | // TODO: Its working but is it working the way i think its working |
xxann5 | 7:d6ee49a89009 | 476 | hl[0] = (int)val; |
xxann5 | 7:d6ee49a89009 | 477 | hl[1] = (int)(val >> 8); |
xxann5 | 8:5674f5ab61cd | 478 | |
xxann5 | 8:5674f5ab61cd | 479 | printf("Set Setting %d: L[%X] H[%X]\n\r", attrib, hl[0], hl[1] ); |
xxann5 | 7:d6ee49a89009 | 480 | |
xxann5 | 8:5674f5ab61cd | 481 | if ( eeprom->write( attrib * 2, 0x2, hl )){ |
xxann5 | 8:5674f5ab61cd | 482 | return true; |
xxann5 | 8:5674f5ab61cd | 483 | } |
xxann5 | 8:5674f5ab61cd | 484 | return false; |
xxann5 | 7:d6ee49a89009 | 485 | } |
xxann5 | 7:d6ee49a89009 | 486 | |
xxann5 | 8:5674f5ab61cd | 487 | uint16_t get_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address ){ |
xxann5 | 7:d6ee49a89009 | 488 | |
xxann5 | 7:d6ee49a89009 | 489 | uint16_t val; |
xxann5 | 8:5674f5ab61cd | 490 | uint8_t *hl; |
xxann5 | 7:d6ee49a89009 | 491 | |
xxann5 | 8:5674f5ab61cd | 492 | hl = eeprom->read( (attrib * 2) + base_address, 0x2 ); |
xxann5 | 8:5674f5ab61cd | 493 | printf("Get Setting %d: L[%X] H[%X]\n\r", attrib, hl[0], hl[1] ); |
xxann5 | 7:d6ee49a89009 | 494 | val = UINT16( hl[1], hl[0] ); |
xxann5 | 7:d6ee49a89009 | 495 | if( val != 0xFFFF ){ |
xxann5 | 7:d6ee49a89009 | 496 | return val; |
xxann5 | 5:c7056267daa7 | 497 | } |
xxann5 | 7:d6ee49a89009 | 498 | |
xxann5 | 7:d6ee49a89009 | 499 | return s[attrib]; |
xxann5 | 5:c7056267daa7 | 500 | } |
xxann5 | 5:c7056267daa7 | 501 | |
xxann5 | 8:5674f5ab61cd | 502 | void clear_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address ){ |
xxann5 | 8:5674f5ab61cd | 503 | uint8_t val[2]; |
xxann5 | 7:d6ee49a89009 | 504 | val[0] = val[1] = 0xFF; |
xxann5 | 8:5674f5ab61cd | 505 | eeprom->write( (attrib * 2) + base_address , 0x2, val ); |
xxann5 | 7:d6ee49a89009 | 506 | } |
xxann5 | 7:d6ee49a89009 | 507 | |
xxann5 | 8:5674f5ab61cd | 508 | |
xxann5 | 7:d6ee49a89009 | 509 | /* |
xxann5 | 7:d6ee49a89009 | 510 | * Getting and setting the firmware is a bit easer as it is all 8bit. |
xxann5 | 7:d6ee49a89009 | 511 | */ |
xxann5 | 8:5674f5ab61cd | 512 | void load_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len, const uint8_t* data ){ |
xxann5 | 8:5674f5ab61cd | 513 | eeprom->write( base , len, data ); |
xxann5 | 7:d6ee49a89009 | 514 | } |
xxann5 | 7:d6ee49a89009 | 515 | |
xxann5 | 8:5674f5ab61cd | 516 | uint8_t* get_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len ){ |
xxann5 | 8:5674f5ab61cd | 517 | return (uint8_t*)eeprom->read( base, len ); |
xxann5 | 7:d6ee49a89009 | 518 | } |