Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: XYZ_sensor_Platform_SPI mbed
Diff: ui.cpp
- 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