Speed sensor for tasdevelop

Dependencies:   BLE_API MMA8451Q_ss mbed

Fork of FRDM_MMA8451Q by Daniel K

Revision:
1:6bd72ba7fa56
Parent:
0:fa7bb836444d
Child:
2:9d566ea4f4fa
--- a/main.cpp	Tue May 27 09:20:28 2014 +0000
+++ b/main.cpp	Wed Feb 18 08:15:33 2015 +0000
@@ -1,32 +1,201 @@
 #include "mbed.h"
 #include "MMA8451Q.h"
+#include "BLEDevice.h"
 
-#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
-  PinName const SDA = PTE25;
-  PinName const SCL = PTE24;
-#elif defined (TARGET_KL05Z)
-  PinName const SDA = PTB4;
-  PinName const SCL = PTB3;
+#define MMA8451_I2C_ADDRESS (0x1C<<1)
+
+#define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
+                               * it will have an impact on code-size and power consumption. */
+
+#if NEED_CONSOLE_OUTPUT
+Serial  pc(USBTX, USBRX);
+#define DEBUG(...) { pc.printf(__VA_ARGS__); }
 #else
-  #error TARGET NOT DEFINED
-#endif
+#define DEBUG(...) /* nothing */
+#endif /* #if NEED_CONSOLE_OUTPUT */
+
+
+
+PinName const SDA = p22;
+PinName const SCL = p20;
+MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
+
+//Serial pc(USBTX, USBRX);
+Ticker ticker;
+Ticker ticker2;
+    
+InterruptIn button(p1);
+    
+const static char  DEVICE_NAME[] = "HRM1017_SPEED";
+static volatile bool  triggerSensorPolling = false;
+BLEDevice  ble;
+
+/* Health Thermometer Service */ 
+uint8_t             thermTempPayload[5] = { 0, 0, 0, 0, 0 };
+GattCharacteristic  tempChar (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, thermTempPayload, 5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
+GattCharacteristic *htmChars[] = {&tempChar, };
+GattService         htmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, htmChars, sizeof(htmChars) / sizeof(GattCharacteristic *));
+uint16_t            uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
+
+static Gap::ConnectionParams_t connectionParams;
+
+void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)    // Mod
+{
+//    advertisingStateLed = 1;
+    DEBUG("Disconnected handle %u, reason %u\n", handle, reason);
+    DEBUG("Restarting the advertising process\n\r");
+    ble.startAdvertising();
+}
+
+void onConnectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)   //Mod
+{
+//    advertisingStateLed = 0;
+    DEBUG("connected. Got handle %u\r\n", handle);
+    connectionParams.slaveLatency = 1;
+    if (ble.updateConnectionParams(handle, &connectionParams) != BLE_ERROR_NONE) {
+        DEBUG("failed to update connection paramter\r\n");
+    }
+}
+void GetAccelterData( void );
+void periodicCallback(void)
+{
+//  DEBUG("periodicCallback\n\r");
+//    oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */
+    GetAccelterData();
+    triggerSensorPolling = true;
+
+}
+
+
+void initBLE( void )
+{
+
+    ticker.attach_us(periodicCallback, 10000); //10msecの周期タイマー
+
+    ble.init();
+    DEBUG("Init done\n");
+    ble.onDisconnection(disconnectionCallback);
+    ble.onConnection(onConnectionCallback);
+
+    ble.getPreferredConnectionParams(&connectionParams);
 
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
+    /* setup advertising */
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER);
+    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */     //Advertisingの周期時間 0.625msec単位
+    ble.startAdvertising();
+//    advertisingStateLed = 1;
+    DEBUG("Start Advertising\n");
+
+    ble.addService(htmService);
+
+
+}
+//-------------------------------------
+
+float ox=0;
+float oy=0;
+float oz=0;
+float dx=0;
+float dy=0;
+float dz=0;
+bool f=1;
+float velocity = 0;
+float maxvelocity = 0;
+void GetAccelterData( void )
+{
+//        DEBUG("aaaaa\r\n");
+    float x = acc.getAccX() * 9.8;
+    float y = acc.getAccY() * 9.8;
+    float z = acc.getAccZ() * 9.8;
+
+    if(f==0){
+        dx+=(x-ox);
+        dy+=(y-oy);
+        dz+=(z-oz);
+    }
+    f=0;
+//    float v = sqrt(dx*dx+dy*dy+dz*dz) * 3600/1000/100;
+    float v = abs(dx+dy+dz) * 3600/1000/10/3;
+
+//    pc.printf("X: %7.2f, Y: %7.2f, Z: %7.2f   v:%7.2f\r\n", x-ox, y-oy, z-oz, v);
+//    pc.printf("X: %7.2f, Y: %7.2f, Z: %7.2f   v:%7.2f\r\n", dx, dy, dz, v);
+//    pc.printf("X: %7.2f, Y: %7.2f, Z: %7.2f   v:%7.2f\r\n", x, y, z, v);
+
+    velocity = v;
+    if (maxvelocity < velocity){
+        maxvelocity = velocity;
+    }
+
+//    if(v>1.0f){
+        DEBUG("%7.2f km/h  Max:%7.2f km/h (?)\r\n", v ,maxvelocity);
+//    }
+
+
+    ox=x;
+    oy=y;
+    oz=z;
+}
+void InitAccelterData( void )
+{
+    DEBUG("MMA8451 ID: %d\r\n", acc.getWhoAmI());
+//    Ticker ticker;
+//    ticker2.attach_us(GetAccelterData, 10000); //10000usec = 10msecの周期タイマー
+//    ticker2.attach(GetAccelterData, 1); //10000usec = 10msecの周期タイマー
+}
+void onButton( void )
+{
+    DEBUG("#####\r\n");
+    dx=0;
+    dy=0;
+    dz=0;
+    maxvelocity = 0;
+}
+
+void updateServiceValues(void);
 
 int main(void) {
-    MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);
-    PwmOut rled(LED1);
-    PwmOut gled(LED2);
-    PwmOut bled(LED3);
-    
-    printf("MMA8451 ID: %d\n", acc.getWhoAmI());
+#if NEED_CONSOLE_OUTPUT
+    pc.baud(115200);
+#endif
+    DEBUG("tttttt\r\n");
+ 
+    button.rise(&onButton);
+ 
+    InitAccelterData();
+    initBLE();
 
     while (true) {
-        float x, y, z;
-        x = rled = 1.0 - abs(acc.getAccX());
-        y = gled = 1.0 - abs(acc.getAccY());
-        z = bled = 1.0 - abs(acc.getAccZ());
-        wait(0.1);
-        printf("X: %1.2f, Y: %1.2f, Z: %1.2f\n", x, y, z);
+        if (triggerSensorPolling) {
+            triggerSensorPolling = false;
+            updateServiceValues();
+//            DEBUG("----------\r\n");
+        } else {
+            ble.waitForEvent();
+        }
+
     }
 }
+
+uint32_t quick_ieee11073_from_float(float temperature)
+{
+    uint8_t  exponent = 0xFF; //exponent is -1
+    uint32_t mantissa = (uint32_t)(temperature*10);
+    
+    return ( ((uint32_t)exponent) << 24) | mantissa;
+}
+
+void updateServiceValues(void)
+{
+   
+      uint32_t temp_ieee11073 = quick_ieee11073_from_float(maxvelocity);
+      memcpy(thermTempPayload+1, &temp_ieee11073, 4);
+      ble.updateCharacteristicValue(tempChar.getValueAttribute().getHandle(), thermTempPayload, sizeof(thermTempPayload));  //Mod
+}
+
+
+
+