Trackball based on the NXP LPC11U24 and the ADNS-9500
Dependencies: ADNS9500 USBDevice mbed 25LCxxx_SPI
Diff: main.cpp
- Revision:
- 2:72a8d2b11320
- Parent:
- 1:34085d7e0991
- Child:
- 5:c7056267daa7
diff -r 34085d7e0991 -r 72a8d2b11320 main.cpp --- a/main.cpp Sun Dec 09 05:34:22 2012 +0000 +++ b/main.cpp Wed Dec 12 03:21:38 2012 +0000 @@ -1,109 +1,114 @@ -#include "mbed.h" -#include "USBMouse.h" -#include <math.h> -#include <stdint.h> - -#define ADNS9500_SROM_91 - -#include "adns9500.hpp" - +#include "main.h" -DigitalOut led1(LED1); -DigitalOut led2(LED2); -DigitalOut led3(LED3); -DigitalOut led4(LED4); - -DigitalIn left(p18); -DigitalIn middle(p19); -DigitalIn right(p20); - -USBMouse mouse; - -//Ticker printData; +/* + * type, VID, PID, release + */ +USBMouse mouse( REL_MOUSE, 0x192f, 0x0000, 0x0001 ) ; /* * mosi miso sclk ncs FREQ, motion */ adns9500::ADNS9500 sensor(p5, p6, p7, p8, adns9500::MAX_SPI_FREQUENCY, p21); -bool motionTriggered = false; -//bool printDataTriggered = false; - -int motionCallbackCounter = 0; - -//void printDataCallback() -//{ -// printDataTriggered = true; -//} - void motionCallback() { - motionTriggered = true; - motionCallbackCounter++; + motion_triggered = true; +} + +void btn_hr_press(){ + high_rez_active = true; + sensor.setResolution( default_hirez_cpi ); +} +void btn_hr_release(){ + high_rez_active = false; + sensor.setResolution( default_motion_cpi ); +} + +void btn_z_press(){ + z_axis_active = true; + sensor.setResolution( default_z_cpi ); +} +void btn_z_release(){ + z_axis_active = false; + sensor.setResolution( default_motion_cpi ); } +void btn_l_press(){ + mouse.press(MOUSE_LEFT); +} +void btn_l_release(){ + mouse.release(MOUSE_LEFT); +} + +void btn_m_press(){ + mouse.press(MOUSE_MIDDLE); +} +void btn_m_release(){ + mouse.release(MOUSE_MIDDLE); +} + +void btn_r_press(){ + mouse.press(MOUSE_RIGHT); +} +void btn_r_release(){ + mouse.release(MOUSE_RIGHT); +} int main(void) { - int dataReadCounter = 0; - float totalMotionDx = 0.0; - float totalMotionDy = 0.0; + + btn_hr.rise(&btn_hr_press); + btn_hr.fall(&btn_hr_release); + + btn_z.rise(&btn_z_press); + btn_z.fall(&btn_z_release); - printf("attach.\r\n"); + btn_l.rise(&btn_l_press); + btn_l.fall(&btn_l_release); + + btn_m.rise(&btn_m_press); + btn_m.fall(&btn_m_release); + + btn_r.rise(&btn_r_press); + btn_r.fall(&btn_r_release); + + int dx, dy; + sensor.attach(&motionCallback); - printf("reset\r\n"); sensor.reset(); - printf("srom downlaod\r\n"); uint16_t crc = sensor.sromDownload(adns9500FWArray, (uint16_t)ADNS9500_FIRMWARE_LEN ); - - printf( "CRC [%x] [%x].\r\n", (uint16_t)ADNS6010_FIRMWARE_CRC, crc ); - + if( (uint16_t)ADNS6010_FIRMWARE_CRC != crc ) { - printf( "CRC does not match: [%x] [%x].\r\n", (uint16_t)ADNS6010_FIRMWARE_CRC, crc ); - error( "Exiting.\r\n" ); + error( "CRC does not match: [%x] [%x], Exiting.\r\n", (uint16_t)ADNS6010_FIRMWARE_CRC, crc ); } - printf("Enable lazer\r\n"); - sensor.getLaser(); - wait(3); + sensor.enableLaser(); - sensor.getLaser(); + + sensor.setResolution( default_motion_cpi ); while (true) { - if( left ){ - mouse.click( 0 ); - led2 = !led2; - } - if( middle ){ - mouse.click( 1 ); - led2 = !led3; - } - if( ! right ){ - mouse.click( 2 ); - led2 = !led4; - } - - int dx, dy; - if (motionTriggered) { + if (motion_triggered) { led1 = !led1; - motionTriggered = false; + motion_triggered = false; sensor.getMotionDelta(dx, dy); - totalMotionDx += dx; - totalMotionDy += dy; - - dataReadCounter++; - - mouse.move( dx, - dy ); - //printf( "X: %d Y: %d\r\n", dx, dy); + /* + * The sensor does not know its upside down and backwords + * so we are helping it out with the y axis. + */ + if( z_axis_active ){ + mouse.scroll( - dy ); + } + else{ + mouse.move( dx, - dy ); + } } - - //wait(0.5); } }