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 07:30:40 2015 +0000
Revision:
7:63daf39f20e1
Parent:
6:23d9a99dcde0
Adding Scan Result callback support.

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 7:63daf39f20e1 32 void BGLib::set_ble_rsp_gap_discover(discover_callback_t pCallback) {
dishbreak 7:63daf39f20e1 33 mDiscoverCallback = pCallback;
dishbreak 7:63daf39f20e1 34 }
dishbreak 7:63daf39f20e1 35
dishbreak 3:8f43af513d87 36 void BGLib::ble_cmd_system_reset(ble_msg_system_reset_t args) {
dishbreak 3:8f43af513d87 37 uint8_t bytes[] = {0x00, 0x01, 0x00, 0x00, 0x00};
dishbreak 3:8f43af513d87 38 bytes[4] = args.boot_in_dfu;
dishbreak 3:8f43af513d87 39 send_bytes(bytes, 5);
dishbreak 3:8f43af513d87 40 }
dishbreak 3:8f43af513d87 41
dishbreak 4:21eee6881dac 42 void BGLib::set_timestamp_callback(timestamp_callback_t pCallback) {
dishbreak 4:21eee6881dac 43 mTimestampCallback = pCallback;
dishbreak 4:21eee6881dac 44 }
dishbreak 4:21eee6881dac 45
dishbreak 7:63daf39f20e1 46 void BGLib::set_ble_evt_gap_scan_result(scan_result_callback_t pCallback) {
dishbreak 7:63daf39f20e1 47 mScanResultCallback = pCallback;
dishbreak 7:63daf39f20e1 48 }
dishbreak 7:63daf39f20e1 49
dishbreak 6:23d9a99dcde0 50 void BGLib::ble_cmd_gap_discover(gap_discover_mode mode) {
dishbreak 6:23d9a99dcde0 51 uint8_t bytes[] = {0x00, 0x01, 0x06, 0x02, 0x00};
dishbreak 6:23d9a99dcde0 52 bytes[4] = (uint8_t) mode;
dishbreak 6:23d9a99dcde0 53 send_bytes(bytes, 5);
dishbreak 6:23d9a99dcde0 54 }
dishbreak 6:23d9a99dcde0 55
dishbreak 1:3336b2391c80 56 void BGLib::parse() {
dishbreak 4:21eee6881dac 57 mTimestampCallback();
dishbreak 4:21eee6881dac 58
dishbreak 2:3ce9a31a6a7e 59 #ifdef DEBUG
dishbreak 2:3ce9a31a6a7e 60 printf("Got data from port!\r\n");
dishbreak 2:3ce9a31a6a7e 61 #endif
dishbreak 2:3ce9a31a6a7e 62
dishbreak 2:3ce9a31a6a7e 63 uint8_t hilen = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 64 uint8_t lolen = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 65 uint8_t msg_class = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 66 uint8_t msg_id = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 67
dishbreak 2:3ce9a31a6a7e 68 #ifdef DEBUG
dishbreak 2:3ce9a31a6a7e 69 printf("Message header: %x %x %x %x\r\n", hilen, lolen, msg_class, msg_id);
dishbreak 2:3ce9a31a6a7e 70 #endif
dishbreak 2:3ce9a31a6a7e 71
dishbreak 2:3ce9a31a6a7e 72 if (hilen == 0x00) { // response
dishbreak 2:3ce9a31a6a7e 73 if (msg_class == 0x00) { // system_class
dishbreak 2:3ce9a31a6a7e 74 if (msg_id == 0x01) { // system_hello
dishbreak 2:3ce9a31a6a7e 75 mHelloCallback();
dishbreak 3:8f43af513d87 76 } else if (msg_id == 0x08) { //system_get_info
dishbreak 2:3ce9a31a6a7e 77
dishbreak 2:3ce9a31a6a7e 78 #ifdef DEBUG
dishbreak 2:3ce9a31a6a7e 79 printf("Get Info Response\r\n");
dishbreak 2:3ce9a31a6a7e 80 #endif
dishbreak 2:3ce9a31a6a7e 81
dishbreak 2:3ce9a31a6a7e 82 ble_msg_system_get_info_rsp_t result;
dishbreak 2:3ce9a31a6a7e 83 result.major = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 2:3ce9a31a6a7e 84 result.minor = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 2:3ce9a31a6a7e 85 result.patch = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 2:3ce9a31a6a7e 86 result.build = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 2:3ce9a31a6a7e 87 result.ll_version = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 2:3ce9a31a6a7e 88 result.protocol_version = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 89 result.hw = mSerial.getc();
dishbreak 2:3ce9a31a6a7e 90 mGetInfoCallback(result);
dishbreak 2:3ce9a31a6a7e 91 }
dishbreak 7:63daf39f20e1 92 } else if (msg_class == 0x06) { // gap_class
dishbreak 7:63daf39f20e1 93 if (msg_id == 0x02) { // gap_discover
dishbreak 7:63daf39f20e1 94 ble_msg_gap_discover_rsp_t result;
dishbreak 7:63daf39f20e1 95 result.result = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 7:63daf39f20e1 96 mDiscoverCallback(result);
dishbreak 7:63daf39f20e1 97 }
dishbreak 7:63daf39f20e1 98 }
dishbreak 3:8f43af513d87 99 } else if (hilen == 0x80) { // event
dishbreak 3:8f43af513d87 100 if (msg_class == 0x00) { //system_class
dishbreak 3:8f43af513d87 101 if (msg_id == 0x00) { //system_boot
dishbreak 3:8f43af513d87 102 #ifdef DEBUG
dishbreak 3:8f43af513d87 103 printf("Boot Event\r\n");
dishbreak 3:8f43af513d87 104 #endif
dishbreak 3:8f43af513d87 105
dishbreak 3:8f43af513d87 106 ble_msg_system_boot_evt_t result;
dishbreak 3:8f43af513d87 107 result.major = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 3:8f43af513d87 108 result.minor = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 3:8f43af513d87 109 result.patch = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 3:8f43af513d87 110 result.build = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 3:8f43af513d87 111 result.ll_version = mSerial.getc() | (mSerial.getc() << 8);
dishbreak 3:8f43af513d87 112 result.protocol_version = mSerial.getc();
dishbreak 3:8f43af513d87 113 result.hw = mSerial.getc();
dishbreak 3:8f43af513d87 114 mBootCallback(result);
dishbreak 3:8f43af513d87 115 }
dishbreak 7:63daf39f20e1 116 } else if (msg_class == 0x06) { // gap_class
dishbreak 7:63daf39f20e1 117 if (msg_id == 0x00) { // gap_scan_result
dishbreak 7:63daf39f20e1 118 #ifdef DEBUG
dishbreak 7:63daf39f20e1 119 printf("Scan Result Event\r\n");
dishbreak 7:63daf39f20e1 120 #endif
dishbreak 7:63daf39f20e1 121
dishbreak 7:63daf39f20e1 122 ble_msg_gap_scan_result_evt_t result;
dishbreak 7:63daf39f20e1 123
dishbreak 7:63daf39f20e1 124 result.rssi = mSerial.getc();
dishbreak 7:63daf39f20e1 125
dishbreak 7:63daf39f20e1 126 result.packet_type = mSerial.getc();
dishbreak 7:63daf39f20e1 127
dishbreak 7:63daf39f20e1 128 for (int i = 5; i >= 0; i--) {
dishbreak 7:63daf39f20e1 129 result.hw_addr[i] = mSerial.getc();
dishbreak 7:63daf39f20e1 130 }
dishbreak 7:63daf39f20e1 131
dishbreak 7:63daf39f20e1 132 result.address_type = mSerial.getc();
dishbreak 7:63daf39f20e1 133
dishbreak 7:63daf39f20e1 134 result.bond = mSerial.getc();
dishbreak 7:63daf39f20e1 135
dishbreak 7:63daf39f20e1 136 result.data_len = mSerial.getc();
dishbreak 7:63daf39f20e1 137
dishbreak 7:63daf39f20e1 138 result.data = new uint8_t[result.data_len];
dishbreak 7:63daf39f20e1 139 for (int i = result.data_len - 1; i >= 0; i--) {
dishbreak 7:63daf39f20e1 140 result.data[i] = mSerial.getc();
dishbreak 7:63daf39f20e1 141 }
dishbreak 7:63daf39f20e1 142 mScanResultCallback(result);
dishbreak 7:63daf39f20e1 143 }
dishbreak 3:8f43af513d87 144 }
dishbreak 3:8f43af513d87 145 }
dishbreak 3:8f43af513d87 146
dishbreak 2:3ce9a31a6a7e 147
dishbreak 2:3ce9a31a6a7e 148 //safety valve: if there are bytes remaining
dishbreak 1:3336b2391c80 149 }
dishbreak 1:3336b2391c80 150
dishbreak 1:3336b2391c80 151 void BGLib::send_bytes(uint8_t bytes[], int length) {
dishbreak 1:3336b2391c80 152 for (int i = 0; i < length; i++) {
dishbreak 1:3336b2391c80 153 mSerial.putc(bytes[i]);
dishbreak 1:3336b2391c80 154 }
dishbreak 1:3336b2391c80 155 }