workss

Dependencies:   mbed BLE_API nRF51822 VL53L0X

Revision:
44:cd485a9baca0
Parent:
43:037b59837599
Child:
45:9dcbd770898e
--- a/main.cpp	Mon Mar 18 22:18:16 2019 +0000
+++ b/main.cpp	Tue Mar 19 00:19:42 2019 +0000
@@ -38,7 +38,8 @@
 uint32_t distance1, distance2;
 int dist1, dist2, status1, status2;
 int packet_queue[4000] = {0};
-int packet_queue_index = 0;
+int packet_queue_index = 2;
+int current_index = 0, send_count = 0, triple_send_count = 0;
 
 const static int cw = 20 / TIME_SCALE;
 const static int time_cycle = TIMESTAMP_FREQ / TIME_SCALE;
@@ -47,7 +48,8 @@
 bool countdown1_triggered = false, countdown2_triggered = false;
 bool step_in = false, step_out = false;
 bool range1_just_triggered = false, range2_just_triggered = false;
-bool master_connected = false;
+bool master_connected = false, connection_triggered = false;
+bool first_loop_run = true, enter_send_loop = true;
  
 const static char     DEVICE_NAME[]        = "OCCUPY-CRICHTON-ST"; 
 static const uint16_t uuid16_list[]        = {GattService::UUID_HEART_RATE_SERVICE};
@@ -122,7 +124,6 @@
             count--;
         }
      }
-    
 }
 
 void create_packets(int encoding[], double& packet1, double& packet2) {
@@ -135,35 +136,55 @@
     packet2 = bin_to_dec(binary2);
 }
 
