Firmware for BLE Tags

Dependencies:   BLE_API MMA8452_tag_private mbed nRF51822

Fork of cow_beacon_adxl345 by Luis Bañuelos Chacon

Committer:
luisbc92
Date:
Fri Jan 08 20:41:56 2016 +0000
Revision:
0:4c7b37b8faad
Child:
1:1c14c1d3ce09
Initial commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
luisbc92 0:4c7b37b8faad 1
luisbc92 0:4c7b37b8faad 2 #include "mbed.h"
luisbc92 0:4c7b37b8faad 3 #include "BLEDevice.h"
luisbc92 0:4c7b37b8faad 4 #include "ADXL345.h"
luisbc92 0:4c7b37b8faad 5
luisbc92 0:4c7b37b8faad 6 // The accelerometer sample rate defines how often advertising
luisbc92 0:4c7b37b8faad 7 // packets need to be sent. Each packet can hold 9 samples.
luisbc92 0:4c7b37b8faad 8 #define ACC_SAMPLE_RATE 9
luisbc92 0:4c7b37b8faad 9
luisbc92 0:4c7b37b8faad 10 // How many times to re-advertise the same packet. For example,
luisbc92 0:4c7b37b8faad 11 // if for the given sample rate an advertising packet needs to
luisbc92 0:4c7b37b8faad 12 // be sent every second, and ADV_RESEND_COUNT of 2 will send
luisbc92 0:4c7b37b8faad 13 // 2 packets per second.
luisbc92 0:4c7b37b8faad 14 #define ADV_RESEND_COUNT 10
luisbc92 0:4c7b37b8faad 15
luisbc92 0:4c7b37b8faad 16 BLEDevice ble;
luisbc92 0:4c7b37b8faad 17 ADXL345 acc(P0_9, P0_11, P0_8, P0_10);
luisbc92 0:4c7b37b8faad 18 DigitalOut led(P0_19);
luisbc92 0:4c7b37b8faad 19
luisbc92 0:4c7b37b8faad 20 void accRead() {
luisbc92 0:4c7b37b8faad 21 int data[3];
luisbc92 0:4c7b37b8faad 22 static int8_t buffer[28];
luisbc92 0:4c7b37b8faad 23 static uint8_t index = 0;
luisbc92 0:4c7b37b8faad 24 static uint8_t count;
luisbc92 0:4c7b37b8faad 25
luisbc92 0:4c7b37b8faad 26 acc.getOutput(data);
luisbc92 0:4c7b37b8faad 27
luisbc92 0:4c7b37b8faad 28 // Fill buffer
luisbc92 0:4c7b37b8faad 29 buffer[index] = (int8_t)(data[0] >> 8);
luisbc92 0:4c7b37b8faad 30 buffer[index+1] = (int8_t)(data[1] >> 8);
luisbc92 0:4c7b37b8faad 31 buffer[index+2] = (int8_t)(data[2] >> 8);
luisbc92 0:4c7b37b8faad 32 index += 3;
luisbc92 0:4c7b37b8faad 33
luisbc92 0:4c7b37b8faad 34 // If buffer is full (9 readings) update advertising packet
luisbc92 0:4c7b37b8faad 35 if (index >= 27) {
luisbc92 0:4c7b37b8faad 36 index = 0; // Reset buffer index
luisbc92 0:4c7b37b8faad 37 count += 1; // Increase packet count
luisbc92 0:4c7b37b8faad 38 buffer[27] = count; // Append packet count
luisbc92 0:4c7b37b8faad 39 ble.clearScanResponse(); // Clear advertising packet and add data
luisbc92 0:4c7b37b8faad 40 ble.accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t*)buffer, sizeof(buffer));
luisbc92 0:4c7b37b8faad 41 ble.setAdvertisingPayload();
luisbc92 0:4c7b37b8faad 42 led = 0; // Flash led
luisbc92 0:4c7b37b8faad 43 wait(0.01);
luisbc92 0:4c7b37b8faad 44 led = 1;
luisbc92 0:4c7b37b8faad 45 }
luisbc92 0:4c7b37b8faad 46 }
luisbc92 0:4c7b37b8faad 47
luisbc92 0:4c7b37b8faad 48
luisbc92 0:4c7b37b8faad 49 int main(void) {
luisbc92 0:4c7b37b8faad 50 // Turn off led
luisbc92 0:4c7b37b8faad 51 led = 0;
luisbc92 0:4c7b37b8faad 52
luisbc92 0:4c7b37b8faad 53 // Calculate advertising interval
luisbc92 0:4c7b37b8faad 54 uint16_t adv_interval;
luisbc92 0:4c7b37b8faad 55 adv_interval = (uint16_t)((9.0 / (float)ACC_SAMPLE_RATE) * 1000.0 / (float)ADV_RESEND_COUNT);
luisbc92 0:4c7b37b8faad 56
luisbc92 0:4c7b37b8faad 57 // Initialize BLE
luisbc92 0:4c7b37b8faad 58 uint8_t tagAddress[6];
luisbc92 0:4c7b37b8faad 59 uint8_t tagName[8];
luisbc92 0:4c7b37b8faad 60 ble.init(); // Initialize BLE stack
luisbc92 0:4c7b37b8faad 61 ble.setTxPower(4); // Set power level (in dB)
luisbc92 0:4c7b37b8faad 62 ble.setAddress(Gap::ADDR_TYPE_RANDOM_STATIC, NULL); // Static random address
luisbc92 0:4c7b37b8faad 63 ble.getAddress(NULL, tagAddress); // Get random address from stack
luisbc92 0:4c7b37b8faad 64 sprintf((char*)tagName, "TAG_%2X%2X", tagAddress[1], tagAddress[0]);
luisbc92 0:4c7b37b8faad 65 ble.accumulateAdvertisingPayload( // Advertise as BLE
luisbc92 0:4c7b37b8faad 66 GapAdvertisingData::BREDR_NOT_SUPPORTED |
luisbc92 0:4c7b37b8faad 67 GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
luisbc92 0:4c7b37b8faad 68 ble.accumulateAdvertisingPayload( // Set name
luisbc92 0:4c7b37b8faad 69 GapAdvertisingData::COMPLETE_LOCAL_NAME,
luisbc92 0:4c7b37b8faad 70 tagName,
luisbc92 0:4c7b37b8faad 71 sizeof(tagName));
luisbc92 0:4c7b37b8faad 72 ble.setAdvertisingInterval(adv_interval); // Advertising interval
luisbc92 0:4c7b37b8faad 73 ble.startAdvertising(); // Start advertising
luisbc92 0:4c7b37b8faad 74
luisbc92 0:4c7b37b8faad 75 // Setup ticker to read accelerometer
luisbc92 0:4c7b37b8faad 76 acc.setPowerControl(0x00); // Standby for configuration
luisbc92 0:4c7b37b8faad 77 acc.setDataFormatControl(0x05); // +-4g, left-justified,
luisbc92 0:4c7b37b8faad 78 acc.setDataRate(ADXL345_12HZ5); // 12.5Hz Internal Sample Rate
luisbc92 0:4c7b37b8faad 79 acc.setPowerControl(0x08); // Measurement mode
luisbc92 0:4c7b37b8faad 80 Ticker acc_read;
luisbc92 0:4c7b37b8faad 81 acc_read.attach(&accRead, (1.0 / (float)ACC_SAMPLE_RATE));
luisbc92 0:4c7b37b8faad 82
luisbc92 0:4c7b37b8faad 83 while(1) {
luisbc92 0:4c7b37b8faad 84 ble.waitForEvent(); // Sleep
luisbc92 0:4c7b37b8faad 85 }
luisbc92 0:4c7b37b8faad 86 }