Shih-Ho Hsieh / Mbed 2 deprecated Motor_XYZ_UI_SPI_8mag

Dependencies:   XYZ_sensor_Platform_SPI mbed

Branch:
envelope
Revision:
12:2e1b1b1726fa
Parent:
11:bb86ffb378f4
Child:
13:6850d2b41b2c
--- a/ui.cpp	Fri Jan 05 08:06:13 2018 +0000
+++ b/ui.cpp	Fri Mar 02 06:40:25 2018 +0000
@@ -13,6 +13,7 @@
 Serial pc(SERIAL_TX, SERIAL_RX, BAUD );
 DigitalOut led(LED2),led3(LED3);
 DigitalOut mag_test(D11);
+InterruptIn button(USER_BUTTON);
 XYZSensorPlatform platform;
 Envelope *command;
 EnvelopeTracker tracker;
@@ -32,6 +33,18 @@
 bool commandToDo = false;
 int recordTime;
 float waitTime;
+bool isEcho = false;
+bool isReset = true;
+enum PatternRecordState{NONE,INIT,MAGNET,TO};
+struct Pattern
+{
+    float xStart, xEnd, xStep, yStart, yEnd, yStep, zStart, zEnd, zStep;
+    int num;
+    float x, y, z;
+    int count;
+    PatternRecordState state;
+} pattern;
+
 
 const int Fs = 1000; // sampling rate -- max: 1kHz
 
@@ -39,6 +52,11 @@
 void echo(char typ, float x, float y, float z);
 void echo(char typ, int16_t *p_data);
 void Rx_interrupt();
