Broadcasts raw accelerometer values
Dependencies: BLE_API MMA8452_tag_private mbed nRF51822
Fork of tag_final by
main.cpp@0:4c7b37b8faad, 2016-01-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |