Beacon demo for the BLE API using the nRF51822 native mode drivers

Dependencies:   BLE_API SDFileSystem mbed-rtos mbed nRF51822 X_NUCLEO_IDB0XA1

Fork of BLE_iBeacon by Bluetooth Low Energy

Revision:
80:a1cd660e00d1
Parent:
77:7674b63f8aea
--- a/main.cpp	Tue Sep 20 12:41:28 2016 +0100
+++ b/main.cpp	Fri Oct 21 04:18:17 2016 +0000
@@ -1,61 +1,160 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+#include "mbed.h" 
+#include "ble/BLE.h" 
+#include "ble/services/HeartRateService.h" 
+#include "ble/services/BatteryService.h" 
+#include "ble/services/DeviceInformationService.h" 
+#include "rtos.h" 
+#include <string.h> 
+#include "SDFileSystem.h"
+
+Semaphore one_slot(1); 
+
+SDFileSystem sd(p25, p28, p29, p21, "sd");
+BLE ble; 
+int address[10][12]={}; 
+const GapScanningParams scanningParams; 
+
+
+int counter= 0; 
+void onScanCallback(const Gap::AdvertisementCallbackParams_t *params) 
+{ 
+time_t seconds = time(NULL); // JST 
+struct tm *t = localtime(&seconds); 
+/*printf("%04d/%02d/%02d %02d:%02d:%02d\r\n", 
+t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); 
+*/ 
+
+int i=0,a=0,b=0,flag=0; 
+for(i=0;i<10;i++){ 
+if(address[i][0]==params->peerAddr[5]){ 
+flag=1; 
+break; 
+} 
+} 
+if(flag==0){ 
+for(i=0; i<6; i++){ 
+address[counter][i]=params->peerAddr[5-i]; 
+} 
+time_t seconds = time(NULL); 
+struct tm *t = localtime(&seconds); 
+address[counter][6]=t->tm_year; 
+address[counter][7]=t->tm_mon; 
+address[counter][8]= t->tm_mday; 
+address[counter][9]= t->tm_hour; 
+address[counter][10]= t->tm_min; 
+address[counter][11]= t->tm_sec; 
+
+counter++; 
+for(a=0; a<counter; a++){ 
+for(b=0; b<12 ; b++){ 
+    FILE *fp = fopen("/sd/mydata/sdtest.txt", "w");
+    if(fp == NULL) {
+        error("Could not open file for write\n");
+    }
+if(b==0){printf("DEV:"); 
+fprintf(fp,"DEV:");} 
+if(b<6){printf("%02x ", address[a][b]); 
+fprintf(fp,"%02x ", address[a][b]);} 
+else if(b>5){printf("%02d:",address[a][b]); 
+fprintf(fp,"%02d:",address[a][b]);} 
+if(b==11){ 
+printf("\r\n"); 
+fprintf(fp,"\r\n"); 
+ fclose(fp); 
+
+} 
+} 
+
+if(a==counter-1)printf("----------\n\r"); 
+} 
+} 
+
 
-#include "mbed.h"
-#include "ble/services/iBeacon.h"
+/* for(int i=0; i<6; i++){ 
+address[0][i]=params->peerAddr[5-i]; 
+} 
+for(int b=0; b<6 ; b++){ 
+if(b==0)printf("DEV:"); 
+printf("%02x ", address[0][b]); 
+if(b==5)printf("\n\r"); 
+}*/ 
+} 
+
+
+void test_thread(void const *name) { 
+
+
+while (true) { 
+Timer timer; 
+one_slot.wait(); 
+printf("%s\n\r", (const char*)name); 
+//1 
+if(!strcmp((const char*)name, "1")){ 
+printf("**this is 1**\n\r"); 
+ble.gap().stopAdvertising(); 
+ble.startScan(&onScanCallback); 
+
+} 
 
-BLE ble;
-    
-void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
-{
-    BLE &ble          = params->ble;
-    ble_error_t error = params->error;
+//2 
+if(!strcmp((const char*)name, "2")){ 
+printf("**this is 2**\n\r"); 
+timer.start(); 
+while(1){ 
+ble.waitForEvent(); 
+if(timer.read() > 9){ 
+timer.stop(); 
+timer.reset(); 
+ble.stopScan(); 
+break; 
+} 
+} 
+} 
+//3 
+if(!strcmp((const char*)name, "3")){ 
+printf("**this is 3**\n\r"); 
+ble.gap().startAdvertising(); 
+
+} 
+
 
-    if (error != BLE_ERROR_NONE) {
-        return;
-    }
+Thread::wait(10000); 
+one_slot.release(); 
+} 
+} 
+
+// const static char DEVICE_NAME[] = "BLE1";
+
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) 
+{ 
+BLE &ble = params->ble; 
+ble_error_t error = params->error; 
+
+if (error != BLE_ERROR_NONE) { 
+return; 
+} 
+const uint8_t address1[] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA}; 
+ble.gap().setAddress(BLEProtocol::AddressType::PUBLIC, address1); 
+// ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); 
+// ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); 
+// ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ 
+} 
+
+int main (void) { 
+
+mkdir("/sd/mydata", 0777);
     
-    /**
-     * The Beacon payload has the following composition:
-     * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
-     * Major/Minor  = 0x1122 / 0x3344
-     * Tx Power     = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
-     *
-     * Note: please remember to calibrate your beacons TX Power for more accurate results.
-     */
-    const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
-                            0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
-    uint16_t majorNumber = 1122;
-    uint16_t minorNumber = 3344;
-    uint16_t txPower     = 0xC8;
-    iBeacon *ibeacon = new iBeacon(ble, uuid, majorNumber, minorNumber, txPower);
+//ble.init(); 
+ble.init(bleInitComplete); 
+ble.setScanParams(GapScanningParams::SCAN_INTERVAL_MAX, 
+GapScanningParams::SCAN_WINDOW_MAX, 0); 
+
+
 
-    ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
-    ble.gap().startAdvertising();
-}
+
+Thread t2(test_thread, (void *)"2"); 
+Thread t3(test_thread, (void *)"3"); 
 
-int main(void)
-{
-    ble.init(bleInitComplete);
-    
-    /* SpinWait for initialization to complete. This is necessary because the
-     * BLE object is used in the main loop below. */
-    while (!ble.hasInitialized()) { /* spin loop */ }
+test_thread((void *)"1"); 
 
-    while (true) {
-        ble.waitForEvent(); // allows or low power operation
-    }
-}
+}
\ No newline at end of file