-void send_packet(int direction, int time) {     
+void send_packet() {     
+    hrmCounter = packet_queue[current_index];
+    hrService->updateHeartRate(hrmCounter);
+    printf("sent packet %i\n", hrmCounter);
+    ::current_index++;
+}
+
+void enqueue_packet(int direction, int time, int packet_queue[]) {  
     int encoding [16] = {0};
     encode_bin(direction, time, encoding);
     double packet1, packet2;
     create_packets(encoding, packet1, packet2);
     int p1 = (int)packet1;
     int p2 = (int)packet2;
+   
+    packet_queue[packet_queue_index] = p1;
+    packet_queue[packet_queue_index + 1] = p2;
     
-    hrmCounter = p1;
-    hrService->updateHeartRate(hrmCounter);
-    printf("sent packet %i\n", hrmCounter);
-    wait(0.5);
-    hrmCounter = p2;
-    hrService->updateHeartRate(hrmCounter);
-    printf("sent packet %i\n", hrmCounter);
-    wait(0.5);
+    printf("enqueued packet %i\n",  packet_queue[packet_queue_index]);
+    printf("enqueued packet %i\n",  packet_queue[packet_queue_index+1]);
+    
+    ::packet_queue_index += 2;
+    if (packet_queue_index == 4) {
+        ::packet_queue_index = 8;
+    }
 }
 
-void enqueue_packet(int direction, int time, int packet_queue[]) {     
-    packet_queue[packet_queue_index] = direction;
-    packet_queue[packet_queue_index + 1] = time;
+void sudo_enqueue_packet(int direction, int time, int packet_queue[]) {  
+    int encoding [16] = {0};
+    encode_bin(direction, time, encoding);
+    double packet1, packet2;
+    create_packets(encoding, packet1, packet2);
+    int p1 = (int)packet1;
+    int p2 = (int)packet2;
+   
+    packet_queue[0] = p1;
+    packet_queue[1] = p2;
     
-    ::packet_queue_index += 2;
+    printf("sudo enqueued packet %i\n",  packet_queue[0]);
+    printf("sudo enqueued packet %i\n",  packet_queue[1]);
 }
 
 void connectionCallback(const Gap::ConnectionCallbackParams_t *) {
     printf("Bluetooth connected at %i\n", current_time);
     ::master_connected = true;
+    ::connection_triggered = false;
+    sudo_enqueue_packet(-1, current_time, packet_queue);
     BLE::Instance(BLE::DEFAULT_INSTANCE).gap().stopAdvertising();
+    wait(5);
 }
  
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
@@ -171,6 +192,10 @@
     printf("Bluetooth disconnected at %i\n", current_time);
     ::master_connected = false;
     ::timestamp = time_cycle;
+    ::current_index = 0;
+    ::packet_queue_index = 2;
+    ::send_count = 0;
+    ::triple_send_count = 0;
     BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
 }
  
@@ -201,20 +226,18 @@
     ::timestamp++;
     ::current_time = timestamp / time_cycle;
     
-    if (packet_queue_index != 0 && master_connected) {
-        led = 0;
-        wait(5);
-        led = 1;
-        
-        send_packet(-1, current_time);
+    if (send_count % 3 == 0) {
+        if (enter_send_loop && connection_triggered && (current_index < packet_queue_index) && master_connected) {
+            send_packet();
+        }
+        ::triple_send_count++;
+    }
+    ::send_count++;
     
-        int current_index = 0;
-        while (current_index < packet_queue_index) {
-            send_packet(packet_queue[current_index], packet_queue[current_index+1]);
-            printf("sent direction %i and time %i\n", packet_queue[current_index], packet_queue[current_index+1]);
-            current_index += 2;
-        }
-        ::packet_queue_index = 0;
+    if ((triple_send_count / 4) % 3 == 0) {
+        ::enter_send_loop = true;
+    } else { 
+        ::enter_send_loop = false;
     }
     
     if (countdown1_triggered) {
@@ -238,19 +261,18 @@
     
     if (status1 == VL53L0X_ERROR_NONE) {
         if (dist1 > DIST_MIN && dist1 < DIST_MAX) {
+            ::connection_triggered = true;
             led1 = 0;
-//            printf("Range1 [mm]:            %6ld\r\n", dist1);
+            printf("Range1 [mm]:            %6ld\r\n", dist1);
             if (!countdown1_triggered && !countdown2_triggered) {
                 countdown1_triggered = true;
                 countdown = cw;
             } else if (countdown2_triggered && !range1_just_triggered) {
-//                printf("STEP IN DETECTED\n");
+                printf("STEP IN DETECTED\n");
                 if (master_connected) {
-                    send_packet(1, 0);
+                    enqueue_packet(1, 0, packet_queue);
                 } else {
                     enqueue_packet(1, current_time, packet_queue);
-                    printf("enqueued direction %i\n",  packet_queue[packet_queue_index-2]);
-                    printf("enqueued time %i\n",  packet_queue[packet_queue_index-1]);
                 }
                 countdown2_triggered = false;
             }
@@ -266,19 +288,18 @@
     }
     if (status2 == VL53L0X_ERROR_NONE) {
         if (dist2 > DIST_MIN && dist2 < DIST_MAX) {
+            ::connection_triggered = true;
             led2 = 0;
-//            printf("Range2 [mm]:            %6ld\r\n", dist2);
+            printf("Range2 [mm]:            %6ld\r\n", dist2);
             if (!countdown1_triggered && !countdown2_triggered) {
                 countdown2_triggered = true;
                 countdown = cw;
             } else if (countdown1_triggered && !range2_just_triggered) {
-//                printf("STEP OUT DETECTED\n");
+                printf("STEP OUT DETECTED\n");
                 if (master_connected) {
-                    send_packet(0, 0);
+                    enqueue_packet(0, 0, packet_queue);
                 } else {
                     enqueue_packet(0, current_time, packet_queue);
-                    printf("enqueued direction %i\n",  packet_queue[packet_queue_index-2]);
-                    printf("enqueued time %i\n",  packet_queue[packet_queue_index-1]);
                 }
                 countdown1_triggered = false;
             }
@@ -300,6 +321,11 @@
     range1.init_sensor(range1_addr);
     range2.init_sensor(range2_addr);
     
+    packet_queue[4] = 1;
+    packet_queue[5] = 1;
+    packet_queue[6] = 1;
+    packet_queue[7] = 1;
+    
     BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
     ble.init(bleInitComplete);