xypad theremin for LPC1768

Dependencies:   MODDMA mbed

Revision:
1:aa184d2eb2e3
Parent:
0:8ee38453bad9
Child:
2:c5eeaf1c8e69
--- a/touch.cpp	Sun Mar 13 01:12:40 2016 +0000
+++ b/touch.cpp	Mon Mar 14 23:37:58 2016 +0000
@@ -32,7 +32,7 @@
  *      
  */
 
-typedef enum {TOUCH_NOTOUCH,TOUCH_DEBOUNCE,TOUCH_PRESENT} TOUCH_STATE;
+typedef enum {TOUCH_NOTOUCH,TOUCH_DEBOUNCE,NOTOUCH_DEBOUNCE,TOUCH_PRESENT} TOUCH_STATE;
 
 
 #define TSC_ADDR  0x82     // (i2c address for touchscreen)<<1
@@ -100,12 +100,13 @@
 
 // GPIO_AF -- GPIO Alternate FunctionRegister
 #define GPIO_AF       0x17
-
+DigitalOut led1(LED1);
 DigitalOut led4(LED4);
 
 i2c_t touch_ctrl;  // i2c interface struct for touch screen
 
-static bool touch_present(void);
+static int touch_present(void);
+static void touch_reset(void);
 static void touch_compute_params(void);
 
 static char tsc_reset[2]={SYS_CTRL1, SOFT_RESET};
@@ -137,10 +138,17 @@
  
 // used by state machine that debounces touch detection 
 TOUCH_STATE touch_state=TOUCH_NOTOUCH;
-#define GOOD_TOUCH_COUNT 8
-#define NO_TOUCH_COUNT 8
+#define GOOD_TOUCH_COUNT 4
+#define NO_TOUCH_COUNT 4
+
+bool touch_init(void)
+{
+    touch_reset();
+    touch_state = TOUCH_NOTOUCH;
+    return true;    
+}
  
-bool touch_init(void)
+void touch_reset(void)
 {
     char chipid[2];
 
@@ -205,44 +213,55 @@
 
     i2c_write(&touch_ctrl,TSC_ADDR,ena_intrupt,2,1);
     wait_ms(1);
-
-    touch_state = TOUCH_NOTOUCH;
-    return true;
 }
 
 bool touch_debounce(void)
 {
     static int debounce_count=0;
+    int tret;
 
+    tret=touch_present();
     switch (touch_state) {
     case TOUCH_NOTOUCH:
-        if (touch_present()) {
+        if (tret>0) {
             debounce_count=0;
             touch_state = TOUCH_DEBOUNCE;
         }
         break;
 
     case TOUCH_DEBOUNCE:
-        if (touch_present()) {
+        if (tret>0) {
             if (++debounce_count > GOOD_TOUCH_COUNT) {
                 touch_state = TOUCH_PRESENT;
+                led1=1;
             }
-        } else {
+        } else if(tret == 0) {
             touch_state = TOUCH_NOTOUCH;
         }
         break;
+        
+    case NOTOUCH_DEBOUNCE:
+        if(tret>0) {
+            touch_state = TOUCH_PRESENT;
+        } else if(tret== 0) {
+            if(++debounce_count > NO_TOUCH_COUNT) {
+                debounce_count=0;
+                touch_state=TOUCH_NOTOUCH;
+            }
+        }
+        break;
 
     case TOUCH_PRESENT:
-        if (touch_present()) {
+        if (tret>0) {
             touch_compute_params();
-            return true;
-        } else {
-            touch_state = TOUCH_NOTOUCH;
+        } else if(tret==0) {
+            debounce_count=0;
+            touch_state=NOTOUCH_DEBOUNCE;
         }
         break;
 
     }
-    return false;
+    return ((touch_state==TOUCH_PRESENT) || (touch_state==NOTOUCH_DEBOUNCE));
 }
 
 int touch_frequency(void)
@@ -257,33 +276,35 @@
 void touch_compute_params(void)
 {
     if(0>touch_get_xy(&touch_x,&touch_y)) return;
-    touch_audio_freq = TOUCH_MIN_FREQUENCY 
+    if((touch_y>0x3F) && (touch_y!=0xFFF)) {
+        touch_audio_freq = (TOUCH_MIN_FREQUENCY 
         + (TOUCH_MAX_FREQUENCY - TOUCH_MIN_FREQUENCY)
-        * touch_y/0xFFF;
-    touch_audio_amplitude = TOUCH_MAX_AMPLITUDE*touch_x/0xFFF;
-//    debug_hexshort((short)touch_audio_freq);
-//    debug_putch(',');
-//    debug_hexshort((short)touch_audio_amplitude);
-//    debug_crlf();
+        * touch_y)>>12;
+    }
+    if((touch_x > 0x3F) && (touch_x != 0xFFF)) {
+        touch_audio_amplitude = (TOUCH_MAX_AMPLITUDE*touch_x)>>12;
+    }
 }
-
-bool touch_present(void)
+/*
+ * return 1 if touch present, 0 if touch absent, and -1
+ * if there was an i2c error
+ */
+int touch_present(void)
 {
-    i2c_init(&touch_ctrl,p28,p27); // sync i2c routines
-    i2c_frequency(&touch_ctrl,100000); // 100kHz clock
+// <<<<<   i2c_init(&touch_ctrl,p28,p27); // sync i2c routines
+// <<<<<    i2c_frequency(&touch_ctrl,100000); // 100kHz clock
 
     i2c_write(&touch_ctrl,TSC_ADDR,&tsc_ctrl,1,0);
     i2c_read(&touch_ctrl,TSC_ADDR,&touch_status,1,1);
 
-    if ((touch_status & TSC_EN_MASK)==0) {  // i2c error 
+    if ((touch_status & TSC_EN_MASK)==0) {  // i2c error
         led4=1;                             // disables screen
-        wait_ms(10);
-        touch_init();                       // re-init fixes
-        return false;
+        touch_reset();                       // re-init fixes
+        return -1;
     } else if ((touch_status & TSC_TOUCH_DET)>0) {
-        return true;
+        return 1;
     }
-    return false; 
+    return 0; 
 }
 
 int touch_get_xy(short *x,short *y)
@@ -313,10 +334,10 @@
     // 0xFFF or 0x000 is some kind of glitch
     if (*x==0xFFF && *y==0xFFF) return NIL;
     if (*x==0 && *y==0) return NIL;
-//    debug_hexshort(*x);
-//    debug_putch(',');
-//    debug_hexshort(*y);
-//    debug_crlf();
+    debug_hexshort(*x);
+    debug_putch(',');
+    debug_hexshort(*y);
+    debug_crlf();
     return 0; 
 }