Trackball based on the NXP LPC11U24 and the ADNS-9500

Dependencies:   ADNS9500 USBDevice mbed 25LCxxx_SPI

main.h

Committer:
xxann5
Date:
2013-03-14
Revision:
9:ee05aa95f5c9
Parent:
8:5674f5ab61cd

File content as of revision 9:ee05aa95f5c9:

/* 
 *  loststone is free sofware: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License 3 as published by
 *  the Free Software Foundation.
 *
 *  loststone is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with loststone. If not, see <http://www.gnu.org/licenses/gpl.txt>.
 *
 *  Copyright (c) 2012-2013 Chris Majoros(chris@majoros.us), GNU3
 */

#include "mbed.h"
#include "USBHID.h"
#include "USBMouse.h"
#include "Ser25lcxxx.h"

#include <stdint.h>

#define ADNS9500_SROM_91
#define ADNS9500_CRCHI (0xBE)
#define ADNS9500_CRCLO (0xEF)
#define ADNS9500_ID (0x56)
#define ADNS6010_FIRMWARE_CRC (0xBEEF)
#define ADNS9500_FIRMWARE_LEN 3070

#include "adns9500.hpp"


#define UINT16(ub, lb)             (uint16_t)(((ub & 0xff) << 8) | (lb & 0xff))
#define INT16(ub, lb)              (int16_t)(((ub & 0xff) << 8) | (lb & 0xff))

#define SETTINGS_BASE 0x00
#define PROFILE_BASE 0xff
#define PROFILE_LEN 0x13

#define MBED

typedef void (*fn)(void);

enum cli_actions {
    SET       = 0x01,
    GET       = 0x02,
    LOAD_DATA = 0x03,
    GET_DATA  = 0x04,
    CLEAR     = 0x05,
    INIT      = 0x06
};

enum cli_replies {
    retval  = 0x01,
    message = 0x02
};

enum buttons {
    BUTTON_LEFT = 0x00, //explisitly showing we start at zero
    BUTTON_MIDDLE,
    BUTTON_RIGHT,
    BUTTON_FORWORD,
    BUTTON_BACK,
    BUTTON_Z,
    BUTTON_HIGH_RES,
};
enum settings {    
    CPI_X = 0x00, //explisitly showing we start at zero
    CPI_Y,
    CPI_X_MULITIPLYER,
    CPI_Y_MULITIPLYER,
    CPI_MAX, // Not currently used.
    CPI_MIN, // Not currently used.
    CPI_STEP, // Not currently used.
    CPI_Z,
    CPI_H,
    CPI_HR_X,
    CPI_HR_Y,
    
    BTN_A,
    BTN_B,
    BTN_C,
    BTN_D,
    BTN_E,
    BTN_F,
    BTN_G,
    
    LED_ACTION, // Not currently used
    
    VID,
    PID,
    RELEASE,
    
    PROFILE_DEFAULT,
    PROFILE_CURRENT,
    


    ADNS_CRC,
    ADNS_ID,
    ADNS_FW_LEN,
    ADNS_FW_OFFSET,
};




#ifdef MBED
DigitalIn run_mode(p36);

DigitalIn motion_in(p14);

DigitalOut activity(p35);

InterruptIn debug(p29);
    
InterruptIn btn_a(p21);
InterruptIn btn_b(p22);
InterruptIn btn_c(p23);
InterruptIn btn_d(p24);
InterruptIn btn_e(p25);
InterruptIn btn_f(p26);
InterruptIn btn_g(p27);

InterruptIn prfl_a(p20);
InterruptIn prfl_b(p19);
InterruptIn prfl_c(p18);
InterruptIn prfl_d(p17);
InterruptIn prfl_e(p16);
#elif
DigitalIn run_mode(P1_29);

DigitalIn motion_in(P0_22);

DigitalOut activity(P1_28);

InterruptIn btn_a(P0_18);
InterruptIn btn_b(P0_16);
InterruptIn btn_c(P0_17);
InterruptIn btn_d(P0_23);
InterruptIn btn_e(P1_15);
InterruptIn btn_f(P1_??);
InterruptIn btn_g(P1_??);

InterruptIn prfl_a(P0_4);
InterruptIn prfl_b(P0_5);
InterruptIn prfl_c(P0_21);
InterruptIn prfl_d(P1_23);
InterruptIn prfl_e(P1_24);
#endif

// We are global for the callbacks
USBMouse *mouse;

bool motion_triggered = true;
bool z_axis_active = false;
bool high_rez_active = false;
bool profile_load = true; // Always inishally load the profile even if it might be the same.
bool set_res_hr = false;
bool set_res_z = false;
bool set_res_default = false;
//uint32_t rest_counter;

uint16_t s[28] = {
    540,     // CPI_X
    540,     // CPI_Y
    40,      // CPI_X_MULITIPLYER
    40,      // CPI_Y_MULITIPLYER
    5040,    // CPI_MAX
    0,       // CPI_MIN
    90,      // CPI_STEP
    0,       // CPI_Z
    0,       // CPI_H
    360,     // CPI_HR_X
    360,     // CPI_HR_Y
    BUTTON_LEFT,
    BUTTON_MIDDLE,
    BUTTON_RIGHT,
    BUTTON_Z,
    BUTTON_HIGH_RES,
    BUTTON_FORWORD,
    BUTTON_BACK,
    0x00,    // LED_ACTION
    0x192f,  // VID  (No default, must be set)
    0x0000,  // PID  (No default, must be set)
    0x00,    // PROFILE_DEFAULT
    0x00,    // PROFILE_CURRENT
    0x0000,  // RELEASE
    0xffff,  // ADNS_CRC    (No default, must be set)
    0xffff,  // ADNS_ID     (No default, must be set)
    0xffff,  // ADNS_FW_LEN (No default, must be set)
    0xea60   // ADNS_FW_OFFSET
};



void track( Ser25LCxxx *eeprom );
void program( Ser25LCxxx *eeprom );

void motionCallback( void );

void btn_hr_press( void );
void btn_hr_release( void );

void btn_z_press( void );
void btn_z_release( void );

void btn_l_press(void);
void btn_l_release( void );

void btn_m_press( void );
void btn_m_release( void );

void btn_r_press( void );
void btn_r_release( void );

void btn_f_press( void );
void btn_f_release( void );

void btn_b_press( void );
void btn_b_release( void );

void prfl_a_set( void );
void prfl_b_set( void );
void prfl_c_set( void );
void prfl_d_set( void );
void prfl_e_set( void );

void prfl_stub( void );
void debug_out(void);

int set_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t val, uint16_t base_address );
uint16_t get_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address );
void clear_setting( Ser25LCxxx *eeprom, uint16_t attrib, uint16_t base_address );

void load_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len, const uint8_t* data );

uint8_t* get_data( Ser25LCxxx *eeprom, uint16_t base, uint16_t len );