Integration of code (not working)

Dependencies:   mpu9250_i2c biquadFilter PCA peakdetection Eigen

Revision:
4:83c7e402fff1
Parent:
2:d4c480d17944
Child:
5:8c276289611c
--- a/main.cpp	Mon Nov 25 14:34:22 2019 +0000
+++ b/main.cpp	Tue Nov 26 16:23:08 2019 +0000
@@ -10,6 +10,12 @@
  * Eigen Library
  */
 
+#include <events/mbed_events.h>
+#include <mbed.h>
+#include "ble/BLE.h"
+#include "ble/Gap.h"
+#include "pretty_printer.h"
+
 #include "mbed.h"
 #include "platform/mbed_thread.h"
 #include "stats_report.h"
@@ -35,9 +41,153 @@
 #define SLEEP_TIME                  20 // (msec)
 
 
+const static char DEVICE_NAME[] = "STEP COUNTER";
+
+const static uint16_t STEP_COUNTER_SERVICE_UUID = 0xA000;
+const static uint16_t STEP_COUNTER_CHARACTERISTIC_UUID = 0xA001;
+
+int step_count = 0;
+int id = 0;
+ReadWriteGattCharacteristic<int> step_count_state(STEP_COUNTER_CHARACTERISTIC_UUID, &step_count, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
+
+static events::EventQueue event_queue(/* event count */ 16 * EVENTS_EVENT_SIZE);
+
+Thread t;
+
+class StepCounter : ble::Gap::EventHandler {
+public:
+    StepCounter(BLE &ble, events::EventQueue &event_queue) :
+        _ble(ble),
+        _event_queue(event_queue),
+        _step_counter_uuid(STEP_COUNTER_SERVICE_UUID),
+        _adv_data_builder(_adv_buffer) { }
+
+    void start() {
+        _ble.gap().setEventHandler(this);
+
+        _ble.init(this, &StepCounter::on_init_complete);
+        
+        _event_queue.call_every(500, this, &StepCounter::blink);
+        _event_queue.call_every(3000, this, &StepCounter::update_step_count);
+        
+        t.start(callback(&_event_queue, &EventQueue::dispatch_forever));
+    }
+    void update_step_count() {
+        printf("updating step count %d\n\r", step_count);
+        if (_ble.gap().getState().connected) {
+            _ble.gattServer().write(step_count_state.getValueHandle(), (uint8_t *)&step_count, sizeof(int));
+        }
+    }
+
+private:
+    /** Callback triggered when the ble initialization process has finished */
+    void on_init_complete(BLE::InitializationCompleteCallbackContext *params) {
+        printf("on init complete\n\r");
+        if (params->error != BLE_ERROR_NONE) {
+            print_error(params->error, "Ble initialization failed.");
+            return;
+        }
+        
+        _ble.gattServer().onDataWritten(this, &StepCounter::on_data_written);
+
+        print_mac_address();
+
+        start_advertising();
+    }
+
+    void start_advertising() {
+        printf("start advertising\n\r");
+        /* Create advertising parameters and payload */
+
+        ble::AdvertisingParameters adv_parameters(
+            ble::advertising_type_t::CONNECTABLE_UNDIRECTED,
+            ble::adv_interval_t(ble::millisecond_t(1000))
+        );
+
+        _adv_data_builder.setFlags();
+        _adv_data_builder.setLocalServiceList(mbed::make_Span(&_step_counter_uuid, 1));
+        _adv_data_builder.setName(DEVICE_NAME);
+
+        /* Setup advertising */
+
+        ble_error_t error = _ble.gap().setAdvertisingParameters(
+            ble::LEGACY_ADVERTISING_HANDLE,
+            adv_parameters
+        );
+
+        if (error) {
+            print_error(error, "_ble.gap().setAdvertisingParameters() failed");
+            return;
+        }
+
+        error = _ble.gap().setAdvertisingPayload(
+            ble::LEGACY_ADVERTISING_HANDLE,
+            _adv_data_builder.getAdvertisingData()
+        );
+
+        if (error) {
+            print_error(error, "_ble.gap().setAdvertisingPayload() failed");
+            return;
+        }
+
+        /* Start advertising */
+
+        error = _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
+
+        if (error) {
+            print_error(error, "_ble.gap().startAdvertising() failed");
+            return;
+        }
+    }
+    
+    void on_data_written(const GattWriteCallbackParams *params) {
+        if ((params->handle == step_count_state.getValueHandle()) && (params->len == 1)) {
+            step_count = *(params->data);
+        }
+        step_count = 0;
+    }
+
+    void blink(void) {
+        led1 = !led1;
+    }
+
+private:
+    /* Event handler */
+
+    void onDisconnectionComplete(const ble::DisconnectionCompleteEvent&) {
+        _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
+    }
+
+private:
+    BLE &_ble;
+    events::EventQueue &_event_queue;
+    
+    UUID _step_counter_uuid;
+
+    uint8_t _adv_buffer[ble::LEGACY_ADVERTISING_MAX_SIZE];
+    ble::AdvertisingDataBuilder _adv_data_builder;
+};
+
+/** Schedule processing of events from the BLE middleware in the event queue. */
+void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context) {
+    event_queue.call(Callback<void()>(&context->ble, &BLE::processEvents));
+}
+
+
 // main() runs in its own thread in the OS
 int main()
 {   
+    BLE &ble = BLE::Instance();
+    
+    GattCharacteristic *charTable[] = {&step_count_state};
+    GattService step_count_service(STEP_COUNTER_SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+    ble.addService(step_count_service);
+    
+    ble.onEventsToProcess(schedule_ble_events);
+
+    StepCounter demo(ble, event_queue);
+    demo.start();
+
     //new mpu(data,clk,address),in constructor addr7bit<<1
     mpu9250 *mpu = new mpu9250(p26,p27,addr7bit);
     //scale of acc and gyro
@@ -48,7 +198,9 @@
     float TempRead[1];
     float res_smooth;
     //vector<float> res_list;
-    float number=0;
+    float threshold=0.1;
+    int number=0;
+    int numpeak = 0;
     
     static MatrixXd acc_raw(3,0);
     Vector3d acc_new;
@@ -70,8 +222,8 @@
         number = number +1;
         //vector<float> res_list;
         //Blink LED and wait 1 seconds
-        led1 = !led1;
-        thread_sleep_for(SLEEP_TIME);
+        //led1 = !led1;
+        //thread_sleep_for(SLEEP_TIME);
         //read and convert date
         mpu->ReadConvertAll(AccRead,GyroRead,TempRead);
         AccRead[0]= AccRead[0]/1000;
@@ -86,31 +238,46 @@
         acc_new << AccRead[0],AccRead[1],AccRead[2];
         acc_raw.conservativeResize(acc_raw.rows(), acc_raw.cols()+1);
         acc_raw.col(acc_raw.cols()-1) = acc_new;
-        
-        //////cout << "acc_raw:" << acc_raw << endl;
-        
-        //run PCA
-        MatrixXd X1=pca.featurnormail(acc_raw);
-        pca.ComComputeCov(X1, C);
-        pca.ComputEig(C, vec, val);
-        //select dim num of eigenvector from right to left. right is important
-        //compute the result array
-        MatrixXd res = vec.rightCols(dim).transpose()*X1;
-        
-        //show the result after PCA
-        //////cout << "result" << res << endl;
-        res_list.clear();
-        for(int i = 0; i < res.cols(); i++)
+        printf("before if\n\r");
+        printf("number: %d\n\r", number);
+        if(number % 10 ==2)
         {
-            res_smooth = bqc.step(res(i));
-            res_list.push_back(res_smooth);
-            //printf("result after filter in for loop %d: %f\n\r",i,res_smooth);
-            //std::cout << "\t" << bqc.step(  ) << std::endl;
+            printf("in if\n\r");
+            if(number > 2)
+            {
+                //cout << acc_raw << endl;
+                //run PCA
+                MatrixXd X1=pca.featurnormail(acc_raw);
+                pca.ComComputeCov(X1, C);
+                pca.ComputEig(C, vec, val);
+                //select dim num of eigenvector from right to left. right is important
+                //compute the result array
+                MatrixXd res = vec.rightCols(dim).transpose()*X1;
+                
+                //show the result after PCA
+                //////cout << "result" << res << endl;
+                vector<float> res_list={};
+                
+                //printf("result of PCA size:%d\n\r",res.cols());
+                for(int i = 0; i < res.cols(); i++)
+                {
+                    res_smooth = bqc.step(res(i));
+                    res_list.push_back(res_smooth);
+                    //printf("result after filter in for loop %d: %f\n\r",i,res_smooth);
+                    //std::cout << "\t" << bqc.step(  ) << std::endl;
+                }
+                int len = res_list.size();
+                //printf("len of res:%d\n\r", len);
+                numpeak = peak.findPeaks(res_list,len,threshold);
+                printf("NUMBER OF PEAKS: %d\n\r", numpeak);
+                //printf("height in main: %f\n\r", threshold);
+                step_count += numpeak;
+                printf("num of step: %d\n\r", step_count);
+                
+                //clear the matrix to contain new data
+                acc_raw.conservativeResize(3, 0);
+            }
         }
-        int len = res_list.size();
-        printf("len of res:%d\n\r", len);
-        peak.findPeaks(res_list,len,0.1);
-        
-        
+        number = number +1;
     }
 }