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: Adafruit_GFX_128x64 DS3231 PinDetect SDFileSystem USBDevice mbed RealtimeMath MODSERIAL
Diff: receive_data.cpp
- Revision:
- 7:33a74adff0ff
- Child:
- 8:8430a5c0914c
diff -r b962f5a783a1 -r 33a74adff0ff receive_data.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/receive_data.cpp Sat May 17 01:20:31 2014 +0000
@@ -0,0 +1,97 @@
+#include "mbed.h"
+#include "MPU6050_6Axis_MotionApps20.h"
+#include "debug.h"
+
+// MPU
+MPU6050 mpu;
+InterruptIn dataReady(P0_15);
+
+// MPU control/status vars
+bool dmpReady = false; // set true if DMP init was successful
+uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
+uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
+uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
+uint16_t fifoCount; // count of all bytes currently in FIFO
+uint8_t fifoBuffer[64]; // FIFO storage buffer
+
+// orientation/motion vars
+Quaternion q; // [w, x, y, z] quaternion container
+VectorInt16 aa; // [x, y, z] accel sensor measurements
+VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements
+VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements
+VectorFloat gravity; // [x, y, z] gravity vector
+float euler[3]; // [psi, theta, phi] Euler angle container
+float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
+
+volatile bool mpuInterrupt = false;
+void dataReadyISR() {
+ mpuInterrupt = true;
+}
+
+/* Returns a pointer to an array containing the most recent data, otherwise NULL. Requires the mpu to be initialized. */
+void receive_data()
+{
+ static uint32_t n_overflows = 0;
+// while (true) {
+ //if (!dmpReady) break; // do nothing if dmp not ready
+ if (!dmpReady) return;
+
+ while (!mpuInterrupt && fifoCount < packetSize);
+
+ // Reset interrupt
+ mpuInterrupt = false;
+ mpuIntStatus = mpu.getIntStatus();
+
+ // get current FIFO count
+ fifoCount = mpu.getFIFOCount();
+
+// PC_PRINTF("%d, ", fifoCount); PC_PRINTF("%x, ", mpuIntStatus);
+ // check for overflow (this should never happen unless our code is too inefficient)
+ if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
+ PC_PRINTLN("**** FIFO OVERFLOW ****");
+ n_overflows++;
+ // reset so we can continue cleanly
+ mpu.resetFIFO();
+ // otherwise, check for DMP data ready interrupt (this should happen frequently)
+ } else if (mpuIntStatus & 0x02) {
+ // Wait for a full packet - should be very short wait
+ while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
+
+ // read a packet from FIFO
+ mpu.getFIFOBytes(fifoBuffer, packetSize);
+ fifoCount -= packetSize;
+
+ // Get acceleration data
+ mpu.dmpGetAccel(&aa, fifoBuffer);
+// mpu.dmpGetQuaternion(&q, fifoBuffer);
+// mpu.dmpGetGravity(&gravity, &q);
+// mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
+// mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
+
+ PC_PRINTF("%d, ", aa.x);
+ PC_PRINTF("%d, ", aa.y);
+ PC_PRINTLNF("%d", aa.z);
+// OLED_SETCURS(0, 10); OLED_PRINTF("%d, ", aaWorld.x); OLED_PRINTF("%d, ", aaWorld.y); OLED_PRINTLNF("%d", aaWorld.z);
+
+// fprintf(logFile, "%u,%d,%d,%d,%f,%f,%f,%f,%u\n", captureTime.read_ms(), aa.x, aa.y, aa.z, q.x, q.y, q.z, q.w, n_overflows);
+// }
+ }
+}
+
+void receive_init() {
+ PC_PRINTLN("Initializing MPU");
+ mpu.initialize();
+ devStatus = mpu.dmpInitialize();
+
+ if (devStatus == 0) {
+ mpu.setDMPEnabled(true);
+ packetSize = mpu.dmpGetFIFOPacketSize();
+
+ PC_PRINTLN("DMP Initialized successfully!");
+ dmpReady = true;
+ dataReady.rise(dataReadyISR);
+ } else { // ERROR
+ PC_PRINTLNF("Error initializing MPU (code %d)", devStatus);
+ DIE(DMP_ERROR_RATE);
+ }
+}
\ No newline at end of file