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
main.cpp@80:a1cd660e00d1, 2016-10-21 (annotated)
- Committer:
- tangcan0823
- Date:
- Fri Oct 21 04:18:17 2016 +0000
- Revision:
- 80:a1cd660e00d1
- Parent:
- 77:7674b63f8aea
memory
Who changed what in which revision?
User | Revision | Line number | New 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 | } |