Hackaday Tiny BLE Sample
Dependencies: BLE_API mbed nRF51822
Fork of Seeed_Tiny_BLE_Get_Started by
main.cpp@4:bb933be5a507, 2016-03-27 (annotated)
- 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?
User | Revision | Line number | New 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 |