se
Dependencies: SDFileSystem circular_buffer MPU6050 SoftSerial
source/main.cpp
- Committer:
- OsmanKameric
- Date:
- 2017-08-23
- Revision:
- 4:147bbe6f9626
- Parent:
- 3:b2087af18efe
- Child:
- 5:ea629a3fd6c1
File content as of revision 4:147bbe6f9626:
#include <events/mbed_events.h> #include <mbed.h> #include "ble/BLE.h" #include "ble/Gap.h" #include "ble/services/BatteryService.h" #include "MPU6050.h" #include "MPUService.h" #include <string> #include <stdio.h> #include "SoftSerial.h" #include "circular_buffer.h" #include <Fsm.h> #include <Events.h> bool test=0; InterruptIn mpuInterrupt(p5); struct TurnOff turnoff; struct TurnOn turnon; struct Move move; Fsm* fsm; struct MotionLog { int motX; int motY; int motZ; }; MotionLog motionLog; circular_buffer<MotionLog> cb(5); Serial pc(p6, p8); //SoftSerial pc1(p9, p10); MPU6050 mpu6050; //InterruptIn pin(p10); //DigitalOut led(LED1, 1); //DigitalOut led2(LED2, 1); uint16_t customServiceUUID = 0xA000; uint16_t readCharUUID = 0xA001; uint16_t interruptUUID = 0xA002; uint16_t gyroUUID = 0xA003; uint16_t motionThresholdUUID = 0xA004; static uint8_t motionThresholdValue[10] = {0}; WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(motionThresholdValue)> motionThreshold(motionThresholdUUID, motionThresholdValue); uint16_t motionDurationUUID = 0xA005; static uint8_t motionDurationValue[10] = {0}; WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(motionDurationValue)> motionDuration(motionDurationUUID, motionDurationValue); uint16_t zeroMotionThresholdUUID = 0xA006; static uint8_t zeroMotionThresholdValue[10] = {0}; WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(zeroMotionThresholdValue)> zeroMotionThreshold(zeroMotionThresholdUUID, zeroMotionThresholdValue); uint16_t zeroMotionDurationUUID = 0xA007; static uint8_t zeroMotionDurationValue[10] = {0}; WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(zeroMotionDurationValue)> zeroMotionDuration(zeroMotionDurationUUID, zeroMotionDurationValue); uint16_t fsmStateUUID = 0xA008; static float fsmStateValue[3] = {0}; ReadOnlyArrayGattCharacteristic<float, sizeof(fsmStateValue)> fsmState(fsmStateUUID, fsmStateValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); DigitalOut alivenessLED(LED1, 0); const static char DEVICE_NAME[] = "MPU"; static const uint16_t uuid16_list[] = {0x0A0A}; //static int counter; /* Set Up custom Characteristics */ static float readValue[3] = {0}; static float interruptValue[3] = {0}; static float gyroValue[3] = {0}; ReadOnlyArrayGattCharacteristic<float, sizeof(readValue)> readChar(readCharUUID, readValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); ReadOnlyArrayGattCharacteristic<float, sizeof(interruptValue)> interrupt(interruptUUID, interruptValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); ReadOnlyArrayGattCharacteristic<float, sizeof(gyroValue)> gyro(gyroUUID, gyroValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); //static float writeValue[2] = {3,4}; //WriteOnlyArrayGattCharacteristic<float, sizeof(writeValue)> writeChar(writeCharUUID, writeValue); /* Set up custom service */ GattCharacteristic *characteristics[] = {&readChar/*, &writeChar*/, &interrupt, &gyro, &motionThreshold, &motionDuration, &zeroMotionThreshold, &zeroMotionDuration, &fsmState}; GattService customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *)); static EventQueue eventQueue(/* event count */ 10 * /* event size */ 32); InterruptIn button(BUTTON1); void updateReadValue() { alivenessLED = !alivenessLED; //mpu6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //mpu6050.getAcceleration(&ax, &ay, &az); mpu6050.readAccelData(accelData); mpu6050.getAres(); ax = accelData[0]*aRes - accelBias[0]; ay = accelData[1]*aRes - accelBias[1]; az = accelData[2]*aRes - accelBias[2]; float accelValues[3] = {ax,ay,az}; mpu6050.readGyroData(gyroData); mpu6050.getGres(); gx = gyroData[0]*gRes - gyroBias[0]; gy = gyroData[1]*gRes - gyroBias[1]; gz = gyroData[2]*gRes - gyroBias[2]; float gyroValues[3] = {gx,gy,gz}; //counter++; //pc.printf("| Before | ax=%.3f | ay=%.3f | az=%.3f \r\n",gx,gy,gz); //pc.printf("| Acce | ax=%.3f | ay=%.3f | az=%.3f | Gyro | gx=%.3f | gy=%.3f | gz=%.3f\r\n",ax,ay,az,gx,gy,gz); //len_send = strlen((const char *)newValue); uint8_t motionByte = mpu6050.readThisByte(MPU6050_RA_MOT_DETECT_STATUS); uint8_t b; bool zero = false; float fx, fy,fz=0; //char x,y,z; int mx=0; int my=0; int mz=0; //x=y=z='0'; for(int i = 0; i<=7; i++) { b = motionByte & (1<<i); if(i==0 && b==1) { zero = true; //pc.printf(" %c %c %c | ",x,y,z); //pc.printf(" | %.3f | %.3f | %.3f | %.3f | %.3f | %.3f ZERO DETECTED\r\n",ax,ay,az, gx, gy, gz); //pc.printf(" | %d | %d | %d | %d | %d | %d ZERO DETECTED\r\n",ax,ay,az, gx, gy, gz); } if(i==1 && b==2) { //pc.printf("This should not happen :).\r\n"); } if(i==6 && b==64) { //x='+'; fx=1; mx=1; //pc.printf("X POSITIVE motion detected.\r\n"); } if(i==7 && b==128) { //x='-'; fx=2; mx=1; //pc.printf("X NEGATIVE motion detected.\r\n"); } if(i==4 && b==16) { //y='+'; fy=1; my=1; //pc.printf("Y POSITIVE motion detected.\r\n"); } if(i==5 && b==32) { //y='-'; fy=2; my=1; //pc.printf("Y NEGATIVE motion detected.\r\n"); } if(i==2 && b==4) { //z='+'; fz=1; mz=1; //pc.printf("Z POSITIVE motion detected.\r\n"); } if(i==3 && b==8) { //z='-'; fz=2; mz=1; //pc.printf("Z NEGATIVE motion detected.\r\n"); } } // if(test) { motionLog.motX = mx; motionLog.motY = my; motionLog.motZ = mz; cb.push_back(motionLog); //pc.printf("Desio se motion\r\n"); // test=0; //} int numX, numY, numZ=0; //pc.printf("\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); numX=numY=numZ=0; for(int i=0; i<=4; i++) { //pc.printf("%d %d %d\r\n",cb[i].motX, cb[i].motY, cb[i].motZ); if(cb[i].motX!=0) { numX++; } if(cb[i].motY!=0) { numY++; } if(cb[i].motZ!=0) { numZ++; } } if(numX<=2) { numX=0; } else numX=1; if(numY<=2) { numY=0; } else numY=1; if(numZ<=2) { numZ=0; } else numZ=1; if(numX!=0 || numY!=0 || numZ!=0){ numX=1; numY=1; numZ=1; } //pc.printf("***************************\r\n"); //pc.printf("%d %d %d\r\n",numX,numY,numZ); float fsmStateValues[3] = {numX,numY,numZ}; if(!zero) { //pc.printf(" %c %c %c | ",x,y,z); //pc.printf(" | %.3f | %.3f | %.3f | %.3f | %.3f | %.3f\r\n",ax,ay,az, gx, gy, gz); //pc.printf(" | %d | %d | %d | %d | %d | %d\r\n",ax,ay,az, gx, gy, gz); } float motionValues[3] = {fx,fy,fz}; BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(interrupt.getValueHandle(), (uint8_t*)motionValues, 12); BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(readChar.getValueHandle(), (uint8_t*)accelValues, 12); BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(gyro.getValueHandle(), (uint8_t*)gyroValues, 12); BLE::Instance(BLE::DEFAULT_INSTANCE).gattServer().write(fsmState.getValueHandle(), (uint8_t*)fsmStateValues, 12); } void periodicCallback(void) { //if (BLE::Instance().getGapState().connected) { // eventQueue.call(updateReadValue); //} } void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { BLE& ble = BLE::Instance(); eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); } void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { (void) params; BLE::Instance().gap().startAdvertising(); } void onBleInitError(BLE &ble, ble_error_t error) { /* Initialization error handling should go here */ } void writeCharCallback(const GattWriteCallbackParams *params) { printf("Nesto ima na ulazu\r\n"); printf("Handle je: %d\r\n", params->handle); if(params->handle == motionThreshold.getValueHandle()) { uint8_t value = params->data[0]; printf("Value is: %d\r\n", value); mpu6050.setMotionDetectionThreshold(value); uint8_t motionDetectionThreshold = mpu6050.getMotionDetectionThreshold(); pc.printf("MPU6050 motion detection threshold is: %d \r\n", motionDetectionThreshold); //printf("Data received: length = %d, data = 0x",params->len); // for(int x=0; x < params->len; x++) { // printf("%x", params->data[x]); // } // printf("\n\r"); } if(params->handle == motionDuration.getValueHandle()) { uint8_t value = params->data[0]; printf("Value is: %d\r\n", value); mpu6050.setMotionDetectionDuration(value); uint8_t motionDetectionDuration = mpu6050.getMotionDetectionDuration(); pc.printf("MPU6050 motion detection duration is: %d \r\n", motionDetectionDuration); //printf("Data received: length = %d, data = 0x",params->len); // for(int x=0; x < params->len; x++) { // printf("%x", params->data[x]); // } // printf("\n\r"); } if(params->handle == zeroMotionThreshold.getValueHandle()) { uint8_t value = params->data[0]; printf("Value is: %d\r\n", value); mpu6050.setZeroMotionDetectionThreshold(value); uint8_t zeroMotionDetectionThreshold = mpu6050.getZeroMotionDetectionThreshold(); pc.printf("MPU6050 zero motion detection threshold is: %d \r\n", zeroMotionDetectionThreshold); } if(params->handle == zeroMotionDuration.getValueHandle()) { uint8_t value = params->data[0]; printf("Value is: %d\r\n", value); mpu6050.setZeroMotionDetectionDuration(value); uint8_t zeroMotionDetectionDuration = mpu6050.getZeroMotionDetectionDuration(); pc.printf("MPU6050 zero motion detection duration is: %d \r\n", zeroMotionDetectionDuration); } } void bleInitComplete(BLE::InitializationCompleteCallbackContext* params) { BLE& ble = params->ble; ble_error_t error = params->error; if (error != BLE_ERROR_NONE) { /* In case of error, forward the error handling to onBleInitError */ onBleInitError(ble, error); return; } /* Ensure that it is the default instance of BLE */ if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } ble.gap().onDisconnection(disconnectionCallback); ble.gattServer().onDataWritten(writeCharCallback); /* setup advertising */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t*)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().startAdvertising(); ble.addService(customService); ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ } void flip() { //pc.printf("Desio se interupt"); } void mpuInterruptCallback() { //test=1; if (BLE::Instance().getGapState().connected) { eventQueue.call(updateReadValue); } } bool XnegMD, XposMD, YnegMD, YposMD, ZnegMD, ZposMD; int main() { //mpu6050.whoAmI(); //mpu6050.calibrate(accelBias, gyroBias); //mpu6050.init(); motionLog.motX=0; motionLog.motY=0; motionLog.motZ=0; for(int i=0; i<=4; i++) { cb.push_back(motionLog); } mpu6050.calibrate(accelBias, gyroBias); mpu6050.initialize(); mpu6050.setSleepEnabled(0); pc.baud(115200); mpuInterrupt.fall(mpuInterruptCallback); //mpu6050.setIntEnabled(1); mpu6050.setIntZeroMotionEnabled(1); mpu6050.setIntMotionEnabled(1); mpu6050.setDHPFMode(1); pc.printf("\n\n\n"); uint8_t motionDetectionThreshold = mpu6050.getMotionDetectionThreshold(); //pc.printf("MPU6050 motion detection threshold is: %d \r\n", motionDetectionThreshold); //pc.printf("MPU6050 set motion detection threshold to 2\r\n"); mpu6050.setMotionDetectionThreshold(1); motionDetectionThreshold = mpu6050.getMotionDetectionThreshold(); //pc.printf("MPU6050 motion detection threshold now is: %d \r\n", motionDetectionThreshold); pc.printf("Motion detection threshold is: %d \r\n", motionDetectionThreshold); uint8_t motionDetectionDuration = mpu6050.getMotionDetectionDuration(); //pc.printf("MPU6050 motion detection duration is: %d \r\n", motionDetectionDuration); //pc.printf("MPU6050 set motion detection duration to 40\r\n"); mpu6050.setMotionDetectionDuration(20); motionDetectionDuration = mpu6050.getMotionDetectionDuration(); //pc.printf("MPU6050 motion detection duration now is: %d \r\n", motionDetectionDuration); pc.printf("Motion detection duration is: %d \r\n", motionDetectionDuration); //******************************************************************************************************************************* //pc.printf("\n\n\n"); uint8_t zeroMotionDetectionThreshold = mpu6050.getZeroMotionDetectionThreshold(); //pc.printf("MPU6050 zero motion detection threshold is: %d \r\n", zeroMotionDetectionThreshold); //pc.printf("MPU6050 set zero motion detection threshold to 2\r\n"); mpu6050.setZeroMotionDetectionThreshold(2); zeroMotionDetectionThreshold = mpu6050.getZeroMotionDetectionThreshold(); //pc.printf("MPU6050 zero motion detection threshold now is: %d \r\n", zeroMotionDetectionThreshold); pc.printf("Zero motion detection threshold is: %d \r\n", zeroMotionDetectionThreshold); //pc.printf("\n\n\n"); int8_t zeroMotionDetectionDuration = mpu6050.getZeroMotionDetectionDuration(); //pc.printf("MPU6050 zero motion detection duration is: %d \r\n", zeroMotionDetectionDuration); //pc.printf("MPU6050 set zero motion detection duration to 1\r\n"); mpu6050.setZeroMotionDetectionDuration(1); zeroMotionDetectionDuration = mpu6050.getZeroMotionDetectionDuration(); //pc.printf("MPU6050 zero motion detection duration now is: %d \r\n", zeroMotionDetectionDuration); pc.printf("Zero motion detection duration is: %d \r\n", zeroMotionDetectionDuration); //******************************************************************************************************************************* //setMotionDetectionThreshold //char myChar = mpu6050.readByte(MPU6050_ADDRESS, 0x1F); //pc.printf("Prije postavljanja\n"); //pc.printf("MotionDetectionThreshold iznosi: %x\n",myChar); //pc.printf("Poslije postavljanja\n"); //mpu6050.writeByte(MPU6050_ADDRESS, 0x1F,0x02); //myChar = mpu6050.readByte(MPU6050_ADDRESS, 0x1F); //pc.printf("MotionDetectionThreshold iznosi: %x\n",myChar); //setMotionDetectionDuration //myChar = mpu6050.readByte(MPU6050_ADDRESS, 0x20); //pc.printf("Prije postavljanja\n"); //pc.printf("MotionDetectionDuration iznosi: %x\n",myChar); //pc.printf("Poslije postavljanja\n"); //mpu6050.writeByte(MPU6050_ADDRESS, 0x20,0x28); //myChar = mpu6050.readByte(MPU6050_ADDRESS, 0x20); //pc.printf("MotionDetectionDuration iznosi: %x\n",myChar); // XnegMD = mpu6050.getXNegMotionDetected(); //mpu6050.whoAmI(); //uint8_t *data; //char byte = mpu6050.readByte(MPU6050_ADDRESS, 0x61); //*data = byte & (1 << 7); //pc.printf("Byte iznosi: %x\n",byte); //int i = data[0]; //pc.printf("7 bit iznosi: %d\n", i); //XposMD = mpu6050.getXPosMotionDetected(); //pin.fall(&flip); eventQueue.call_every(500, periodicCallback); BLE& ble = BLE::Instance(); fsm = new Fsm(ble); ble.onEventsToProcess(scheduleBleEventsProcessing); ble.init(bleInitComplete); eventQueue.dispatch_forever(); while (ble.hasInitialized() == false) { /* spin loop */ } // pc1.baud(9600); //while (true) { //ble.waitForEvent(); // pc1.printf("tare "); //wait_ms(1000); //} //return 0; }