Code for the Nordic nrf51822 component of our project. For project group Alloy.
Dependencies: BLE_API mbed nRF51822
Fork of idd_hw5_group_alloy_BLE by
main.cpp@9:cd8186239b8e, 2014-11-10 (annotated)
- Committer:
- douglasc
- Date:
- Mon Nov 10 17:27:47 2014 +0000
- Revision:
- 9:cd8186239b8e
- Parent:
- 6:e0fc9072e853
initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
douglasc | 9:cd8186239b8e | 1 | /** |
douglasc | 9:cd8186239b8e | 2 | * Interactive Device Design, Fall 2014 |
douglasc | 9:cd8186239b8e | 3 | * Homework 5 - Wind and Window controller |
douglasc | 9:cd8186239b8e | 4 | * Nordic nrf51822 Board |
yihui | 0:e910d9bb040f | 5 | * |
douglasc | 9:cd8186239b8e | 6 | * Ian Shain |
douglasc | 9:cd8186239b8e | 7 | * Doug Cook |
douglasc | 9:cd8186239b8e | 8 | * Kiyana Salkeld |
douglasc | 9:cd8186239b8e | 9 | * Elizabeth Lin |
yihui | 0:e910d9bb040f | 10 | * |
yihui | 0:e910d9bb040f | 11 | */ |
yihui | 0:e910d9bb040f | 12 | |
yihui | 0:e910d9bb040f | 13 | #include "mbed.h" |
Rohit Grover |
2:e060367b9024 | 14 | #include "BLEDevice.h" |
douglasc | 9:cd8186239b8e | 15 | #include "HealthThermometerService.h" |
rgrover1 | 6:e0fc9072e853 | 16 | #include "UARTService.h" |
douglasc | 9:cd8186239b8e | 17 | #include <string> |
yihui | 0:e910d9bb040f | 18 | |
Rohit Grover |
2:e060367b9024 | 19 | BLEDevice ble; |
Rohit Grover |
2:e060367b9024 | 20 | DigitalOut led1(LED1); |
douglasc | 9:cd8186239b8e | 21 | DigitalOut led2(LED2); |
yihui | 0:e910d9bb040f | 22 | |
rgrover1 | 6:e0fc9072e853 | 23 | UARTService *uartServicePtr; |
yihui | 0:e910d9bb040f | 24 | |
douglasc | 9:cd8186239b8e | 25 | Serial kl25z(P0_9, P0_11); // P0_9 (gray) -> TX, P0_11 (purple) -> RX |
douglasc | 9:cd8186239b8e | 26 | |
rgrover1 | 5:4bc41267a03a | 27 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
yihui | 0:e910d9bb040f | 28 | { |
douglasc | 9:cd8186239b8e | 29 | kl25z.putc('h'); |
douglasc | 9:cd8186239b8e | 30 | kl25z.putc('f'); |
Rohit Grover |
2:e060367b9024 | 31 | ble.startAdvertising(); |
Rohit Grover |
2:e060367b9024 | 32 | } |
yihui | 0:e910d9bb040f | 33 | |
rgrover1 | 6:e0fc9072e853 | 34 | void onDataWritten(const GattCharacteristicWriteCBParams *params) |
yihui | 0:e910d9bb040f | 35 | { |
rgrover1 | 6:e0fc9072e853 | 36 | if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { |
rgrover1 | 5:4bc41267a03a | 37 | uint16_t bytesRead = params->len; |
douglasc | 9:cd8186239b8e | 38 | if (bytesRead <= 1) { |
douglasc | 9:cd8186239b8e | 39 | kl25z.putc('c'); |
douglasc | 9:cd8186239b8e | 40 | } else { |
douglasc | 9:cd8186239b8e | 41 | kl25z.putc('d'); |
douglasc | 9:cd8186239b8e | 42 | } |
rgrover1 | 6:e0fc9072e853 | 43 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); |
yihui | 0:e910d9bb040f | 44 | } |
Rohit Grover |
2:e060367b9024 | 45 | } |
yihui | 0:e910d9bb040f | 46 | |
douglasc | 9:cd8186239b8e | 47 | bool updateWindAdvertisement = false; |
douglasc | 9:cd8186239b8e | 48 | |
Rohit Grover |
2:e060367b9024 | 49 | void periodicCallback(void) |
Rohit Grover |
2:e060367b9024 | 50 | { |
rgrover1 | 6:e0fc9072e853 | 51 | led1 = !led1; |
douglasc | 9:cd8186239b8e | 52 | updateWindAdvertisement = true; |
douglasc | 9:cd8186239b8e | 53 | } |
douglasc | 9:cd8186239b8e | 54 | |
douglasc | 9:cd8186239b8e | 55 | bool newMessage = false; |
douglasc | 9:cd8186239b8e | 56 | string measurement = ""; |
douglasc | 9:cd8186239b8e | 57 | void callback() { |
douglasc | 9:cd8186239b8e | 58 | newMessage = true; |
douglasc | 9:cd8186239b8e | 59 | measurement += kl25z.getc(); |
Rohit Grover |
2:e060367b9024 | 60 | } |
yihui | 0:e910d9bb040f | 61 | |
yihui | 0:e910d9bb040f | 62 | int main(void) |
yihui | 0:e910d9bb040f | 63 | { |
Rohit Grover |
2:e060367b9024 | 64 | led1 = 1; |
Rohit Grover |
2:e060367b9024 | 65 | Ticker ticker; |
Rohit Grover |
2:e060367b9024 | 66 | ticker.attach(periodicCallback, 1); |
douglasc | 9:cd8186239b8e | 67 | |
douglasc | 9:cd8186239b8e | 68 | kl25z.baud(9600); |
douglasc | 9:cd8186239b8e | 69 | kl25z.format(8,Serial::Odd,1); |
douglasc | 9:cd8186239b8e | 70 | kl25z.attach(callback); |
yihui | 0:e910d9bb040f | 71 | |
douglasc | 9:cd8186239b8e | 72 | //pc.printf("Initialising the nRF51822\n\r"); |
douglasc | 9:cd8186239b8e | 73 | kl25z.putc('e'); |
Rohit Grover |
2:e060367b9024 | 74 | ble.init(); |
Rohit Grover |
2:e060367b9024 | 75 | ble.onDisconnection(disconnectionCallback); |
Rohit Grover |
2:e060367b9024 | 76 | ble.onDataWritten(onDataWritten); |
douglasc | 9:cd8186239b8e | 77 | |
douglasc | 9:cd8186239b8e | 78 | HealthThermometerService thermometerService(ble, 0, HealthThermometerService::LOCATION_EAR); |
yihui | 0:e910d9bb040f | 79 | |
Rohit Grover |
2:e060367b9024 | 80 | /* setup advertising */ |
Rohit Grover |
2:e060367b9024 | 81 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
Rohit Grover |
2:e060367b9024 | 82 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
Rohit Grover |
2:e060367b9024 | 83 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
douglasc | 9:cd8186239b8e | 84 | (const uint8_t *)"AlloyWindow", sizeof("AlloyWindow") - 1); |
Rohit Grover |
2:e060367b9024 | 85 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
rgrover1 | 6:e0fc9072e853 | 86 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
yihui | 0:e910d9bb040f | 87 | |
Rohit Grover |
2:e060367b9024 | 88 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
Rohit Grover |
2:e060367b9024 | 89 | ble.startAdvertising(); |
yihui | 0:e910d9bb040f | 90 | |
rgrover1 | 6:e0fc9072e853 | 91 | UARTService uartService(ble); |
rgrover1 | 6:e0fc9072e853 | 92 | uartServicePtr = &uartService; |
yihui | 0:e910d9bb040f | 93 | |
Rohit Grover |
2:e060367b9024 | 94 | while (true) { |
douglasc | 9:cd8186239b8e | 95 | if (newMessage) { |
douglasc | 9:cd8186239b8e | 96 | led2 = !led2; // data receiver notification |
douglasc | 9:cd8186239b8e | 97 | // broadcast wind speed value |
douglasc | 9:cd8186239b8e | 98 | thermometerService.updateTemperature(atoi(measurement.c_str())); |
douglasc | 9:cd8186239b8e | 99 | measurement = ""; |
douglasc | 9:cd8186239b8e | 100 | newMessage = false; |
douglasc | 9:cd8186239b8e | 101 | } else { |
douglasc | 9:cd8186239b8e | 102 | ble.waitForEvent(); |
douglasc | 9:cd8186239b8e | 103 | } |
yihui | 0:e910d9bb040f | 104 | } |
yihui | 0:e910d9bb040f | 105 | } |