touch screen handler for the microchip AR1020

Revision:
2:1a436d154c84
Parent:
1:264ad2a00fd9
Child:
3:b7eb3b3fe79f
diff -r 264ad2a00fd9 -r 1a436d154c84 ar1020.cpp
--- a/ar1020.cpp	Tue Feb 22 21:43:39 2011 +0000
+++ b/ar1020.cpp	Tue Feb 22 22:11:49 2011 +0000
@@ -24,8 +24,7 @@
 #include "ar1020.h"
 #include "wait_api.h"
 
-AR1020::AR1020(SPI *spi, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY)
-{
+AR1020::AR1020(SPI *spi, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY) {
     _spi=spi;
     _enable=new DigitalOut(enable);
     _enable->write(1);
@@ -39,8 +38,7 @@
     _power->write(0);
 }
 
-AR1020::AR1020(PinName mosi, PinName miso, PinName clk, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY)
-{
+AR1020::AR1020(PinName mosi, PinName miso, PinName clk, PinName enable, PinName sqi, PinName power, bool swapX, bool swapY, bool swapXY) {
     _mosi=new DigitalOut(mosi);
     _miso=new DigitalIn(miso);
     _clk=new DigitalOut(clk);
@@ -59,17 +57,15 @@
     _power->write(0);
 }
 
-AR1020::~AR1020()
-{
+AR1020::~AR1020() {
     delete _enable;
     delete _irq;
 }
 
-void AR1020::init()
-{
+void AR1020::init() {
     _power->write(1);
     wait_ms(100);
-    int r=cmd(0x13,NULL,0);    
+    int r=cmd(0x13,NULL,0);
     printf("disable touch=%i\n",r);
 
     int regStart=cmd(0x22,NULL,0);
@@ -83,192 +79,177 @@
     printf("set mode=1 => %i\n",r);
 
 
-    r=cmd(0x12,NULL,0);    
+    r=cmd(0x12,NULL,0);
     printf("enable touch=%i\n",r);
     _irq->rise(this, &AR1020::read);
 }
 
-int AR1020::x()
-{
+int AR1020::x() {
     return _x;
 }
 
-int AR1020::y()
-{
+int AR1020::y() {
     return _y;
 }
 
-int AR1020::pen()
-{
+int AR1020::pen() {
     return _pen;
 }
 
 
-void AR1020::read()
-{
-    _led->write(1);
-    _enable->write(0);
-    wait_us(60);
-    
-    int pen=readByte();
-    wait_us(60);
-    
-    int xlo=readByte();
-    wait_us(60);
-    
-    int xhi=readByte();
-    wait_us(60);
-    
-    int ylo=readByte();
-    wait_us(60);
-    
-    int yhi=readByte();
-    _enable->write(1);
+void AR1020::read() {
+    while (1==_sqi->read()) {
+        _led->write(1);
+        _enable->write(0);
+        wait_us(60);
+
+        int pen=readByte();
+        wait_us(60);
+
+        int xlo=readByte();
+        wait_us(60);
+
+        int xhi=readByte();
+        wait_us(60);
+
+        int ylo=readByte();
+        wait_us(60);
+
+        int yhi=readByte();
+        _enable->write(1);
 
 //        printf("0x%x|0x%x|0x%x|0x%x|0x%x\n", pen,xlo,xhi,ylo,yhi);
-    if (0x4d==pen || 0==pen || 255==pen)
-    {
-        // ignore invalid stuff, do nothing...
-    }
-    else if (0x81!=pen&0x81) // pen set?
-    {
-        _pen=0;
-        int x=xlo+(xhi<<7);
-        int y=ylo+(yhi<<7);
-        if (0!=x&&0!=y)
-        {
-            _x=x;
-            _y=y;
+        if (0x4d==pen || 0==pen || 255==pen) {
+            // ignore invalid stuff, do nothing...
+        } else if (0x81!=pen&0x81) { // pen set?
+            _pen=0;
+            int x=xlo+(xhi<<7);
+            int y=ylo+(yhi<<7);
+            if (0!=x&&0!=y) {
+                _x=x;
+                _y=y;
+            }
+        } else {
+            _pen=1;
+            int x=xlo+(xhi<<7);
+            int y=ylo+(yhi<<7);
+            if (0!=x&&0!=y) {
+                _x=x;
+                _y=y;
+            }
         }
+        _event.x=_x;
+        _event.y=_y;
+        _event.pen=_pen;
+        if (_pen==1 && _oldPen==false) { // pen down
+            _callbackPD.call((uint32_t)&_event);
+        } else if (_pen==1 && _oldPen==true) { // pen moved
+            _callbackPM.call((uint32_t)&_event);
+        } else if (_pen==0 && _oldPen==true) { // pen up
+            _callbackPU.call((uint32_t)&_event);
+        } else {
+            // happens on the first touch (the first report is send with pen=0).
+        }
+        _oldPen=(_pen==1);
+        _led->write(0);
+        if (1==_sqi->read())
+            wait_ms(5);
     }
-    else
-    {
-        _pen=1;
-        int x=xlo+(xhi<<7);
-        int y=ylo+(yhi<<7);
-        if (0!=x&&0!=y)
-        {
-            _x=x;
-            _y=y;
-        }
-    }
-    _event.x=_x;
-    _event.y=_y;
-    _event.pen=_pen;
-    if (_pen==1 && _oldPen==false)
-    { // pen down
-        _callbackPD.call((uint32_t)&_event);
-    }
-    else if (_pen==1 && _oldPen==true)
-    { // pen moved
-        _callbackPM.call((uint32_t)&_event);
-    }
-    else if (_pen==0 && _oldPen==true)
-    { // pen up
-        _callbackPU.call((uint32_t)&_event);
-    }
-    else
-    {
-        // happens on the first touch (the first report is send with pen=0).
-    }
-    _oldPen=(_pen==1);
-    _led->write(0);
 }
 
-int AR1020::cmd(char cmd,char* data, int len)
-{
-    _enable->write(1);
-    wait_us(1000);
-    _enable->write(0);
-    
+int AR1020::cmd(char cmd,char* data, int len, bool doEnable) {
+    if (doEnable) {
+        _enable->write(1);
+        wait_us(1000);
+        _enable->write(0);
+    }
+
     wait_us(10);
-    
+
     writeByte(0x55);
     wait_us(100);
-    
+
     writeByte(len+1);
     wait_us(100);
-    
+
     writeByte(cmd);
     wait_us(100);
-    
-    for (int i=0;i<len;i++)
-    {
+
+    for (int i=0;i<len;i++) {
         writeByte(data[i]);
         wait_us(100);
     }
     Timer t;
     t.start();
-    while (true)
-    {
-      wait_us(100);
-      if (1==_sqi->read())
-        break;
-      if (t.read_ms()>1)
-        break;
+    while (true) {
+        wait_us(100);
+        if (1==_sqi->read())
+            break;
+        if (t.read_ms()>1)
+            break;
     }
     char rhead=readByte();
     wait_us(100);
-    if (rhead!=0x55)
-    {
-        _enable->write(1);
+    if (rhead!=0x55) {
+        if (doEnable)
+            _enable->write(1);
         printf("rh=0x%x\n",rhead);
         return -1000;
     }
     char rlen=readByte();
     wait_us(100);
-    if (rlen==2)
-    {
+    if (rlen==2) {
         char r=readByte();
         wait_us(100);
         char rc=readByte();
         wait_us(100);
-        _enable->write(1);
+        if (doEnable)
+            _enable->write(1);
         if (rc!=cmd)
             return -2000;
         return -r;
-    }
-    else if (rlen==3)
-    {
+    } else if (rlen==3) {
         char r=readByte();
         wait_us(100);
         char rc=readByte();
         wait_us(100);
-        if (rc!=cmd)
-        {
-            _enable->write(1);
+        if (rc!=cmd) {
+            if (doEnable)
+                _enable->write(1);
             return -3000;
         }
         char rd=readByte();
         wait_us(100);
-        _enable->write(1);
+        if (doEnable)
+            _enable->write(1);
         if (r==0)
             return rd;
         return -r;
-    }
-    else
-    {
-        _enable->write(1);
+    } else {
+        if (doEnable)
+            _enable->write(1);
         return -4000;
     }
 }
-void AR1020::calibrate()
-{
+void AR1020::calibrate() {
     _irq->rise(NULL);
 
     DigitalOut led1(LED1);
     DigitalOut led2(LED2);
     DigitalOut led3(LED3);
     DigitalOut led4(LED4);
-    led1=0;led2=0;led3=1;led4=1;
-    
-    int r=cmd(0x13,NULL,0);    
+    led1=0;
+    led2=0;
+    led3=1;
+    led4=1;
+
+    int r=cmd(0x13,NULL,0);
     printf("disable touch=%i\n",r);
     wait_ms(100);
     if (r<0)
         return;
     led4=0;
-    
+
     int regStart=cmd(0x22,NULL,0);
     printf("reg offset=%i\n",regStart);
 
@@ -279,7 +260,7 @@
     if (regStart<0)
         return;
     printf("start calibrate\n");
-    led3=0;    
+    led3=0;
     char cid2[4]={0x00,0x0e+regStart,0x01,0x19};
     r=cmd(0x21,cid2,4);
     printf("set inset=%i\n",r);
@@ -287,17 +268,13 @@
         return;
 
     _enable->write(1);
+    wait_us(100);
     _enable->write(0);
     wait_us(10);
-    writeByte(0x55);
-    wait_us(100);
-    writeByte(0x02);
-    wait_us(100);
-    writeByte(0x14);
-    wait_us(100);
-    writeByte(0x04);
-    
-    wait_ms(10);
+    char cid3[1]={0x04};
+    cmd(0x14,cid3,1,false);
+
+    wait_ms(1);
 
     int resp=readCalibResponse();
     printf("status=%i\n",resp);
@@ -317,62 +294,57 @@
     led4=1;
     resp=readCalibResponse();
     printf("status=%i\n",resp);
-    
-     _enable->write(1);
-   
-    r=cmd(0x12,NULL,0);    
+
+    _enable->write(1);
+
+    r=cmd(0x23,NULL,0);
+    printf("save registers=%i\n",r);
+
+    r=cmd(0x12,NULL,0);
     printf("enable touch=%i\n",r);
-   
+
     _irq->rise(this, &AR1020::read);
-    
+
 }
 
-int AR1020::readCalibResponse()
-{
-    while (true)
-    {
+int AR1020::readCalibResponse() {
+    while (true) {
         int r=readByte();
-        if (r!=0x55)
-        {
-            printf("1=0x%x\n",r);
+        if (r!=0x55) {
+//            printf("1=0x%x\n",r);
             wait_ms(100);
             continue;
         }
 
         r=readByte();
         wait_us(100);
-        if (r!=0x02)
-        {
+        if (r!=0x02) {
             printf("2=0x%x\n",r);
             continue;
         }
-            
+
         r=readByte();
         wait_us(100);
-        if (r!=0x00)
-        {
+        if (r!=0x00) {
             printf("3=0x%x\n",r);
             continue;
         }
         int rc=readByte();
         wait_us(100);
-        if (rc!=0x14)
-        {
+        if (rc!=0x14) {
             printf("4=0x%x\n",r);
             continue;
         }
-        
+
         return r;
     }
 }
 
-int AR1020::readByte()
-{
+int AR1020::readByte() {
     _clk->write(0);
     wait_us(10);
     int r=0;
-    for (int i=0;i<8;i++)
-    {
+    for (int i=0;i<8;i++) {
         r=r<<1;
         _clk->write(1);
         wait_us(10);
@@ -385,13 +357,11 @@
     return r;
 }
 
-void AR1020::writeByte(char byte)
-{
+void AR1020::writeByte(char byte) {
     _clk->write(0);
     wait_us(10);
 //    printf("->0x%x\n",byte);
-    for (int i=0;i<8;i++)
-    {
+    for (int i=0;i<8;i++) {
         int bit=byte>127;
 //        printf("%i",bit);
         _clk->write(1);