Trackball based on the NXP LPC11U24 and the ADNS-9500

Dependencies:   ADNS9500 USBDevice mbed 25LCxxx_SPI

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?

UserRevisionLine numberNew 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 }