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.
RTOS-Threads/src/Task1.cpp@30:d9b988f8d84f, 2014-05-12 (annotated)
- Committer:
- pHysiX
- Date:
- Mon May 12 04:43:38 2014 +0000
- Revision:
- 30:d9b988f8d84f
- Parent:
- 27:18b6580eb0b1
- Child:
- 31:3dde2201e54d
WIP
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| pHysiX | 22:ef8aa9728013 | 1 | /* File: Task1.cpp | 
| pHysiX | 22:ef8aa9728013 | 2 | * Author: Trung Tin Ian HUA | 
| pHysiX | 22:ef8aa9728013 | 3 | * Date: May 2014 | 
| pHysiX | 22:ef8aa9728013 | 4 | * Purpose: Thread1: Code to read Yaw Pitch Roll angles from MPU6050 DMP. | 
| pHysiX | 22:ef8aa9728013 | 5 | * Settings: 100Hz | 
| pHysiX | 30:d9b988f8d84f | 6 | * Timing: 1440us | 
| pHysiX | 22:ef8aa9728013 | 7 | */ | 
| pHysiX | 1:43f8ac7ca6d7 | 8 | #include "Task1.h" | 
| pHysiX | 1:43f8ac7ca6d7 | 9 | #include "setup.h" | 
| pHysiX | 1:43f8ac7ca6d7 | 10 | |
| pHysiX | 2:ab967d7b4346 | 11 | /* MPU6050 control/status variables: */ | 
| pHysiX | 2:ab967d7b4346 | 12 | uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU | 
| pHysiX | 2:ab967d7b4346 | 13 | uint16_t fifoCount; // count of all bytes currently in FIFO | 
| pHysiX | 21:b642c18eccd1 | 14 | uint8_t fifoBuffer[64]; // FIFO storage buffer | 
| pHysiX | 1:43f8ac7ca6d7 | 15 | |
| pHysiX | 2:ab967d7b4346 | 16 | /* Orientation/motion variables: */ | 
| pHysiX | 2:ab967d7b4346 | 17 | Quaternion q; // [w, x, y, z] quaternion container | 
| pHysiX | 2:ab967d7b4346 | 18 | VectorFloat gravity; // [x, y, z] gravity vector | 
| pHysiX | 2:ab967d7b4346 | 19 | float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector | 
| pHysiX | 24:54a8cdf17378 | 20 | float ypr_1[3]; | 
| pHysiX | 22:ef8aa9728013 | 21 | |
| pHysiX | 22:ef8aa9728013 | 22 | float altitude, temperature; | 
| pHysiX | 22:ef8aa9728013 | 23 | bool counterTask1 = false; | 
| pHysiX | 22:ef8aa9728013 | 24 | |
| pHysiX | 22:ef8aa9728013 | 25 | #ifndef M_PI | 
| pHysiX | 22:ef8aa9728013 | 26 | #define M_PI 3.1415 | 
| pHysiX | 22:ef8aa9728013 | 27 | #endif | 
| pHysiX | 12:953d25061417 | 28 | |
| pHysiX | 12:953d25061417 | 29 | #ifdef ENABLE_COMPASS | 
| pHysiX | 12:953d25061417 | 30 | //int compassX, compassY, compassZ; | 
| pHysiX | 12:953d25061417 | 31 | double heading = 0; | 
| pHysiX | 12:953d25061417 | 32 | #endif | 
| pHysiX | 12:953d25061417 | 33 | |
| pHysiX | 30:d9b988f8d84f | 34 | #ifdef TIME_TASK1 | 
| pHysiX | 30:d9b988f8d84f | 35 | Timer _t1; | 
| pHysiX | 30:d9b988f8d84f | 36 | #endif | 
| pHysiX | 1:43f8ac7ca6d7 | 37 | // ================================================================ | 
| pHysiX | 30:d9b988f8d84f | 38 | // === YPR THREAD === | 
| pHysiX | 2:ab967d7b4346 | 39 | // ================================================================ | 
| pHysiX | 1:43f8ac7ca6d7 | 40 | void Task1(void const *argument) | 
| pHysiX | 1:43f8ac7ca6d7 | 41 | { | 
| pHysiX | 30:d9b988f8d84f | 42 | switch (box_demo) { | 
| pHysiX | 30:d9b988f8d84f | 43 | case true: | 
| pHysiX | 30:d9b988f8d84f | 44 | AHRSSample(); | 
| pHysiX | 27:18b6580eb0b1 | 45 | |
| pHysiX | 30:d9b988f8d84f | 46 | BT.printf(" | 
| pHysiX | 30:d9b988f8d84f | 47 | break; | 
| pHysiX | 1:43f8ac7ca6d7 | 48 | |
| pHysiX | 30:d9b988f8d84f | 49 | case false: | 
| pHysiX | 30:d9b988f8d84f | 50 | #ifdef TIME_TASK1 | 
| pHysiX | 30:d9b988f8d84f | 51 | _t1.reset(); | 
| pHysiX | 30:d9b988f8d84f | 52 | _t1.start(); | 
| pHysiX | 30:d9b988f8d84f | 53 | #endif | 
| pHysiX | 30:d9b988f8d84f | 54 | if (armed) { | 
| pHysiX | 30:d9b988f8d84f | 55 | switch (mode) { | 
| pHysiX | 30:d9b988f8d84f | 56 | case RATE: | 
| pHysiX | 30:d9b988f8d84f | 57 | break; | 
| pHysiX | 12:953d25061417 | 58 | |
| pHysiX | 30:d9b988f8d84f | 59 | case ATTITUDE: | 
| pHysiX | 30:d9b988f8d84f | 60 | default: | 
| pHysiX | 30:d9b988f8d84f | 61 | AHRSSample(); | 
| pHysiX | 12:953d25061417 | 62 | |
| pHysiX | 30:d9b988f8d84f | 63 | counterTask1 = true; | 
| pHysiX | 30:d9b988f8d84f | 64 | break; | 
| pHysiX | 30:d9b988f8d84f | 65 | } | 
| pHysiX | 27:18b6580eb0b1 | 66 | } | 
| pHysiX | 1:43f8ac7ca6d7 | 67 | } | 
| pHysiX | 2:ab967d7b4346 | 68 | } | 
| pHysiX | 30:d9b988f8d84f | 69 | |
| pHysiX | 30:d9b988f8d84f | 70 | // ================================================================ | 
| pHysiX | 30:d9b988f8d84f | 71 | // === Helper functions === | 
| pHysiX | 30:d9b988f8d84f | 72 | // ================================================================ | 
| pHysiX | 30:d9b988f8d84f | 73 | |
| pHysiX | 30:d9b988f8d84f | 74 | void AHRSSample(void) | 
| pHysiX | 30:d9b988f8d84f | 75 | { | 
| pHysiX | 30:d9b988f8d84f | 76 | // reset interrupt flag and get INT_STATUS byte | 
| pHysiX | 30:d9b988f8d84f | 77 | mpuIntStatus = imu.getIntStatus(); | 
| pHysiX | 30:d9b988f8d84f | 78 | |
| pHysiX | 30:d9b988f8d84f | 79 | // get current FIFO count | 
| pHysiX | 30:d9b988f8d84f | 80 | fifoCount = imu.getFIFOCount(); | 
| pHysiX | 30:d9b988f8d84f | 81 | //imu.debugSerial.printf("FIFO Count: %d\n", fifoCount); | 
| pHysiX | 30:d9b988f8d84f | 82 | |
| pHysiX | 30:d9b988f8d84f | 83 | // check for overflow | 
| pHysiX | 30:d9b988f8d84f | 84 | // Only keep a max of 2 packets in buffer. | 
| pHysiX | 30:d9b988f8d84f | 85 | if ((mpuIntStatus & 0x10) || fifoCount > 84) { | 
| pHysiX | 30:d9b988f8d84f | 86 | // reset so we can continue cleanly | 
| pHysiX | 30:d9b988f8d84f | 87 | imu.resetFIFO(); | 
| pHysiX | 30:d9b988f8d84f | 88 | imu.debugSerial.printf("FIFO overflow!"); | 
| pHysiX | 30:d9b988f8d84f | 89 | |
| pHysiX | 30:d9b988f8d84f | 90 | // otherwise, check for DMP data ready interrupt (this should happen frequently) | 
| pHysiX | 30:d9b988f8d84f | 91 | } else if (mpuIntStatus & 0x02) { | 
| pHysiX | 30:d9b988f8d84f | 92 | // wait for correct available data length, should be a VERY short wait | 
| pHysiX | 30:d9b988f8d84f | 93 | while (fifoCount < packetSize) fifoCount = imu.getFIFOCount(); | 
| pHysiX | 30:d9b988f8d84f | 94 | |
| pHysiX | 30:d9b988f8d84f | 95 | while (fifoCount > 41) { | 
| pHysiX | 30:d9b988f8d84f | 96 | // read a packet from FIFO | 
| pHysiX | 30:d9b988f8d84f | 97 | imu.getFIFOBytes(fifoBuffer, packetSize); | 
| pHysiX | 30:d9b988f8d84f | 98 | |
| pHysiX | 30:d9b988f8d84f | 99 | // track FIFO count here in case there is > 1 packet available | 
| pHysiX | 30:d9b988f8d84f | 100 | // (this lets us immediately read more without waiting for an interrupt) | 
| pHysiX | 30:d9b988f8d84f | 101 | fifoCount -= packetSize; | 
| pHysiX | 30:d9b988f8d84f | 102 | } | 
| pHysiX | 30:d9b988f8d84f | 103 | |
| pHysiX | 30:d9b988f8d84f | 104 | // display YPR angles in degrees | 
| pHysiX | 30:d9b988f8d84f | 105 | imu.dmpGetQuaternion(&q, fifoBuffer); | 
| pHysiX | 30:d9b988f8d84f | 106 | imu.dmpGetGravity(&gravity, &q); | 
| pHysiX | 30:d9b988f8d84f | 107 | imu.dmpGetYawPitchRoll(ypr, &q, &gravity); | 
| pHysiX | 30:d9b988f8d84f | 108 | |
| pHysiX | 30:d9b988f8d84f | 109 | ypr[0] = ypr[0] * 180/M_PI; | 
| pHysiX | 30:d9b988f8d84f | 110 | ypr[1] = ypr[1] * 180/M_PI; | 
| pHysiX | 30:d9b988f8d84f | 111 | ypr[2] = ypr[2] * 180/M_PI; | 
| pHysiX | 30:d9b988f8d84f | 112 | |
| pHysiX | 30:d9b988f8d84f | 113 | /* | 
| pHysiX | 30:d9b988f8d84f | 114 | if (compass.getDataReady()) { | 
| pHysiX | 30:d9b988f8d84f | 115 | // compass.getValues(&compass_x, &compass_y, &compass_z); | 
| pHysiX | 30:d9b988f8d84f | 116 | heading = compass.getHeadingXY() * 180/M_PI; | 
| pHysiX | 30:d9b988f8d84f | 117 | } | 
| pHysiX | 30:d9b988f8d84f | 118 | |
| pHysiX | 30:d9b988f8d84f | 119 | ypr[0] *= 0.98; | 
| pHysiX | 30:d9b988f8d84f | 120 | ypr[0] += 0.02*heading; | 
| pHysiX | 30:d9b988f8d84f | 121 | */ | 
| pHysiX | 30:d9b988f8d84f | 122 | } | 
| pHysiX | 30:d9b988f8d84f | 123 | } |