Sooner Competitive Robotics / Mbed 2 deprecated IEEE_14_Freescale

Dependencies:   mbed

Fork of IEEE_14_Freescale by IEEE 2014 Mbed

Revision:
1:c28fac16a109
Child:
7:3b2cf7efe5d1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remoteEnc.cpp	Sun Nov 17 03:05:35 2013 +0000
@@ -0,0 +1,159 @@
+#include "remoteEnc.h"
+#include "dbgprint.h"
+
+
+/*private:
+    SPI &spi;
+    DigitalIn cs;
+    int referenceCounts[4];
+    int latestCount[4];
+    int outState;
+public:
+    remoteEnc(SPI &spiIn, PinName cspin);
+    const int* getVals();
+    int setPins(int mask);
+    int setPin(int pin, int state);
+    int getPinState();
+    int reset(int slot);
+    int getLastVal(int slot);*/
+    
+remoteEnc::remoteEnc(SPI &spiIn, PinName cspin) : spi(spiIn), cs(cspin){
+    cs=1;
+    spi.format(8,0);
+    spi.frequency(100000);
+    direction[0]=direction[1]=direction[2]=direction[3]=1;
+    int i;
+    for(i=0;i<4;i++){
+        referenceCounts[i]=0;
+        latestQuadrant[i]=0;
+    }
+    getVals();
+    for(i=0;i<4;i++){
+        latestQuadrant[i]=latestActual[i]&(~0x3FFF);
+        DBGPRINT("{%x,%x}",latestQuadrant[i],latestActual[i]);
+    }
+    getVals();
+    for(i=0;i<4;i++){
+        referenceCounts[i]=latestCount[i];
+        DBGPRINT("-]%x,%x[-",latestQuadrant[i],latestActual[i]);
+    }
+    //DBGPRINT("reset to %d, %d, %d, %d\r\n",referenceCounts[0],referenceCounts[1],referenceCounts[2],referenceCounts[3]);
+    
+    //setPins(0);
+    outState=0;
+}
+
+const int* remoteEnc::getVals(){
+    int charBuf[8];
+    cs=0;
+    spi.write(0);
+    spi.write(1);
+    int i;
+    for(i=2;i<=9;i++)
+        charBuf[i-2]=spi.write(i);
+    cs=1;
+    for(i=0;i<4;i++){
+        latestActual[i]=(charBuf[2*i]+(charBuf[2*i+1]<<8))*direction[i];
+        //DBGPRINT("[%d, %d]",i,latestActual[i]);
+        if((latestActual[i]&0xC000)!=(latestQuadrant[i]&0xC000)){
+            DBGPRINT("*%x and %x to ",latestActual[i],latestQuadrant[i]);
+            if((latestActual[i]&0xC000)==((latestQuadrant[i]+0x4000)&0xC000)){
+                latestQuadrant[i]+=0x4000;
+            } else if ((latestActual[i]&0xC000)==((latestQuadrant[i]-0x4000)&0xC000)){
+                latestQuadrant[i]-=0x4000;
+            }
+            DBGPRINT("%x and %x\r\n",latestActual[i],latestQuadrant[i]);
+        }
+        //latestCount[i]=charBuf[2*i]+(charBuf[2*i+1]<<8)-referenceCounts[i];
+        latestCount[i]=latestQuadrant[i]+(latestActual[i]&0x3FFF)-referenceCounts[i];
+    }
+    return latestCount;
+}
+
+int remoteEnc::getLastVal(int slot){
+    return latestCount[slot];
+}
+
+int remoteEnc::getSingleValue(int slot){
+    cs=0;
+    spi.write(slot*2);
+    spi.write(slot*2+1);
+    int lowbit=spi.write(0);
+    int highbit=spi.write(0);
+    cs=1;
+    latestActual[slot]=(lowbit+(highbit<<8))*direction[slot];
+    //DBGPRINT("[%d, %d]",slot,latestActual[slot]);
+    if((latestActual[slot]&0xC000)!=(latestQuadrant[slot]&0xC000)){
+        DBGPRINT("*%x and %x to ",latestActual[slot],latestQuadrant[slot]);
+        if((latestActual[slot]&0xC000)==((latestQuadrant[slot]+0x4000)&0xC000)){
+            latestQuadrant[slot]+=0x4000;
+        } else if ((latestActual[slot]&0xC000)==((latestQuadrant[slot]-0x4000)&0xC000)){
+            latestQuadrant[slot]-=0x4000;
+        }
+        DBGPRINT("%x and %x\r\n",latestActual[slot],latestQuadrant[slot]);
+    }
+    //latestCount[slot]=charBuf[2*slot]+(charBuf[2*slot+1]<<8)-referenceCounts[slot];
+    latestCount[slot]=latestQuadrant[slot]+(latestActual[slot]&0x3FFF)-referenceCounts[slot];
+    return latestCount[slot];
+}
+
+int remoteEnc::setDirections(int dir1, int dir2, int dir3, int dir4){
+    direction[0]= (dir1 == -1)? -1: 1;
+    direction[1]= (dir2 == -1)? -1: 1;
+    direction[2]= (dir3 == -1)? -1: 1;
+    direction[3]= (dir4 == -1)? -1: 1;
+    int i;
+    for(i=0;i<4;i++){
+        referenceCounts[i]=0;
+        latestQuadrant[i]=0;
+    }
+    getVals();
+    for(i=0;i<4;i++){
+        latestQuadrant[i]=latestActual[i]&(~0x3FFF);
+        //DBGPRINT("{%x,%x}",latestQuadrant[i],latestActual[i]);
+    }
+    getVals();
+    for(i=0;i<4;i++){
+        referenceCounts[i]=latestCount[i];
+        //DBGPRINT("{{%x,%x}}",latestQuadrant[i],latestActual[i]);
+    }
+    return 1;
+}
+
+int remoteEnc::reset(int slot){
+    referenceCounts[slot] += getSingleValue(slot);
+    return 1;
+}
+
+int remoteEnc::resetAll(){
+    const int *buf = getVals();
+    int i;
+    for(i=0;i<4;i++)
+        referenceCounts[i] += buf[i];
+    return 1;
+}
+
+
+int remoteEnc::setPins(int mask){
+    cs=0;
+    spi.write((mask&0x3F)|0x80);
+    spi.write(0x01);
+    //DBGPRINT("%X,%X: %d\r\n",mask,(mask&0x3F)|0x80, spi.write(0x01));
+    //DBGPRINT("%X,%X: %d\r\n",mask,(mask&0x3F)|0x80, spi.write(0x01));
+    //DBGPRINT("%X,%X: %d\r\n",mask,(mask&0x3F)|0x80, spi.write(0x01));
+    cs=1;
+    outState=mask;
+    return 1;
+}
+
+
+int remoteEnc::setPin(int pin, int state){
+    if(state==0){
+        outState &=~ (1<<pin);
+    } else {
+        outState |= (1<<pin);
+    }
+    setPins(outState);
+    return 1;
+}
+    
\ No newline at end of file