Trackball based on the NXP LPC11U24 and the ADNS-9500

Dependencies:   ADNS9500 USBDevice mbed 25LCxxx_SPI

Committer:
xxann5
Date:
Mon Jan 14 04:27:55 2013 +0000
Revision:
7:d6ee49a89009
Parent:
6:4cb2c9a3abcd
Child:
8:5674f5ab61cd
Changed some define's to enum's. Also got a lot done towards having persistent settings/ADNS firmware saved on the eeprom.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xxann5 6:4cb2c9a3abcd 1 /* Copyright (c) 2012-2013 Chris Majoros(chris@majoros.us), MIT License
xxann5 6:4cb2c9a3abcd 2 *
xxann5 6:4cb2c9a3abcd 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
xxann5 6:4cb2c9a3abcd 4 * and associated documentation files (the "Software"), to deal in the Software without
xxann5 6:4cb2c9a3abcd 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
xxann5 6:4cb2c9a3abcd 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
xxann5 6:4cb2c9a3abcd 7 * Software is furnished to do so, subject to the following conditions:
xxann5 6:4cb2c9a3abcd 8 *
xxann5 6:4cb2c9a3abcd 9 * The above copyright notice and this permission notice shall be included in all copies or
xxann5 6:4cb2c9a3abcd 10 * substantial portions of the Software.
xxann5 6:4cb2c9a3abcd 11 *
xxann5 6:4cb2c9a3abcd 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
xxann5 6:4cb2c9a3abcd 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
xxann5 6:4cb2c9a3abcd 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
xxann5 6:4cb2c9a3abcd 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
xxann5 6:4cb2c9a3abcd 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
xxann5 6:4cb2c9a3abcd 17 */
xxann5 6:4cb2c9a3abcd 18
xxann5 5:c7056267daa7 19 #include "mbed.h"
xxann5 5:c7056267daa7 20 #include "USBHID.h"
xxann5 5:c7056267daa7 21 #include "USBMouse.h"
xxann5 6:4cb2c9a3abcd 22
xxann5 5:c7056267daa7 23 #include <math.h>
xxann5 5:c7056267daa7 24 #include <stdint.h>
xxann5 5:c7056267daa7 25
xxann5 6:4cb2c9a3abcd 26
xxann5 6:4cb2c9a3abcd 27 #define PINDETECT_PIN_ASSTERED 0 //setAssertValue
xxann5 6:4cb2c9a3abcd 28 #define PINDETECT_SAMPLE_PERIOD 100 //setSampleFrequency
xxann5 6:4cb2c9a3abcd 29 #define PINDETECT_ASSERT_COUNT 10 //setSamplesTillAssert
xxann5 6:4cb2c9a3abcd 30 #define PINDETECT_HOLD_COUNT 500
xxann5 6:4cb2c9a3abcd 31
xxann5 6:4cb2c9a3abcd 32 #include "PinDetect.h"
xxann5 6:4cb2c9a3abcd 33
xxann5 5:c7056267daa7 34 #define ADNS9500_SROM_91
xxann5 5:c7056267daa7 35
xxann5 5:c7056267daa7 36 #define DEBUG
xxann5 5:c7056267daa7 37
xxann5 5:c7056267daa7 38 #include "adns9500.hpp"
xxann5 5:c7056267daa7 39 #include "Ser25lcxxx.h"
xxann5 5:c7056267daa7 40
xxann5 7:d6ee49a89009 41 enum cli_actions {
xxann5 7:d6ee49a89009 42 SET = 0x01,
xxann5 7:d6ee49a89009 43 GET = 0x02,
xxann5 7:d6ee49a89009 44 CLEAR = 0x03,
xxann5 7:d6ee49a89009 45 INIT = 0x04,
xxann5 7:d6ee49a89009 46 };
xxann5 7:d6ee49a89009 47
xxann5 7:d6ee49a89009 48 enum settings {
xxann5 7:d6ee49a89009 49 CPI_DEFAULT = 0x00,
xxann5 7:d6ee49a89009 50 CPI_MAX = 0x01,
xxann5 7:d6ee49a89009 51 CPI_MIN = 0x02,
xxann5 7:d6ee49a89009 52 CPI_STEP = 0x03,
xxann5 7:d6ee49a89009 53 CPI_Z_DEFAULT = 0x04,
xxann5 7:d6ee49a89009 54 CPI_HR_DEFAULT = 0x05,
xxann5 5:c7056267daa7 55
xxann5 7:d6ee49a89009 56 VID = 0x06,
xxann5 7:d6ee49a89009 57 PID = 0x07,
xxann5 7:d6ee49a89009 58
xxann5 7:d6ee49a89009 59 LED_SHOW = 0x08,
xxann5 7:d6ee49a89009 60 SETTINGS_OFFSET = 0x00
xxann5 7:d6ee49a89009 61 };
xxann5 5:c7056267daa7 62
xxann5 7:d6ee49a89009 63 enum ands_meta {
xxann5 7:d6ee49a89009 64 ADNS_CRC = 0x0,
xxann5 7:d6ee49a89009 65 ADNS_ID = 0x1,
xxann5 7:d6ee49a89009 66 ADNS_FW_LEN = 0x2,
xxann5 7:d6ee49a89009 67 ADNS_FW_OFFSET = 0xF000,
xxann5 7:d6ee49a89009 68 ADNS_META_OFFSET = 0xEFF0
xxann5 7:d6ee49a89009 69 };
xxann5 5:c7056267daa7 70
xxann5 7:d6ee49a89009 71 #define UINT16(ub, lb) (uint16_t)(((ub & 0xff) << 8) | (lb & 0xff))
xxann5 7:d6ee49a89009 72 #define INT16(ub, lb) (int16_t)(((ub & 0xff) << 8) | (lb & 0xff))
xxann5 5:c7056267daa7 73
xxann5 5:c7056267daa7 74 //This report will contain data to be sent
xxann5 5:c7056267daa7 75 HID_REPORT send_rep;
xxann5 5:c7056267daa7 76 HID_REPORT recv_rep;
xxann5 5:c7056267daa7 77
xxann5 7:d6ee49a89009 78 PinDetect btn_l(P1_25);
xxann5 7:d6ee49a89009 79 PinDetect btn_m(P1_19);
xxann5 7:d6ee49a89009 80 PinDetect btn_r(P0_20);
xxann5 7:d6ee49a89009 81 PinDetect btn_z(P0_2);
xxann5 7:d6ee49a89009 82 PinDetect btn_hr(P1_26);
xxann5 5:c7056267daa7 83
xxann5 7:d6ee49a89009 84 DigitalIn btn_program(P0_4);
xxann5 6:4cb2c9a3abcd 85
xxann5 6:4cb2c9a3abcd 86 adns9500::ADNS9500 *sensor;
xxann5 6:4cb2c9a3abcd 87 USBMouse *mouse;
xxann5 5:c7056267daa7 88
xxann5 5:c7056267daa7 89 bool motion_triggered = false;
xxann5 5:c7056267daa7 90 bool z_axis_active = false;
xxann5 5:c7056267daa7 91 bool high_rez_active = false;
xxann5 5:c7056267daa7 92
xxann5 7:d6ee49a89009 93 uint16_t s[9] = {
xxann5 7:d6ee49a89009 94 1080, // CPI_DEFAULT
xxann5 7:d6ee49a89009 95 5040, // CPI_MAX
xxann5 7:d6ee49a89009 96 0, // CPI_MIN
xxann5 7:d6ee49a89009 97 90, // CPI_STEP
xxann5 7:d6ee49a89009 98 90, // CPI_Z_DEFAULT
xxann5 7:d6ee49a89009 99 180, // CPI_HR_DEFULT
xxann5 7:d6ee49a89009 100 0x192f, // VID
xxann5 7:d6ee49a89009 101 0x0000, // PID
xxann5 7:d6ee49a89009 102 0, // LED_SHOW
xxann5 7:d6ee49a89009 103 };
xxann5 7:d6ee49a89009 104
xxann5 7:d6ee49a89009 105 uint16_t a[3];
xxann5 5:c7056267daa7 106
xxann5 6:4cb2c9a3abcd 107 void track();
xxann5 6:4cb2c9a3abcd 108 void program();
xxann5 5:c7056267daa7 109
xxann5 6:4cb2c9a3abcd 110 void motionCallback( void );
xxann5 6:4cb2c9a3abcd 111
xxann5 6:4cb2c9a3abcd 112 void btn_hr_press( void );
xxann5 6:4cb2c9a3abcd 113 void btn_hr_release( void );
xxann5 5:c7056267daa7 114
xxann5 6:4cb2c9a3abcd 115 void btn_z_press( void );
xxann5 6:4cb2c9a3abcd 116 void btn_z_release( void );
xxann5 5:c7056267daa7 117
xxann5 6:4cb2c9a3abcd 118 void btn_l_press(void);
xxann5 6:4cb2c9a3abcd 119 void btn_l_release( void );
xxann5 6:4cb2c9a3abcd 120
xxann5 6:4cb2c9a3abcd 121 void btn_m_press( void );
xxann5 6:4cb2c9a3abcd 122 void btn_m_release( void );
xxann5 6:4cb2c9a3abcd 123
xxann5 6:4cb2c9a3abcd 124 void btn_r_press( void );
xxann5 6:4cb2c9a3abcd 125 void btn_r_release( void );
xxann5 5:c7056267daa7 126
xxann5 7:d6ee49a89009 127 void set_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val );
xxann5 7:d6ee49a89009 128 uint16_t get_setting( Ser25LCxxx *eeprom, uint16_t attrib);
xxann5 7:d6ee49a89009 129 void clear_setting( Ser25LCxxx *eeprom, uint16_t attrib);
xxann5 7:d6ee49a89009 130
xxann5 7:d6ee49a89009 131 void set_adns_firmware( Ser25LCxxx *eeprom, uint16_t offset, uint16_t len, uint8_t* val );
xxann5 7:d6ee49a89009 132 uint8_t* get_adns_firmware( Ser25LCxxx *eeprom, uint16_t offset, uint16_t len );
xxann5 7:d6ee49a89009 133
xxann5 7:d6ee49a89009 134 void set_adns_meta( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val );
xxann5 7:d6ee49a89009 135 uint16_t get_adns_meta( Ser25LCxxx *eeprom, uint16_t attrib );