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

Committer:
tangcan0823
Date:
Fri Oct 21 04:18:17 2016 +0000
Revision:
80:a1cd660e00d1
Parent:
77:7674b63f8aea
memory

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tangcan0823 80:a1cd660e00d1 1 #include "mbed.h"
tangcan0823 80:a1cd660e00d1 2 #include "ble/BLE.h"
tangcan0823 80:a1cd660e00d1 3 #include "ble/services/HeartRateService.h"
tangcan0823 80:a1cd660e00d1 4 #include "ble/services/BatteryService.h"
tangcan0823 80:a1cd660e00d1 5 #include "ble/services/DeviceInformationService.h"
tangcan0823 80:a1cd660e00d1 6 #include "rtos.h"
tangcan0823 80:a1cd660e00d1 7 #include <string.h>
tangcan0823 80:a1cd660e00d1 8 #include "SDFileSystem.h"
tangcan0823 80:a1cd660e00d1 9
tangcan0823 80:a1cd660e00d1 10 Semaphore one_slot(1);
tangcan0823 80:a1cd660e00d1 11
tangcan0823 80:a1cd660e00d1 12 SDFileSystem sd(p25, p28, p29, p21, "sd");
tangcan0823 80:a1cd660e00d1 13 BLE ble;
tangcan0823 80:a1cd660e00d1 14 int address[10][12]={};
tangcan0823 80:a1cd660e00d1 15 const GapScanningParams scanningParams;
tangcan0823 80:a1cd660e00d1 16
tangcan0823 80:a1cd660e00d1 17
tangcan0823 80:a1cd660e00d1 18 int counter= 0;
tangcan0823 80:a1cd660e00d1 19 void onScanCallback(const Gap::AdvertisementCallbackParams_t *params)
tangcan0823 80:a1cd660e00d1 20 {
tangcan0823 80:a1cd660e00d1 21 time_t seconds = time(NULL); // JST
tangcan0823 80:a1cd660e00d1 22 struct tm *t = localtime(&seconds);
tangcan0823 80:a1cd660e00d1 23 /*printf("%04d/%02d/%02d %02d:%02d:%02d\r\n",
tangcan0823 80:a1cd660e00d1 24 t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
tangcan0823 80:a1cd660e00d1 25 */
tangcan0823 80:a1cd660e00d1 26
tangcan0823 80:a1cd660e00d1 27 int i=0,a=0,b=0,flag=0;
tangcan0823 80:a1cd660e00d1 28 for(i=0;i<10;i++){
tangcan0823 80:a1cd660e00d1 29 if(address[i][0]==params->peerAddr[5]){
tangcan0823 80:a1cd660e00d1 30 flag=1;
tangcan0823 80:a1cd660e00d1 31 break;
tangcan0823 80:a1cd660e00d1 32 }
tangcan0823 80:a1cd660e00d1 33 }
tangcan0823 80:a1cd660e00d1 34 if(flag==0){
tangcan0823 80:a1cd660e00d1 35 for(i=0; i<6; i++){
tangcan0823 80:a1cd660e00d1 36 address[counter][i]=params->peerAddr[5-i];
tangcan0823 80:a1cd660e00d1 37 }
tangcan0823 80:a1cd660e00d1 38 time_t seconds = time(NULL);
tangcan0823 80:a1cd660e00d1 39 struct tm *t = localtime(&seconds);
tangcan0823 80:a1cd660e00d1 40 address[counter][6]=t->tm_year;
tangcan0823 80:a1cd660e00d1 41 address[counter][7]=t->tm_mon;
tangcan0823 80:a1cd660e00d1 42 address[counter][8]= t->tm_mday;
tangcan0823 80:a1cd660e00d1 43 address[counter][9]= t->tm_hour;
tangcan0823 80:a1cd660e00d1 44 address[counter][10]= t->tm_min;
tangcan0823 80:a1cd660e00d1 45 address[counter][11]= t->tm_sec;
tangcan0823 80:a1cd660e00d1 46
tangcan0823 80:a1cd660e00d1 47 counter++;
tangcan0823 80:a1cd660e00d1 48 for(a=0; a<counter; a++){
tangcan0823 80:a1cd660e00d1 49 for(b=0; b<12 ; b++){
tangcan0823 80:a1cd660e00d1 50 FILE *fp = fopen("/sd/mydata/sdtest.txt", "w");
tangcan0823 80:a1cd660e00d1 51 if(fp == NULL) {
tangcan0823 80:a1cd660e00d1 52 error("Could not open file for write\n");
tangcan0823 80:a1cd660e00d1 53 }
tangcan0823 80:a1cd660e00d1 54 if(b==0){printf("DEV:");
tangcan0823 80:a1cd660e00d1 55 fprintf(fp,"DEV:");}
tangcan0823 80:a1cd660e00d1 56 if(b<6){printf("%02x ", address[a][b]);
tangcan0823 80:a1cd660e00d1 57 fprintf(fp,"%02x ", address[a][b]);}
tangcan0823 80:a1cd660e00d1 58 else if(b>5){printf("%02d:",address[a][b]);
tangcan0823 80:a1cd660e00d1 59 fprintf(fp,"%02d:",address[a][b]);}
tangcan0823 80:a1cd660e00d1 60 if(b==11){
tangcan0823 80:a1cd660e00d1 61 printf("\r\n");
tangcan0823 80:a1cd660e00d1 62 fprintf(fp,"\r\n");
tangcan0823 80:a1cd660e00d1 63 fclose(fp);
tangcan0823 80:a1cd660e00d1 64
tangcan0823 80:a1cd660e00d1 65 }
tangcan0823 80:a1cd660e00d1 66 }
tangcan0823 80:a1cd660e00d1 67
tangcan0823 80:a1cd660e00d1 68 if(a==counter-1)printf("----------\n\r");
tangcan0823 80:a1cd660e00d1 69 }
tangcan0823 80:a1cd660e00d1 70 }
tangcan0823 80:a1cd660e00d1 71
ktownsend 0:7613d21e5974 72
tangcan0823 80:a1cd660e00d1 73 /* for(int i=0; i<6; i++){
tangcan0823 80:a1cd660e00d1 74 address[0][i]=params->peerAddr[5-i];
tangcan0823 80:a1cd660e00d1 75 }
tangcan0823 80:a1cd660e00d1 76 for(int b=0; b<6 ; b++){
tangcan0823 80:a1cd660e00d1 77 if(b==0)printf("DEV:");
tangcan0823 80:a1cd660e00d1 78 printf("%02x ", address[0][b]);
tangcan0823 80:a1cd660e00d1 79 if(b==5)printf("\n\r");
tangcan0823 80:a1cd660e00d1 80 }*/
tangcan0823 80:a1cd660e00d1 81 }
tangcan0823 80:a1cd660e00d1 82
tangcan0823 80:a1cd660e00d1 83
tangcan0823 80:a1cd660e00d1 84 void test_thread(void const *name) {
tangcan0823 80:a1cd660e00d1 85
tangcan0823 80:a1cd660e00d1 86
tangcan0823 80:a1cd660e00d1 87 while (true) {
tangcan0823 80:a1cd660e00d1 88 Timer timer;
tangcan0823 80:a1cd660e00d1 89 one_slot.wait();
tangcan0823 80:a1cd660e00d1 90 printf("%s\n\r", (const char*)name);
tangcan0823 80:a1cd660e00d1 91 //1
tangcan0823 80:a1cd660e00d1 92 if(!strcmp((const char*)name, "1")){
tangcan0823 80:a1cd660e00d1 93 printf("**this is 1**\n\r");
tangcan0823 80:a1cd660e00d1 94 ble.gap().stopAdvertising();
tangcan0823 80:a1cd660e00d1 95 ble.startScan(&onScanCallback);
tangcan0823 80:a1cd660e00d1 96
tangcan0823 80:a1cd660e00d1 97 }
mbedAustin 56:56bc0cab3916 98
tangcan0823 80:a1cd660e00d1 99 //2
tangcan0823 80:a1cd660e00d1 100 if(!strcmp((const char*)name, "2")){
tangcan0823 80:a1cd660e00d1 101 printf("**this is 2**\n\r");
tangcan0823 80:a1cd660e00d1 102 timer.start();
tangcan0823 80:a1cd660e00d1 103 while(1){
tangcan0823 80:a1cd660e00d1 104 ble.waitForEvent();
tangcan0823 80:a1cd660e00d1 105 if(timer.read() > 9){
tangcan0823 80:a1cd660e00d1 106 timer.stop();
tangcan0823 80:a1cd660e00d1 107 timer.reset();
tangcan0823 80:a1cd660e00d1 108 ble.stopScan();
tangcan0823 80:a1cd660e00d1 109 break;
tangcan0823 80:a1cd660e00d1 110 }
tangcan0823 80:a1cd660e00d1 111 }
tangcan0823 80:a1cd660e00d1 112 }
tangcan0823 80:a1cd660e00d1 113 //3
tangcan0823 80:a1cd660e00d1 114 if(!strcmp((const char*)name, "3")){
tangcan0823 80:a1cd660e00d1 115 printf("**this is 3**\n\r");
tangcan0823 80:a1cd660e00d1 116 ble.gap().startAdvertising();
tangcan0823 80:a1cd660e00d1 117
tangcan0823 80:a1cd660e00d1 118 }
tangcan0823 80:a1cd660e00d1 119
mbedAustin 53:f9ec2c7a47f5 120
tangcan0823 80:a1cd660e00d1 121 Thread::wait(10000);
tangcan0823 80:a1cd660e00d1 122 one_slot.release();
tangcan0823 80:a1cd660e00d1 123 }
tangcan0823 80:a1cd660e00d1 124 }
tangcan0823 80:a1cd660e00d1 125
tangcan0823 80:a1cd660e00d1 126 // const static char DEVICE_NAME[] = "BLE1";
tangcan0823 80:a1cd660e00d1 127
tangcan0823 80:a1cd660e00d1 128 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
tangcan0823 80:a1cd660e00d1 129 {
tangcan0823 80:a1cd660e00d1 130 BLE &ble = params->ble;
tangcan0823 80:a1cd660e00d1 131 ble_error_t error = params->error;
tangcan0823 80:a1cd660e00d1 132
tangcan0823 80:a1cd660e00d1 133 if (error != BLE_ERROR_NONE) {
tangcan0823 80:a1cd660e00d1 134 return;
tangcan0823 80:a1cd660e00d1 135 }
tangcan0823 80:a1cd660e00d1 136 const uint8_t address1[] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
tangcan0823 80:a1cd660e00d1 137 ble.gap().setAddress(BLEProtocol::AddressType::PUBLIC, address1);
tangcan0823 80:a1cd660e00d1 138 // ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
tangcan0823 80:a1cd660e00d1 139 // ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
tangcan0823 80:a1cd660e00d1 140 // ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
tangcan0823 80:a1cd660e00d1 141 }
tangcan0823 80:a1cd660e00d1 142
tangcan0823 80:a1cd660e00d1 143 int main (void) {
tangcan0823 80:a1cd660e00d1 144
tangcan0823 80:a1cd660e00d1 145 mkdir("/sd/mydata", 0777);
rgrover1 74:7754bf460f52 146
tangcan0823 80:a1cd660e00d1 147 //ble.init();
tangcan0823 80:a1cd660e00d1 148 ble.init(bleInitComplete);
tangcan0823 80:a1cd660e00d1 149 ble.setScanParams(GapScanningParams::SCAN_INTERVAL_MAX,
tangcan0823 80:a1cd660e00d1 150 GapScanningParams::SCAN_WINDOW_MAX, 0);
tangcan0823 80:a1cd660e00d1 151
tangcan0823 80:a1cd660e00d1 152
mbedAustin 53:f9ec2c7a47f5 153
tangcan0823 80:a1cd660e00d1 154
tangcan0823 80:a1cd660e00d1 155 Thread t2(test_thread, (void *)"2");
tangcan0823 80:a1cd660e00d1 156 Thread t3(test_thread, (void *)"3");
rgrover1 74:7754bf460f52 157
tangcan0823 80:a1cd660e00d1 158 test_thread((void *)"1");
ktownsend 0:7613d21e5974 159
tangcan0823 80:a1cd660e00d1 160 }