+void released()
+{
+    led = !led;
+    pc.attach(&Rx_interrupt, Serial::RxIrq);
+}
 
 int main()
 {
@@ -49,13 +67,61 @@
     command->enableCheckXOR(9);
     tracker.setEnvelope(*command);
     tracker.setBufferLength(100);
+    pattern.state = NONE;
     pc.format(8,SerialBase::None,1);
+    button.rise(&released);
     platform.set_speed(2.5);
-    platform.reset();       // need to be modified here
+//    platform.reset();       // need to be modified here
     platform.setSensorI2cFrequency(I2C_FREQUENCY);
 // Setup a serial interrupt function to receive data
     pc.attach(&Rx_interrupt, Serial::RxIrq);
+    echo('B',0,0,0);
     while(1) {
+        if(isReset){
+            platform.set_speed(1);
+            platform.reset();
+            isReset = false;
+            platform.set_speed(2.5);
+        }
+        if(pattern.state != NONE)
+        {
+            if(pattern.state == INIT) platform.to(pattern.xStart,pattern.yStart,pattern.zStart);
+            if(pattern.count == 0) pattern.state = TO;
+            if(pattern.state == TO) 
+            {
+                if(abs(pattern.x-pattern.xEnd)>abs(pattern.xStep)) pattern.x += pattern.xStep;
+                else if(abs(pattern.y-pattern.yEnd)>abs(pattern.yStep)){
+                    pattern.x = pattern.xStart;
+                    pattern.y += pattern.yStep;
+                }
+                else if(abs(pattern.z-pattern.zEnd)>abs(pattern.zStep)){
+                    pattern.x = pattern.xStart;
+                    pattern.y = pattern.yStart;
+                    pattern.z += pattern.zStep;
+                }
+                else{
+                    pattern.state = NONE;
+                    continue;
+                }
+                platform.to(pattern.x,pattern.y,pattern.z);
+//                wait(0.);
+                isEcho = true;
+                pattern.count = pattern.num;
+                pattern.state = MAGNET;
+            }
+            if(pattern.state == MAGNET)
+            {
+                if(pattern.count-- <= 0) pattern.state = TO;
+                getMag++;
+            }
+        }
+        if(isEcho)
+        {
+            platform.position(pos);
+            echo('O',pos[0],pos[1],pos[2]);
+            led3 = !led3;
+            isEcho = false;
+        }
         if(isRecording && n < recordTime) {
             int16_t mag[3];
             if(platform.get_mag_raw(mag)==0&&pc.writeable()) {
@@ -138,14 +204,59 @@
         if(result!=NULL) {
             char *dataArray = result->getPayload();
             switch(dataArray[0]) {
-                case 'I':
+                case 'I': // pattern record
+                    if(dataArray[1] == 'X')
+                    {
+                        pattern.xStart = (float)((dataArray[2]<<8)+dataArray[3])/10.0f;
+                        pattern.xEnd = (float)((dataArray[4]<<8)+dataArray[5])/10.0f;
+                        pattern.xStep = (float) dataArray[6]/10.0f;
+                        if((pattern.xStart-pattern.xEnd)*pattern.xStep>0) pattern.xStep = -pattern.xStep;
+                    }
+                    else if(dataArray[1] == 'Y')
+                    {
+                        pattern.yStart = (float)((dataArray[2]<<8)+dataArray[3])/10.0f;
+                        pattern.yEnd = (float)((dataArray[4]<<8)+dataArray[5])/10.0f;
+                        pattern.yStep = (float) dataArray[6]/10.0f;
+                        if((pattern.yStart-pattern.yEnd)*pattern.yStep>0) pattern.yStep = -pattern.yStep;
+                    }
+                    else if(dataArray[1] == 'Z')
+                    {
+                        pattern.zStart = (float)((dataArray[2]<<8)+dataArray[3])/10.0f;
+                        pattern.zEnd = (float)((dataArray[4]<<8)+dataArray[5])/10.0f;
+                        pattern.zStep = (float) dataArray[6]/10.0f;
+                        if((pattern.zStart-pattern.zEnd)*pattern.zStep>0) pattern.zStep = -pattern.zStep;
+                    }
+                    else if(dataArray[1] == 'N')
+                    {
+                        pattern.num = (int)dataArray[2];
+                    }
+                    else if(dataArray[1] == 'M')
+                    {
+                        if(dataArray[2] == 'B'){
+                            pattern.x = (float)((dataArray[3]<<8)+dataArray[4])/10.0f;
+                            pattern.y = (float)((dataArray[5]<<8)+dataArray[6])/10.0f;
+                        }
+                        if(dataArray[2] == 'U'){
+                            pattern.z = (float)((dataArray[3]<<8)+dataArray[4])/10.0f;
+                            pattern.state = TO;
+                            printf("%.2f %.2f %.2f\n %.2f %.2f %.2f\n %.2f %.2f %.2f\n %.2f %.2f %.2f\n %d\n",
+                            pattern.xStart, pattern.xEnd, pattern.xStep, pattern.yStart, pattern.yEnd, pattern.yStep, pattern.zStart, pattern.zEnd, pattern.zStep, pattern.x, pattern.y, pattern.z, pattern.num);
+                        }
+                    }
+                        
+                    else if(dataArray[1] == 'B')
+                    {
+                        pattern.state = INIT;
+                        pattern.count = pattern.num;
+                    }
+                    else if(dataArray[1] == 'S') pattern.state = NONE;
+                        
                     break;
                 case 'O': // echo
-                    platform.position(pos);
-                    echo('O',pos[0],pos[1],pos[2]);
-                    led3 = !led3;
+                    isEcho = true;
                     break;
                 case 'C': // command
+                    if(commandToDo) break;
                     x=(float)((dataArray[1]<<8)+dataArray[2])/10.0f;
                     y=(float)((dataArray[3]<<8)+dataArray[4])/10.0f;
                     z=(float)((dataArray[5]<<8)+dataArray[6])/10.0f;
@@ -178,10 +289,18 @@
                 case 'S': // stop
                     isRecording = false;
                     break;
+                case 'P': // set position
+                    x=(float)((dataArray[1]<<8)+dataArray[2])/10.0f;
+                    y=(float)((dataArray[3]<<8)+dataArray[4])/10.0f;
+                    z=(float)((dataArray[5]<<8)+dataArray[6])/10.0f;
+                    platform.setPosition(x,y,z);
+                    break;
+                case 'N': // new set up
+                    isReset = true;
+                    break;
                 default:
                     break;
             } // end switch
-//            delete dataArray;
             result = NULL;
             dataArray = NULL;
         } // end result if