Hackaday Tiny BLE Sample

Dependencies:   BLE_API mbed nRF51822

Fork of Seeed_Tiny_BLE_Get_Started by Seeed

Committer:
wd5gnr
Date:
Sun Mar 27 18:22:22 2016 +0000
Revision:
4:bb933be5a507
Parent:
3:24e365bd1b97
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:26da608265f8 1
yihui 0:26da608265f8 2 #include "mbed.h"
yihui 2:b61ddbb8528e 3 #include "nrf51.h"
yihui 2:b61ddbb8528e 4 #include "nrf51_bitfields.h"
yihui 0:26da608265f8 5
yihui 3:24e365bd1b97 6 #include "BLE.h"
yihui 0:26da608265f8 7 #include "DFUService.h"
yihui 0:26da608265f8 8 #include "UARTService.h"
yihui 0:26da608265f8 9
yihui 0:26da608265f8 10
yihui 0:26da608265f8 11 #define LOG(...) { pc.printf(__VA_ARGS__); }
yihui 0:26da608265f8 12
yihui 0:26da608265f8 13 #define LED_GREEN p21
yihui 0:26da608265f8 14 #define LED_RED p22
yihui 0:26da608265f8 15 #define LED_BLUE p23
yihui 0:26da608265f8 16 #define BUTTON_PIN p17
yihui 0:26da608265f8 17 #define BATTERY_PIN p1
yihui 0:26da608265f8 18
yihui 0:26da608265f8 19
yihui 0:26da608265f8 20 #define UART_TX p9
yihui 0:26da608265f8 21 #define UART_RX p11
yihui 0:26da608265f8 22 #define UART_CTS p8
yihui 0:26da608265f8 23 #define UART_RTS p10
yihui 0:26da608265f8 24
wd5gnr 4:bb933be5a507 25
yihui 0:26da608265f8 26
yihui 0:26da608265f8 27 DigitalOut blue(LED_BLUE);
yihui 0:26da608265f8 28 DigitalOut green(LED_GREEN);
yihui 0:26da608265f8 29 DigitalOut red(LED_RED);
yihui 0:26da608265f8 30
yihui 0:26da608265f8 31 InterruptIn button(BUTTON_PIN);
yihui 0:26da608265f8 32 AnalogIn battery(BATTERY_PIN);
yihui 0:26da608265f8 33 Serial pc(UART_TX, UART_RX);
yihui 0:26da608265f8 34
yihui 0:26da608265f8 35
yihui 2:b61ddbb8528e 36 int read_none_count = 0;
yihui 2:b61ddbb8528e 37
yihui 0:26da608265f8 38 BLEDevice ble;
yihui 0:26da608265f8 39 UARTService *uartServicePtr;
yihui 0:26da608265f8 40
yihui 0:26da608265f8 41 volatile bool bleIsConnected = false;
yihui 0:26da608265f8 42 volatile uint8_t tick_event = 0;
yihui 0:26da608265f8 43
yihui 0:26da608265f8 44
yihui 2:b61ddbb8528e 45
yihui 3:24e365bd1b97 46 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
yihui 0:26da608265f8 47 {
yihui 0:26da608265f8 48 LOG("Connected!\n");
yihui 0:26da608265f8 49 bleIsConnected = true;
yihui 0:26da608265f8 50 }
yihui 0:26da608265f8 51
yihui 3:24e365bd1b97 52 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams)
yihui 0:26da608265f8 53 {
yihui 0:26da608265f8 54 LOG("Disconnected!\n");
yihui 0:26da608265f8 55 LOG("Restarting the advertising process\n");
yihui 0:26da608265f8 56 ble.startAdvertising();
yihui 0:26da608265f8 57 bleIsConnected = false;
yihui 0:26da608265f8 58 }
yihui 0:26da608265f8 59
yihui 0:26da608265f8 60 void tick(void)
yihui 0:26da608265f8 61 {
yihui 3:24e365bd1b97 62 static uint32_t count = 0;
yihui 3:24e365bd1b97 63
yihui 3:24e365bd1b97 64 LOG("%d\r\n", count++);
wd5gnr 4:bb933be5a507 65 // green = !green;
yihui 0:26da608265f8 66 }
yihui 0:26da608265f8 67
yihui 0:26da608265f8 68 void detect(void)
yihui 0:26da608265f8 69 {
yihui 2:b61ddbb8528e 70 LOG("Button pressed\n");
yihui 0:26da608265f8 71 blue = !blue;
yihui 0:26da608265f8 72 }
yihui 0:26da608265f8 73
yihui 0:26da608265f8 74
yihui 0:26da608265f8 75
yihui 0:26da608265f8 76 int main(void)
yihui 0:26da608265f8 77 {
yihui 0:26da608265f8 78 blue = 1;
yihui 0:26da608265f8 79 green = 1;
yihui 0:26da608265f8 80 red = 1;
yihui 0:26da608265f8 81
yihui 0:26da608265f8 82 pc.baud(115200);
yihui 2:b61ddbb8528e 83
yihui 2:b61ddbb8528e 84 wait(1);
yihui 2:b61ddbb8528e 85
wd5gnr 4:bb933be5a507 86 LOG("---- Hackaday! ----\n");
yihui 2:b61ddbb8528e 87
yihui 2:b61ddbb8528e 88
wd5gnr 4:bb933be5a507 89
yihui 2:b61ddbb8528e 90
yihui 2:b61ddbb8528e 91 Ticker ticker;
yihui 2:b61ddbb8528e 92 ticker.attach(tick, 3);
yihui 2:b61ddbb8528e 93
yihui 2:b61ddbb8528e 94 button.fall(detect);
yihui 2:b61ddbb8528e 95
yihui 2:b61ddbb8528e 96 LOG("Initialising the nRF51822\n");
yihui 2:b61ddbb8528e 97 ble.init();
yihui 3:24e365bd1b97 98 ble.gap().onDisconnection(disconnectionCallback);
yihui 3:24e365bd1b97 99 ble.gap().onConnection(connectionCallback);
yihui 2:b61ddbb8528e 100
yihui 2:b61ddbb8528e 101
yihui 2:b61ddbb8528e 102 /* setup advertising */
yihui 2:b61ddbb8528e 103 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
yihui 2:b61ddbb8528e 104 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
yihui 2:b61ddbb8528e 105 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
yihui 2:b61ddbb8528e 106 (const uint8_t *)"smurfs", sizeof("smurfs"));
yihui 2:b61ddbb8528e 107 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
yihui 2:b61ddbb8528e 108 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 2:b61ddbb8528e 109 DFUService dfu(ble);
yihui 2:b61ddbb8528e 110 UARTService uartService(ble);
yihui 2:b61ddbb8528e 111 uartServicePtr = &uartService;
yihui 2:b61ddbb8528e 112 //uartService.retargetStdout();
yihui 2:b61ddbb8528e 113
yihui 2:b61ddbb8528e 114 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
yihui 3:24e365bd1b97 115 ble.gap().startAdvertising();
wd5gnr 4:bb933be5a507 116 char r[4];
wd5gnr 4:bb933be5a507 117 r[1]='\r';
wd5gnr 4:bb933be5a507 118 r[2]='\n';
wd5gnr 4:bb933be5a507 119 r[3]='\0';
yihui 2:b61ddbb8528e 120
yihui 0:26da608265f8 121 while (true) {
wd5gnr 4:bb933be5a507 122 ble.waitForEvent();
wd5gnr 4:bb933be5a507 123 int c;
wd5gnr 4:bb933be5a507 124 r[0]=c=uartService._getc();
wd5gnr 4:bb933be5a507 125 if (c<=0) continue;
wd5gnr 4:bb933be5a507 126 if (c=='R' || c=='r') { red=0; green=1; blue=1; }
wd5gnr 4:bb933be5a507 127 else if (c=='G' || c=='g') { red=1; green=0; blue=1; }
wd5gnr 4:bb933be5a507 128 else if (c=='B' || c=='b') { red=1; green=1; blue=0; }
wd5gnr 4:bb933be5a507 129 else r[0]='?';
wd5gnr 4:bb933be5a507 130 uartService.writeString(r);
wd5gnr 4:bb933be5a507 131
yihui 0:26da608265f8 132 }
yihui 0:26da608265f8 133 }
yihui 0:26da608265f8 134
yihui 0:26da608265f8 135