workss

Dependencies:   mbed BLE_API nRF51822 VL53L0X

Revision:
35:daf134714cee
Parent:
34:1d3818f8c1a1
Child:
36:fb7f31e53ed9
--- a/main.cpp	Thu Mar 14 14:19:14 2019 +0000
+++ b/main.cpp	Thu Mar 14 19:42:18 2019 +0000
@@ -1,3 +1,5 @@
+#include <stdio.h>
+#include <math.h>
 #include "mbed.h"
 #include "ble/BLE.h"
 #include "VL53L0X.h"
@@ -9,9 +11,13 @@
 #define range2_XSHUT        p16
 #define VL53L0_I2C_SDA      p30 
 #define VL53L0_I2C_SCL      p7  
-#define TIME_SCALE          3 // sensors activated every 100ms * TIME_SCALE
+#define TIME_SCALE          3 // sensors activated every 100ms * TIME_SCALE = 0.3 seconds
 #define DIST_MIN            0
 #define DIST_MAX            22
+//#define TIMESTAMP_FREQ      3000 // PROD: time granularity is 100ms * TIMESTAMP_FREQ = 5 minutes
+#define TIMESTAMP_FREQ      300 // DEV: time granularity is 100ms * TIMESTAMP_FREQ = 30 seconds
+//#define MAX_TIME            1728000 // PROD: keep track of 100ms * MAX_TIME = 2880 minutes = 2 days
+#define MAX_TIME            172800 // DEV: keep track of 100ms * MAX_TIME = 288 minutes = 4.8 hours
  
 Serial pc(USBTX, USBRX);
 static DevI2C devI2c(VL53L0_I2C_SDA, VL53L0_I2C_SCL); 
@@ -29,8 +35,11 @@
  
 uint32_t distance1, distance2;
 int dist1, dist2, status1, status2;
+int timestamp = 0, current_time = 0;
 
 const static int cw = 20 / TIME_SCALE;
+const static int time_cycle = TIMESTAMP_FREQ / TIME_SCALE;
+const static int maximum_time = MAX_TIME / TIMESTAMP_FREQ;
 int countdown = cw;
 bool countdown1_triggered = false, countdown2_triggered = false;
 bool step_in = false, step_out = false;
@@ -38,17 +47,18 @@
  
 const static char     DEVICE_NAME[]        = "OCCUPY-CRICHTON-ST"; 
 static const uint16_t uuid16_list[]        = {GattService::UUID_HEART_RATE_SERVICE};
+int * encoded_array;
  
 HeartRateService         *hrService;
 uint8_t hrmCounter = 0; 
  
 void connectionCallback(const Gap::ConnectionCallbackParams_t *) {
-    printf("Bluetooth connected\n");
+    printf("Bluetooth connected at %i\n", current_time);
 }
  
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
 {
-    printf("Bluetooth disconnected\n");
+    printf("Bluetooth disconnected at %i\n", current_time);
     BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
 }
  
@@ -85,9 +95,83 @@
  
    return result; 
 }
+
+void dec_to_bin(int decimal, int bin[]) {
+    int temp;
+    // encoding little-endian
+    for (int i = 10; i >= 0; i--) {
+        temp = decimal >> i;
+        bin[i] = temp&1;
+    }
+}
+
+int bin_to_dec(int binary) {
+    int rem, temp, dec = 0, b = 1;
+    temp = binary;
+    while (temp > 0)
+    {
+        rem = temp % 10;
+        dec = dec + rem * b;
+        b *= 2;
+        temp /= 10;
+    }
+//    printf("The decimal equivalent of %i is %i", num, dec);
+    return dec;
+}
+
+void encode_bin(int direction, int time, int encoding[]) {
+    time = time % maximum_time;
+    int bin[11] = {0};
+    dec_to_bin(time, bin); 
+    
+    // for checking transmission errors:
+    // sending as 2 messages; designating them with 0 (1st part) and 1`(2nd part)
+    encoding [8] = 1;
+    encoding [0] = 0;
+
+    // used to send the current time when Bluetooth connection established
+    if (direction == -1) {
+        encoding[15] = 1;
+        encoding[7] = 1;
+        
+    } else {
+        encoding[15] = 0;
+        encoding[7] = 0;
+        
+        // to distinguish whether movement was IN (1) or OUT (0)
+        if (direction == 1) {
+            encoding[1] = 1;
+        } else {
+            encoding[1] = 0;
+        }
+    }
+    
+    int count = 10;
+    for (int i = 14; i >= 2; i--) {
+        if (i == 8 || i == 7) { }
+        else {
+            encoding[i] = bin[count];
+            count--;
+        }
+    }
+}
+
+void create_packets(int encoding[], double& packet1, double& packet2) {
+    double binary1 = 0, binary2 = 0;
+    for (int i = 0; i < 8; i++) {
+        binary1 += encoding[i] * pow(10, (double)i);
+        binary2 += encoding[8+i] * pow(10, (double)i);
+    }
+    packet1 = bin_to_dec(binary1);
+    packet2 = bin_to_dec(binary2);
+}
  
 void wakeup_event_cb() {
+         
+    int encoding [16] = {0};
     led != led;
+    timestamp++;
+    ::current_time = timestamp / time_cycle;
     
     if (countdown1_triggered) {
         countdown--;
@@ -109,7 +193,7 @@
     dist2 = format_dist(distance2);
     
     if (status1 == VL53L0X_ERROR_NONE) {
-        printf("Range1 [mm]:            %6ld\r\n", dist1);
+//        printf("Range1 [mm]:            %6ld\r\n", dist1);
         if (dist1 > DIST_MIN && dist1 < DIST_MAX) {
             led1 = 0;
             
@@ -135,7 +219,7 @@
         range2_just_triggered = false;
     }
     if (status2 == VL53L0X_ERROR_NONE) {
-        printf("Range2 [mm]:            %6ld\r\n", dist2);
+//        printf("Range2 [mm]:            %6ld\r\n", dist2);
         if (dist2 > DIST_MIN && dist2 < DIST_MAX) {
             led2 = 0;