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.

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?

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