a

Dependencies:   BLE_API SDFileSystem mbed-rtos mbed nRF51822

Fork of SSmbed_BLE by shunpei kataoka

Committer:
nakamae
Date:
Sat Nov 26 11:57:13 2016 +0000
Revision:
6:65a18fb360c1
Parent:
5:f8734ee36ec9
DEMO PBLB 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kataokashunpei 0:1ad445491c35 1 #include "mbed.h"
kataokashunpei 0:1ad445491c35 2 #include "ble/BLE.h"
kataokashunpei 0:1ad445491c35 3 #include "ble/services/HeartRateService.h"
kataokashunpei 0:1ad445491c35 4 #include "ble/services/BatteryService.h"
kataokashunpei 0:1ad445491c35 5 #include "ble/services/DeviceInformationService.h"
kataokashunpei 0:1ad445491c35 6 #include "rtos.h"
kataokashunpei 0:1ad445491c35 7 #include <string.h>
kataokashunpei 0:1ad445491c35 8 #include "SDFileSystem.h"
kataokashunpei 4:c1ac302982b7 9 #define N 100//addressを保存する個数
nakamae 6:65a18fb360c1 10 #define M 6//addressとtimeを入れる
kataokashunpei 1:fa329dd713be 11 #define GET_TIME 10000
kataokashunpei 1:fa329dd713be 12 #define SEND_TIME 20000
kataokashunpei 1:fa329dd713be 13 #define AA 0xAA
kataokashunpei 2:592364ca5fb2 14 #define BB 0xBB
kataokashunpei 5:f8734ee36ec9 15 #define CC 0xCC
kataokashunpei 5:f8734ee36ec9 16 #define DD 0xDD
kataokashunpei 5:f8734ee36ec9 17
kataokashunpei 2:592364ca5fb2 18 DigitalOut myled3(LED3);
kataokashunpei 1:fa329dd713be 19
kataokashunpei 0:1ad445491c35 20 Semaphore one_slot(1);
kataokashunpei 0:1ad445491c35 21
kataokashunpei 5:f8734ee36ec9 22 Timer timer;
kataokashunpei 0:1ad445491c35 23 BLE ble;
kataokashunpei 4:c1ac302982b7 24 char address[N][M]={};//保存する配列を初期化
kataokashunpei 0:1ad445491c35 25 const GapScanningParams scanningParams;
kataokashunpei 0:1ad445491c35 26 int wt;//threadの時間
kataokashunpei 1:fa329dd713be 27 int wt1=0;//central mode の時間
kataokashunpei 3:8fcc0e904fd6 28 int ran;
kataokashunpei 5:f8734ee36ec9 29
kataokashunpei 0:1ad445491c35 30 SDFileSystem sd(p25, p28, p29, p21, "sd"); // the pinout on the mbed Cool Components workshop board
kataokashunpei 0:1ad445491c35 31 FILE *fp;
kataokashunpei 0:1ad445491c35 32 int counter=0,i,b,flag;
kataokashunpei 5:f8734ee36ec9 33
kataokashunpei 0:1ad445491c35 34 void onScanCallback(const Gap::AdvertisementCallbackParams_t *params){
nakamae 6:65a18fb360c1 35
nakamae 6:65a18fb360c1 36 flag=0;//重複確認のためのフラグ
kataokashunpei 0:1ad445491c35 37 for(i=0;i<counter;i++){
kataokashunpei 0:1ad445491c35 38 if(address[i][0] == params->peerAddr[0]){
kataokashunpei 0:1ad445491c35 39 flag=1;
kataokashunpei 0:1ad445491c35 40 break;
kataokashunpei 0:1ad445491c35 41 }
kataokashunpei 0:1ad445491c35 42 }
kataokashunpei 0:1ad445491c35 43
kataokashunpei 0:1ad445491c35 44 if(flag==0){
kataokashunpei 0:1ad445491c35 45 for(i=0; i<6; i++){
kataokashunpei 0:1ad445491c35 46 address[counter][i]=params->peerAddr[i];
kataokashunpei 0:1ad445491c35 47 }
kataokashunpei 0:1ad445491c35 48 time_t seconds = time(NULL);
nakamae 6:65a18fb360c1 49
nakamae 6:65a18fb360c1 50
nakamae 6:65a18fb360c1 51 char buff[10]={};
nakamae 6:65a18fb360c1 52 sprintf(buff, "%d", seconds);
nakamae 6:65a18fb360c1 53 strcat(address[counter],buff);
nakamae 6:65a18fb360c1 54
kataokashunpei 1:fa329dd713be 55 for(b=0; b<6 ; b++){
nakamae 6:65a18fb360c1 56 fprintf(fp,"%02x", address[counter][b]);
nakamae 6:65a18fb360c1 57 printf("%02x", address[counter][b]);
nakamae 6:65a18fb360c1 58 }
nakamae 6:65a18fb360c1 59 fprintf(fp, ",%d\r\n",seconds);
nakamae 6:65a18fb360c1 60 printf(" %d\r\n",seconds);
nakamae 6:65a18fb360c1 61 counter++;
nakamae 6:65a18fb360c1 62
nakamae 6:65a18fb360c1 63 /* printf("DEV:");
kataokashunpei 0:1ad445491c35 64 for(b=0; b<6 ; b++)printf("%02x ", address[counter][b]);
nakamae 6:65a18fb360c1 65 printf("%04d/%02d/%02d %02d:%02d:%02d \r\n",address[counter][6],address[counter][7],address[counter][8],address[counter][9],address[counter][10],address[counter][11]);*/
nakamae 6:65a18fb360c1 66
kataokashunpei 5:f8734ee36ec9 67
kataokashunpei 0:1ad445491c35 68 /*配列の中身をすべて表示
kataokashunpei 0:1ad445491c35 69 for(a=0; a<counter; a++){
kataokashunpei 0:1ad445491c35 70 for(b=0; b<6 ; b++){
kataokashunpei 0:1ad445491c35 71 if(b==0)printf("DEV:");
kataokashunpei 0:1ad445491c35 72 printf("%02x ", address[a][b]);
kataokashunpei 0:1ad445491c35 73 if(b==5){
kataokashunpei 0:1ad445491c35 74 printf("%04d/%02d/%02d %02d:%02d:%02d \r\n",address[a][6],address[a][7],address[a][8],address[a][9],address[a][10],address[a][11]);
kataokashunpei 0:1ad445491c35 75 }
kataokashunpei 0:1ad445491c35 76 }
kataokashunpei 0:1ad445491c35 77 if(a==counter-1)printf("----------\n\r");
kataokashunpei 0:1ad445491c35 78 }
kataokashunpei 0:1ad445491c35 79 */
kataokashunpei 0:1ad445491c35 80 }
kataokashunpei 0:1ad445491c35 81 }
kataokashunpei 5:f8734ee36ec9 82
kataokashunpei 0:1ad445491c35 83 void test_thread(void const *name) {
kataokashunpei 0:1ad445491c35 84
kataokashunpei 0:1ad445491c35 85 while (true) {
kataokashunpei 2:592364ca5fb2 86 //Timer timer;
kataokashunpei 0:1ad445491c35 87 one_slot.wait();
kataokashunpei 0:1ad445491c35 88
kataokashunpei 0:1ad445491c35 89 if(!strcmp((const char*)name, "1")){
kataokashunpei 4:c1ac302982b7 90 //printf("**startAdvertising thread**\n\r");
kataokashunpei 3:8fcc0e904fd6 91 wt=1000;
kataokashunpei 0:1ad445491c35 92 ble.gap().stopAdvertising();
kataokashunpei 0:1ad445491c35 93 ble.startScan(&onScanCallback);
kataokashunpei 0:1ad445491c35 94 }
kataokashunpei 0:1ad445491c35 95 //2
kataokashunpei 0:1ad445491c35 96 if(!strcmp((const char*)name, "2")){
kataokashunpei 5:f8734ee36ec9 97 memset(address, 0, sizeof(address));//配列の初期化
kataokashunpei 2:592364ca5fb2 98 counter = 0;
kataokashunpei 4:c1ac302982b7 99 printf("**get**\n\r");
kataokashunpei 2:592364ca5fb2 100 myled3 = 0;
kataokashunpei 0:1ad445491c35 101 wt=0;//central modeの際はthreadの時間は0sec
kataokashunpei 3:8fcc0e904fd6 102 wt1 = GET_TIME ;//centralmode の時間はこっち
kataokashunpei 1:fa329dd713be 103 fp = fopen("/sd/test.csv", "a");
kataokashunpei 0:1ad445491c35 104
nakamae 6:65a18fb360c1 105 printf("%d seconds receive\n\r",wt1/1000);
kataokashunpei 0:1ad445491c35 106 timer.start();
kataokashunpei 5:f8734ee36ec9 107 while(1){
kataokashunpei 0:1ad445491c35 108 ble.waitForEvent();
kataokashunpei 0:1ad445491c35 109 if(timer.read() > wt1/1000){
kataokashunpei 0:1ad445491c35 110 timer.stop();
kataokashunpei 0:1ad445491c35 111 timer.reset();
kataokashunpei 0:1ad445491c35 112 ble.stopScan();
kataokashunpei 0:1ad445491c35 113 fclose(fp);
kataokashunpei 0:1ad445491c35 114 break;
kataokashunpei 0:1ad445491c35 115 }
kataokashunpei 0:1ad445491c35 116 }
kataokashunpei 5:f8734ee36ec9 117
kataokashunpei 5:f8734ee36ec9 118 }
kataokashunpei 5:f8734ee36ec9 119
kataokashunpei 5:f8734ee36ec9 120 //3
kataokashunpei 5:f8734ee36ec9 121 if(!strcmp((const char*)name, "3")){
kataokashunpei 5:f8734ee36ec9 122 printf("**send**\n\r");
kataokashunpei 5:f8734ee36ec9 123 myled3 = 1;
kataokashunpei 5:f8734ee36ec9 124 ran = rand() % 10;
kataokashunpei 5:f8734ee36ec9 125 wt=SEND_TIME - ran*1000;
nakamae 6:65a18fb360c1 126 printf("%d seconds sendin\n\r",wt/1000);
kataokashunpei 5:f8734ee36ec9 127 ble.gap().startAdvertising();//BLEの送信
kataokashunpei 1:fa329dd713be 128 }
kataokashunpei 0:1ad445491c35 129 Thread::wait(wt);
kataokashunpei 0:1ad445491c35 130 one_slot.release();
kataokashunpei 1:fa329dd713be 131 }
kataokashunpei 0:1ad445491c35 132 }
kataokashunpei 0:1ad445491c35 133
kataokashunpei 0:1ad445491c35 134 // const static char DEVICE_NAME[] = "BLE1";
kataokashunpei 0:1ad445491c35 135
kataokashunpei 0:1ad445491c35 136 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
kataokashunpei 0:1ad445491c35 137 {
kataokashunpei 0:1ad445491c35 138 BLE &ble= params->ble;
kataokashunpei 0:1ad445491c35 139 ble_error_t error = params->error;
kataokashunpei 5:f8734ee36ec9 140
kataokashunpei 0:1ad445491c35 141 if (error != BLE_ERROR_NONE) {
kataokashunpei 0:1ad445491c35 142 return;
kataokashunpei 0:1ad445491c35 143 }
kataokashunpei 5:f8734ee36ec9 144 const uint8_t address1[] = {AA,AA,AA,AA,AA,AA};
kataokashunpei 0:1ad445491c35 145 ble.gap().setAddress(BLEProtocol::AddressType::PUBLIC, address1);
nakamae 6:65a18fb360c1 146 /* ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
nakamae 6:65a18fb360c1 147 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
nakamae 6:65a18fb360c1 148 ble.gap().setAdvertisingInterval(1000);*/
kataokashunpei 0:1ad445491c35 149 }
kataokashunpei 0:1ad445491c35 150
kataokashunpei 0:1ad445491c35 151 int main (void) {
kataokashunpei 0:1ad445491c35 152 ble.init(bleInitComplete);
kataokashunpei 1:fa329dd713be 153 ble.setScanParams(GapScanningParams::SCAN_INTERVAL_MAX,GapScanningParams::SCAN_WINDOW_MAX,0);
kataokashunpei 5:f8734ee36ec9 154
kataokashunpei 0:1ad445491c35 155 Thread t2(test_thread, (void *)"2");
kataokashunpei 0:1ad445491c35 156 Thread t3(test_thread, (void *)"3");
kataokashunpei 0:1ad445491c35 157
kataokashunpei 0:1ad445491c35 158 test_thread((void *)"1");
kataokashunpei 0:1ad445491c35 159 }