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 Doug Cook

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?

UserRevisionLine numberNew 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 }