Partial implementation of BlueGiga's BGAPI for use with the BLE112/3 modules over UART.
Hi there! I recently started using BLE112 modules with the mbed LPC1768 MCU, and I realized there was no implementation of BlueGiga's BGAPI available for mbed. This library implements only a few commands, but if you're looking to get started, this is a good place to look.
This was developed against BGAPI v1.3.2. I make no guarantees as to how well it will work with newer revisions of the software.
BGLib.cpp@6:23d9a99dcde0, 2015-05-19 (annotated)
- Committer:
- dishbreak
- Date:
- Tue May 19 05:49:00 2015 +0000
- Revision:
- 6:23d9a99dcde0
- Parent:
- 4:21eee6881dac
- Child:
- 7:63daf39f20e1
Fixed up documentation. Added GAP Discover command.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dishbreak | 1:3336b2391c80 | 1 | #include "BGLib.h" |
dishbreak | 1:3336b2391c80 | 2 | |
dishbreak | 1:3336b2391c80 | 3 | BGLib::BGLib(PinName tx, PinName rx, PinName rts, PinName cts) : |
dishbreak | 1:3336b2391c80 | 4 | mSerial(tx, rx) { |
dishbreak | 1:3336b2391c80 | 5 | mSerial.set_flow_control(SerialBase::RTSCTS, rts, cts); |
dishbreak | 1:3336b2391c80 | 6 | mSerial.baud(57600); |
dishbreak | 1:3336b2391c80 | 7 | mSerial.attach(this, &BGLib::parse); |
dishbreak | 1:3336b2391c80 | 8 | } |
dishbreak | 1:3336b2391c80 | 9 | |
dishbreak | 2:3ce9a31a6a7e | 10 | void BGLib::set_ble_rsp_system_hello(hello_callback_t pCallback) { |
dishbreak | 1:3336b2391c80 | 11 | mHelloCallback = pCallback; |
dishbreak | 1:3336b2391c80 | 12 | } |
dishbreak | 1:3336b2391c80 | 13 | |
dishbreak | 2:3ce9a31a6a7e | 14 | void BGLib::ble_cmd_system_hello() { |
dishbreak | 1:3336b2391c80 | 15 | uint8_t bytes[] = {0x00, 0x00, 0x00, 0x01}; |
dishbreak | 1:3336b2391c80 | 16 | send_bytes(bytes, 4); |
dishbreak | 1:3336b2391c80 | 17 | } |
dishbreak | 1:3336b2391c80 | 18 | |
dishbreak | 2:3ce9a31a6a7e | 19 | void BGLib::ble_cmd_system_get_info() { |
dishbreak | 2:3ce9a31a6a7e | 20 | uint8_t bytes[] = {0x00, 0x00, 0x00, 0x08}; |
dishbreak | 2:3ce9a31a6a7e | 21 | send_bytes(bytes, 4); |
dishbreak | 2:3ce9a31a6a7e | 22 | } |
dishbreak | 2:3ce9a31a6a7e | 23 | |
dishbreak | 2:3ce9a31a6a7e | 24 | void BGLib::set_ble_rsp_system_get_info(get_info_callback_t pCallback) { |
dishbreak | 2:3ce9a31a6a7e | 25 | mGetInfoCallback = pCallback; |
dishbreak | 2:3ce9a31a6a7e | 26 | } |
dishbreak | 2:3ce9a31a6a7e | 27 | |
dishbreak | 3:8f43af513d87 | 28 | void BGLib::set_ble_evt_system_boot(boot_callback_t pCallback) { |
dishbreak | 3:8f43af513d87 | 29 | mBootCallback = pCallback; |
dishbreak | 3:8f43af513d87 | 30 | } |
dishbreak | 3:8f43af513d87 | 31 | |
dishbreak | 3:8f43af513d87 | 32 | void BGLib::ble_cmd_system_reset(ble_msg_system_reset_t args) { |
dishbreak | 3:8f43af513d87 | 33 | uint8_t bytes[] = {0x00, 0x01, 0x00, 0x00, 0x00}; |
dishbreak | 3:8f43af513d87 | 34 | bytes[4] = args.boot_in_dfu; |
dishbreak | 3:8f43af513d87 | 35 | send_bytes(bytes, 5); |
dishbreak | 3:8f43af513d87 | 36 | } |
dishbreak | 3:8f43af513d87 | 37 | |
dishbreak | 4:21eee6881dac | 38 | void BGLib::set_timestamp_callback(timestamp_callback_t pCallback) { |
dishbreak | 4:21eee6881dac | 39 | mTimestampCallback = pCallback; |
dishbreak | 4:21eee6881dac | 40 | } |
dishbreak | 4:21eee6881dac | 41 | |
dishbreak | 6:23d9a99dcde0 | 42 | void BGLib::ble_cmd_gap_discover(gap_discover_mode mode) { |
dishbreak | 6:23d9a99dcde0 | 43 | uint8_t bytes[] = {0x00, 0x01, 0x06, 0x02, 0x00}; |
dishbreak | 6:23d9a99dcde0 | 44 | bytes[4] = (uint8_t) mode; |
dishbreak | 6:23d9a99dcde0 | 45 | send_bytes(bytes, 5); |
dishbreak | 6:23d9a99dcde0 | 46 | } |
dishbreak | 6:23d9a99dcde0 | 47 | |
dishbreak | 1:3336b2391c80 | 48 | void BGLib::parse() { |
dishbreak | 4:21eee6881dac | 49 | mTimestampCallback(); |
dishbreak | 4:21eee6881dac | 50 | |
dishbreak | 2:3ce9a31a6a7e | 51 | #ifdef DEBUG |
dishbreak | 2:3ce9a31a6a7e | 52 | printf("Got data from port!\r\n"); |
dishbreak | 2:3ce9a31a6a7e | 53 | #endif |
dishbreak | 2:3ce9a31a6a7e | 54 | |
dishbreak | 2:3ce9a31a6a7e | 55 | uint8_t hilen = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 56 | uint8_t lolen = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 57 | uint8_t msg_class = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 58 | uint8_t msg_id = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 59 | |
dishbreak | 2:3ce9a31a6a7e | 60 | #ifdef DEBUG |
dishbreak | 2:3ce9a31a6a7e | 61 | printf("Message header: %x %x %x %x\r\n", hilen, lolen, msg_class, msg_id); |
dishbreak | 2:3ce9a31a6a7e | 62 | #endif |
dishbreak | 2:3ce9a31a6a7e | 63 | |
dishbreak | 2:3ce9a31a6a7e | 64 | if (hilen == 0x00) { // response |
dishbreak | 2:3ce9a31a6a7e | 65 | if (msg_class == 0x00) { // system_class |
dishbreak | 2:3ce9a31a6a7e | 66 | if (msg_id == 0x01) { // system_hello |
dishbreak | 2:3ce9a31a6a7e | 67 | mHelloCallback(); |
dishbreak | 3:8f43af513d87 | 68 | } else if (msg_id == 0x08) { //system_get_info |
dishbreak | 2:3ce9a31a6a7e | 69 | |
dishbreak | 2:3ce9a31a6a7e | 70 | #ifdef DEBUG |
dishbreak | 2:3ce9a31a6a7e | 71 | printf("Get Info Response\r\n"); |
dishbreak | 2:3ce9a31a6a7e | 72 | #endif |
dishbreak | 2:3ce9a31a6a7e | 73 | |
dishbreak | 2:3ce9a31a6a7e | 74 | ble_msg_system_get_info_rsp_t result; |
dishbreak | 2:3ce9a31a6a7e | 75 | result.major = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 2:3ce9a31a6a7e | 76 | result.minor = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 2:3ce9a31a6a7e | 77 | result.patch = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 2:3ce9a31a6a7e | 78 | result.build = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 2:3ce9a31a6a7e | 79 | result.ll_version = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 2:3ce9a31a6a7e | 80 | result.protocol_version = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 81 | result.hw = mSerial.getc(); |
dishbreak | 2:3ce9a31a6a7e | 82 | mGetInfoCallback(result); |
dishbreak | 2:3ce9a31a6a7e | 83 | } |
dishbreak | 2:3ce9a31a6a7e | 84 | } |
dishbreak | 3:8f43af513d87 | 85 | } else if (hilen == 0x80) { // event |
dishbreak | 3:8f43af513d87 | 86 | if (msg_class == 0x00) { //system_class |
dishbreak | 3:8f43af513d87 | 87 | if (msg_id == 0x00) { //system_boot |
dishbreak | 3:8f43af513d87 | 88 | #ifdef DEBUG |
dishbreak | 3:8f43af513d87 | 89 | printf("Boot Event\r\n"); |
dishbreak | 3:8f43af513d87 | 90 | #endif |
dishbreak | 3:8f43af513d87 | 91 | |
dishbreak | 3:8f43af513d87 | 92 | ble_msg_system_boot_evt_t result; |
dishbreak | 3:8f43af513d87 | 93 | result.major = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 3:8f43af513d87 | 94 | result.minor = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 3:8f43af513d87 | 95 | result.patch = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 3:8f43af513d87 | 96 | result.build = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 3:8f43af513d87 | 97 | result.ll_version = mSerial.getc() | (mSerial.getc() << 8); |
dishbreak | 3:8f43af513d87 | 98 | result.protocol_version = mSerial.getc(); |
dishbreak | 3:8f43af513d87 | 99 | result.hw = mSerial.getc(); |
dishbreak | 3:8f43af513d87 | 100 | mBootCallback(result); |
dishbreak | 3:8f43af513d87 | 101 | } |
dishbreak | 3:8f43af513d87 | 102 | } |
dishbreak | 3:8f43af513d87 | 103 | } |
dishbreak | 3:8f43af513d87 | 104 | |
dishbreak | 2:3ce9a31a6a7e | 105 | |
dishbreak | 2:3ce9a31a6a7e | 106 | //safety valve: if there are bytes remaining |
dishbreak | 1:3336b2391c80 | 107 | } |
dishbreak | 1:3336b2391c80 | 108 | |
dishbreak | 1:3336b2391c80 | 109 | void BGLib::send_bytes(uint8_t bytes[], int length) { |
dishbreak | 1:3336b2391c80 | 110 | for (int i = 0; i < length; i++) { |
dishbreak | 1:3336b2391c80 | 111 | mSerial.putc(bytes[i]); |
dishbreak | 1:3336b2391c80 | 112 | } |
dishbreak | 1:3336b2391c80 | 113 | } |