Trackball based on the NXP LPC11U24 and the ADNS-9500

Dependencies:   ADNS9500 USBDevice mbed 25LCxxx_SPI

Revision:
2:72a8d2b11320
Parent:
1:34085d7e0991
Child:
5:c7056267daa7
--- 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);
     }
 }