Example test suite for my ADIS16467 driver.

Dependencies:   ADIS16467

ADIS16467 Driver Example Tests

These examples show how to use some of the functionality in my ADIS16467 driver. To get started with MBed CLI:

Build Instructions

$ hg clone https://yhnrita@os.mbed.com/users/yhnrita/code/ADIS16467-Tests/
$ cd ADIS16467-Tests
$ mbed deploy
$ mbed compile
Committer:
Rita Yang
Date:
Fri Feb 21 18:27:48 2020 -0800
Revision:
3:488b7ef208be
Parent:
2:ca014ee9f00a
Adding library dependencies.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rita Yang 2:ca014ee9f00a 1 /*
Rita Yang 2:ca014ee9f00a 2 USC RPL ADIS16467 Test Suite
Rita Yang 2:ca014ee9f00a 3 Contributors: Rita Yang
Rita Yang 2:ca014ee9f00a 4 */
Rita Yang 2:ca014ee9f00a 5
Rita Yang 2:ca014ee9f00a 6 #include "ADIS16467TestSuite.h"
Rita Yang 2:ca014ee9f00a 7
Rita Yang 2:ca014ee9f00a 8 #include <cinttypes>
Rita Yang 2:ca014ee9f00a 9
Rita Yang 2:ca014ee9f00a 10 // These pin assignments are arbitrary, you will need to change them accordingly
Rita Yang 2:ca014ee9f00a 11 #define PIN_SPI_MOSI p20
Rita Yang 2:ca014ee9f00a 12 #define PIN_SPI_MISO p21
Rita Yang 2:ca014ee9f00a 13 #define PIN_SPI_SCK p22
Rita Yang 2:ca014ee9f00a 14 #define PIN_ADIS_CS p23
Rita Yang 2:ca014ee9f00a 15 #define PIN_ADIS_RST p24
Rita Yang 2:ca014ee9f00a 16
Rita Yang 2:ca014ee9f00a 17 Serial pc(USBTX, USBRX);
Rita Yang 2:ca014ee9f00a 18
Rita Yang 2:ca014ee9f00a 19 const char* statusToString(bool status)
Rita Yang 2:ca014ee9f00a 20 {
Rita Yang 2:ca014ee9f00a 21 if(status)
Rita Yang 2:ca014ee9f00a 22 {
Rita Yang 2:ca014ee9f00a 23 return "Yes";
Rita Yang 2:ca014ee9f00a 24 }
Rita Yang 2:ca014ee9f00a 25 else
Rita Yang 2:ca014ee9f00a 26 {
Rita Yang 2:ca014ee9f00a 27 return "No";
Rita Yang 2:ca014ee9f00a 28 }
Rita Yang 2:ca014ee9f00a 29 }
Rita Yang 2:ca014ee9f00a 30
Rita Yang 2:ca014ee9f00a 31 void ADIS16467TestSuite::test_readData() {
Rita Yang 2:ca014ee9f00a 32 while(1) {
Rita Yang 2:ca014ee9f00a 33 wait_ms(600);
Rita Yang 2:ca014ee9f00a 34
Rita Yang 2:ca014ee9f00a 35 float gyroX = (float)(imu->readGyroX()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 36 float gyroY = (float)(imu->readGyroY()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 37 float gyroZ = (float)(imu->readGyroZ()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 38 float accelX = (float)(imu->readAccelX()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 39 float accelY = (float)(imu->readAccelY()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 40 float accelZ = (float)(imu->readAccelZ()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 41 float intTemp = (float)(imu->readInternalTemp()) * imu->TEMP_CONV;
Rita Yang 2:ca014ee9f00a 42 uint16_t dataCount = imu->readDataCounter();
Rita Yang 2:ca014ee9f00a 43
Rita Yang 2:ca014ee9f00a 44 pc.printf("Gyro X : %.2f degree/sec\r\n", gyroX);
Rita Yang 2:ca014ee9f00a 45 pc.printf("Gyro Y : %.2f degree/sec\r\n", gyroY);
Rita Yang 2:ca014ee9f00a 46 pc.printf("Gyro Z : %.2f degree/sec\r\n", gyroZ);
Rita Yang 2:ca014ee9f00a 47 pc.printf("Accel X : %.2f mg\r\n", accelX);
Rita Yang 2:ca014ee9f00a 48 pc.printf("Accel Y : %.2f mg\r\n", accelY);
Rita Yang 2:ca014ee9f00a 49 pc.printf("Accel Z : %.2f mg\r\n", accelZ);
Rita Yang 2:ca014ee9f00a 50 pc.printf("Internal Temperature : %.2f C\r\n", intTemp);
Rita Yang 2:ca014ee9f00a 51 pc.printf("Data Counter : %5d\r\n", dataCount);
Rita Yang 2:ca014ee9f00a 52 pc.printf("\r\n");
Rita Yang 2:ca014ee9f00a 53 }
Rita Yang 2:ca014ee9f00a 54 }
Rita Yang 2:ca014ee9f00a 55
Rita Yang 2:ca014ee9f00a 56 void ADIS16467TestSuite::test_printFlags() {
Rita Yang 2:ca014ee9f00a 57 pc.printf("-----Error Flags-----\r\n");
Rita Yang 2:ca014ee9f00a 58 pc.printf("Clock Error : %s\r\n", statusToString(imu->getClockError()));
Rita Yang 2:ca014ee9f00a 59 pc.printf("Memory Failure : %s\r\n", statusToString(imu->getMemFailure()));
Rita Yang 2:ca014ee9f00a 60 pc.printf("Sensor Failure : %s\r\n", statusToString(imu->getSensorFailure()));
Rita Yang 2:ca014ee9f00a 61 pc.printf("Standby Mode : %s\r\n", statusToString(imu->getStandbyMode()));
Rita Yang 2:ca014ee9f00a 62 pc.printf("SPI Communication Error : %s\r\n", statusToString(imu->getSPIError()));
Rita Yang 2:ca014ee9f00a 63 pc.printf("Flash Memory Update Failure : %s\r\n", statusToString(imu->getFlashUpFail()));
Rita Yang 2:ca014ee9f00a 64 pc.printf("Datapath Overrun : %s\r\n", statusToString(imu->getDatapathOverrun()));
Rita Yang 2:ca014ee9f00a 65 }
Rita Yang 2:ca014ee9f00a 66
Rita Yang 2:ca014ee9f00a 67 void ADIS16467TestSuite::test_burstRead() {
Rita Yang 2:ca014ee9f00a 68 struct ADIS16467::BurstReadResult result;
Rita Yang 2:ca014ee9f00a 69 imu->burstRead(result);
Rita Yang 2:ca014ee9f00a 70
Rita Yang 2:ca014ee9f00a 71 pc.printf("Gyro X : %.2f degree/sec\r\n", ((float)result.gyroX * imu->GYRO_CONV));
Rita Yang 2:ca014ee9f00a 72 pc.printf("Gyro Y : %.2f degree/sec\r\n", ((float)result.gyroY * imu->GYRO_CONV));
Rita Yang 2:ca014ee9f00a 73 pc.printf("Gyro Z : %.2f degree/sec\r\n", ((float)result.gyroZ * imu->GYRO_CONV));
Rita Yang 2:ca014ee9f00a 74 pc.printf("Accel X : %.2f mg\r\n", ((float)result.accelX * imu->ACCEL_CONV));
Rita Yang 2:ca014ee9f00a 75 pc.printf("Accel Y : %.2f mg\r\n", ((float)result.accelY * imu->ACCEL_CONV));
Rita Yang 2:ca014ee9f00a 76 pc.printf("Accel Z : %.2f mg\r\n", ((float)result.accelZ * imu->ACCEL_CONV));
Rita Yang 2:ca014ee9f00a 77 pc.printf("Internal Temperature : %.2f C\r\n", ((float)result.internalTemp * imu->TEMP_CONV));
Rita Yang 2:ca014ee9f00a 78 pc.printf("Data Counter : %5d\r\n", result.dataCounter);
Rita Yang 2:ca014ee9f00a 79 pc.printf("Checksum Value : %5d\r\n", result.checkSum);
Rita Yang 2:ca014ee9f00a 80
Rita Yang 2:ca014ee9f00a 81 imu->setErrorFlags(result.statusDiag);
Rita Yang 2:ca014ee9f00a 82 test_printFlags();
Rita Yang 2:ca014ee9f00a 83 imu->resetAllFlags();
Rita Yang 2:ca014ee9f00a 84 }
Rita Yang 2:ca014ee9f00a 85
Rita Yang 2:ca014ee9f00a 86 void ADIS16467TestSuite::test_readFlags() {
Rita Yang 2:ca014ee9f00a 87 imu->setErrorFlags(imu->readStatDiag());
Rita Yang 2:ca014ee9f00a 88 test_printFlags();
Rita Yang 2:ca014ee9f00a 89 imu->resetAllFlags();
Rita Yang 2:ca014ee9f00a 90 }
Rita Yang 2:ca014ee9f00a 91
Rita Yang 2:ca014ee9f00a 92 void ADIS16467TestSuite::test_sensorSelfTest() {
Rita Yang 2:ca014ee9f00a 93 imu->sensorSelfTest();
Rita Yang 2:ca014ee9f00a 94 test_printFlags();
Rita Yang 2:ca014ee9f00a 95 imu->resetAllFlags();
Rita Yang 2:ca014ee9f00a 96 }
Rita Yang 2:ca014ee9f00a 97
Rita Yang 2:ca014ee9f00a 98 void ADIS16467TestSuite::test_setPoll(uint16_t pollRate)
Rita Yang 2:ca014ee9f00a 99 {
Rita Yang 2:ca014ee9f00a 100 const float print_time = 1.0f;
Rita Yang 2:ca014ee9f00a 101
Rita Yang 2:ca014ee9f00a 102 imu->setPollRate(pollRate);
Rita Yang 2:ca014ee9f00a 103 imu->resetDeltaAngle();
Rita Yang 2:ca014ee9f00a 104
Rita Yang 2:ca014ee9f00a 105 Timer printTimer;
Rita Yang 2:ca014ee9f00a 106 printTimer.start();
Rita Yang 2:ca014ee9f00a 107
Rita Yang 2:ca014ee9f00a 108 while(1)
Rita Yang 2:ca014ee9f00a 109 {
Rita Yang 2:ca014ee9f00a 110
Rita Yang 2:ca014ee9f00a 111 wait(1/ static_cast<float>(pollRate * 2));
Rita Yang 2:ca014ee9f00a 112
Rita Yang 2:ca014ee9f00a 113 imu->updateDeltaAngles();
Rita Yang 2:ca014ee9f00a 114
Rita Yang 2:ca014ee9f00a 115 if(printTimer.read() > print_time)
Rita Yang 2:ca014ee9f00a 116 {
Rita Yang 2:ca014ee9f00a 117 printTimer.reset();
Rita Yang 2:ca014ee9f00a 118
Rita Yang 2:ca014ee9f00a 119 float gyroX = (float)(imu->readGyroX()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 120 float gyroY = (float)(imu->readGyroY()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 121 float gyroZ = (float)(imu->readGyroZ()) * imu->GYRO_CONV;
Rita Yang 2:ca014ee9f00a 122 float accelX = (float)(imu->readAccelX()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 123 float accelY = (float)(imu->readAccelY()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 124 float accelZ = (float)(imu->readAccelZ()) * imu->ACCEL_CONV;
Rita Yang 2:ca014ee9f00a 125 float intTemp = (float)(imu->readInternalTemp()) * imu->TEMP_CONV;
Rita Yang 2:ca014ee9f00a 126 float timeStamp = (float)(imu->readTimeStamp()) * imu->TIME_CONV;
Rita Yang 2:ca014ee9f00a 127 uint16_t dataCount = imu->readDataCounter();
Rita Yang 2:ca014ee9f00a 128 float deltaAngXSum = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 129 float deltaAngYSum = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 130 float deltaAngZSum = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 131
Rita Yang 2:ca014ee9f00a 132 pc.printf("Gyro X : %.2f degree/sec\r\n", gyroX);
Rita Yang 2:ca014ee9f00a 133 pc.printf("Gyro Y : %.2f degree/sec\r\n", gyroY);
Rita Yang 2:ca014ee9f00a 134 pc.printf("Gyro Z : %.2f degree/sec\r\n", gyroZ);
Rita Yang 2:ca014ee9f00a 135 pc.printf("Accel X : %.2f mg\r\n", accelX);
Rita Yang 2:ca014ee9f00a 136 pc.printf("Accel Y : %.2f mg\r\n", accelY);
Rita Yang 2:ca014ee9f00a 137 pc.printf("Accel Z : %.2f mg\r\n", accelZ);
Rita Yang 2:ca014ee9f00a 138 pc.printf("Delta Angle X Sum: %.2f degree\r\n", deltaAngXSum);
Rita Yang 2:ca014ee9f00a 139 pc.printf("Delta Angle Y Sum: %.2f degree\r\n", deltaAngYSum);
Rita Yang 2:ca014ee9f00a 140 pc.printf("Delta Angle Z Sum: %.2f degree\r\n", deltaAngZSum);
Rita Yang 2:ca014ee9f00a 141 pc.printf("Internal Temperature : %.2f C\r\n", intTemp);
Rita Yang 2:ca014ee9f00a 142 pc.printf("Time Stamp : %.2f us\r\n", timeStamp);
Rita Yang 2:ca014ee9f00a 143 pc.printf("Data Counter : %5d\r\n", dataCount);
Rita Yang 2:ca014ee9f00a 144 pc.printf("\r\n");
Rita Yang 2:ca014ee9f00a 145 }
Rita Yang 2:ca014ee9f00a 146
Rita Yang 2:ca014ee9f00a 147 }
Rita Yang 2:ca014ee9f00a 148 }
Rita Yang 2:ca014ee9f00a 149
Rita Yang 2:ca014ee9f00a 150 void ADIS16467TestSuite::test_calibrateBias()
Rita Yang 2:ca014ee9f00a 151 {
Rita Yang 2:ca014ee9f00a 152 const uint16_t pollRate = 10; // Hz
Rita Yang 2:ca014ee9f00a 153 const float testDuration = 60; // s
Rita Yang 2:ca014ee9f00a 154
Rita Yang 2:ca014ee9f00a 155 imu->setPollRate(pollRate);
Rita Yang 2:ca014ee9f00a 156 imu->resetDeltaAngle();
Rita Yang 2:ca014ee9f00a 157
Rita Yang 2:ca014ee9f00a 158 pc.printf("Place the IMU on a flat surface and keep it still. Orientation is not important.\r\n");
Rita Yang 2:ca014ee9f00a 159
Rita Yang 2:ca014ee9f00a 160 wait(5);
Rita Yang 2:ca014ee9f00a 161
Rita Yang 2:ca014ee9f00a 162
Rita Yang 2:ca014ee9f00a 163 Timer testTimer;
Rita Yang 2:ca014ee9f00a 164 testTimer.start();
Rita Yang 2:ca014ee9f00a 165
Rita Yang 2:ca014ee9f00a 166 while(testTimer.read() < testDuration)
Rita Yang 2:ca014ee9f00a 167 {
Rita Yang 2:ca014ee9f00a 168
Rita Yang 2:ca014ee9f00a 169 wait(1/ static_cast<float>(pollRate * 2));
Rita Yang 2:ca014ee9f00a 170 imu->updateDeltaAngles();
Rita Yang 2:ca014ee9f00a 171
Rita Yang 2:ca014ee9f00a 172 float deltaAngXSum = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 173 float deltaAngYSum = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 174 float deltaAngZSum = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV;
Rita Yang 2:ca014ee9f00a 175
Rita Yang 2:ca014ee9f00a 176 pc.printf("X Drift: %.2f degree\r\n", deltaAngXSum);
Rita Yang 2:ca014ee9f00a 177 pc.printf("Y Drift: %.2f degree\r\n", deltaAngYSum);
Rita Yang 2:ca014ee9f00a 178 pc.printf("Z Drift: %.2f degree\r\n", deltaAngZSum);
Rita Yang 2:ca014ee9f00a 179 }
Rita Yang 2:ca014ee9f00a 180
Rita Yang 2:ca014ee9f00a 181 float timeElapsed = testTimer.read();
Rita Yang 2:ca014ee9f00a 182
Rita Yang 2:ca014ee9f00a 183 float driftRateX = (float)(imu->getDeltaAngleXSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 2:ca014ee9f00a 184 float driftRateY = (float)(imu->getDeltaAngleYSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 2:ca014ee9f00a 185 float driftRateZ = (float)(imu->getDeltaAngleZSum()) * imu->DELTA_ANGLE_CONV / timeElapsed;
Rita Yang 2:ca014ee9f00a 186
Rita Yang 2:ca014ee9f00a 187 pc.printf("To zero X gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateX);
Rita Yang 2:ca014ee9f00a 188 pc.printf("To zero Y gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateY);
Rita Yang 2:ca014ee9f00a 189 pc.printf("To zero Z gyro, set bias to: %f degrees/sec\r\n", -1 * driftRateZ);
Rita Yang 2:ca014ee9f00a 190
Rita Yang 2:ca014ee9f00a 191 }
Rita Yang 2:ca014ee9f00a 192
Rita Yang 2:ca014ee9f00a 193 void ADIS16467TestSuite::test_existence()
Rita Yang 2:ca014ee9f00a 194 {
Rita Yang 2:ca014ee9f00a 195 pc.printf("The IMU is connected and working: %s\r\n", imu->checkExistence() ? "True" : "False");
Rita Yang 2:ca014ee9f00a 196 }
Rita Yang 2:ca014ee9f00a 197
Rita Yang 2:ca014ee9f00a 198 void ADIS16467TestSuite::test_firmInfo() {
Rita Yang 2:ca014ee9f00a 199 struct ADIS16467::FirmwareInfo data;
Rita Yang 2:ca014ee9f00a 200 imu->getFirmwareInformation(data);
Rita Yang 2:ca014ee9f00a 201
Rita Yang 2:ca014ee9f00a 202 pc.printf("Firmware Revision: %" PRIu8 ".%" PRIu8"\r\n", data.firmRevMajor, data.firmRevMinor);
Rita Yang 2:ca014ee9f00a 203 pc.printf("Firmware Revision Date: %" PRIu8 "/%" PRIu8 "/%" PRIu16 "\r\n", data.firmwareMonth, data.firmwareDay, data.firmwareYear);
Rita Yang 2:ca014ee9f00a 204 pc.printf("Serial Number: 0x%" PRIx16 "\r\n", data.serialNum);
Rita Yang 2:ca014ee9f00a 205 }
Rita Yang 2:ca014ee9f00a 206
Rita Yang 2:ca014ee9f00a 207
Rita Yang 2:ca014ee9f00a 208 int main() {
Rita Yang 2:ca014ee9f00a 209 while(true)
Rita Yang 2:ca014ee9f00a 210 {
Rita Yang 2:ca014ee9f00a 211 pc.printf("\r\nADIS16467 IMU Test Suite:\r\n");
Rita Yang 2:ca014ee9f00a 212
Rita Yang 2:ca014ee9f00a 213 ADIS16467::ADIS16467 imuModule = ADIS16467::ADIS16467(&pc, PIN_SPI_MOSI, PIN_SPI_MISO, PIN_SPI_SCK,
Rita Yang 2:ca014ee9f00a 214 PIN_ADIS_CS, PIN_ADIS_RST);
Rita Yang 2:ca014ee9f00a 215
Rita Yang 2:ca014ee9f00a 216 ADIS16467TestSuite harness;
Rita Yang 2:ca014ee9f00a 217 harness.imu = &imuModule;
Rita Yang 2:ca014ee9f00a 218
Rita Yang 2:ca014ee9f00a 219 harness.imu->initADIS();
Rita Yang 2:ca014ee9f00a 220
Rita Yang 2:ca014ee9f00a 221 int test = -1;
Rita Yang 2:ca014ee9f00a 222
Rita Yang 2:ca014ee9f00a 223 //Menu
Rita Yang 2:ca014ee9f00a 224 pc.printf("Select a test: \n\r");
Rita Yang 2:ca014ee9f00a 225 pc.printf("1. Read Data\r\n");
Rita Yang 2:ca014ee9f00a 226 pc.printf("2. Read Error Flags\r\n");
Rita Yang 2:ca014ee9f00a 227 pc.printf("3. Burst Read\r\n");
Rita Yang 2:ca014ee9f00a 228 pc.printf("4. Sensor Self Test\r\n");
Rita Yang 2:ca014ee9f00a 229 pc.printf("5. Set Poll Rate\r\n");
Rita Yang 2:ca014ee9f00a 230 pc.printf("6. Calibrate Bias\r\n");
Rita Yang 2:ca014ee9f00a 231 pc.printf("7. Existence Test\r\n");
Rita Yang 2:ca014ee9f00a 232 pc.printf("8. Get Firmware Information\r\n");
Rita Yang 2:ca014ee9f00a 233 pc.printf("9. Exit Test Suite\r\n");
Rita Yang 2:ca014ee9f00a 234
Rita Yang 2:ca014ee9f00a 235 pc.scanf("%d", &test);
Rita Yang 2:ca014ee9f00a 236 pc.printf("Running test %d:\r\n\n", test);
Rita Yang 2:ca014ee9f00a 237
Rita Yang 2:ca014ee9f00a 238 harness.imu->setGyroBiases(-0.11594f, 0.258192f, 0.272063f);
Rita Yang 2:ca014ee9f00a 239
Rita Yang 2:ca014ee9f00a 240 //Run Tests
Rita Yang 2:ca014ee9f00a 241 switch(test) {
Rita Yang 2:ca014ee9f00a 242 case 1 : harness.test_readData(); break;
Rita Yang 2:ca014ee9f00a 243 case 2 : harness.test_readFlags(); break;
Rita Yang 2:ca014ee9f00a 244 case 3 : harness.test_burstRead(); break;
Rita Yang 2:ca014ee9f00a 245 case 4 : harness.test_sensorSelfTest(); break;
Rita Yang 2:ca014ee9f00a 246 case 5 :
Rita Yang 2:ca014ee9f00a 247 {
Rita Yang 2:ca014ee9f00a 248 int rate = -1;
Rita Yang 2:ca014ee9f00a 249 pc.printf("Input poll rate: ");
Rita Yang 2:ca014ee9f00a 250 pc.scanf("%d", &rate);
Rita Yang 2:ca014ee9f00a 251 harness.test_setPoll(rate);
Rita Yang 2:ca014ee9f00a 252 }
Rita Yang 2:ca014ee9f00a 253 case 6 : harness.test_calibrateBias(); break;
Rita Yang 2:ca014ee9f00a 254 case 7 : harness.test_existence(); break;
Rita Yang 2:ca014ee9f00a 255 case 8 : harness.test_firmInfo(); break;
Rita Yang 2:ca014ee9f00a 256 case 9 : printf("Exiting Test Suite.\r\n"); return 0;
Rita Yang 2:ca014ee9f00a 257 default : printf("Invalid Test Number Selection. Please Run Again.\r\n"); return 1;
Rita Yang 2:ca014ee9f00a 258 }
Rita Yang 2:ca014ee9f00a 259
Rita Yang 2:ca014ee9f00a 260 pc.printf("Done.\r\n");
Rita Yang 2:ca014ee9f00a 261
Rita Yang 2:ca014ee9f00a 262 }
Rita Yang 2:ca014ee9f00a 263
Rita Yang 2:ca014ee9f00a 264 }
Rita Yang 2:ca014ee9f00a 265
Rita Yang 2:ca014ee9f00a 266
Rita Yang 2:ca014ee9f00a 267
Rita Yang 2:ca014ee9f00a 268