Refactoring and other updates

Dependencies:   BLE_API mbed nRF51822

Fork of nRF51822_SimpleChat by Cristi Stoican

Committer:
carbune92
Date:
Wed May 10 07:15:19 2017 +0000
Revision:
7:806b08205b25
Parent:
5:fca87573ed92
fixed minor issues

Who changed what in which revision?

UserRevisionLine numberNew contents of line
carbune92 3:b6e4e5529a52 1 #include "BTDevice.hpp"
carbune92 3:b6e4e5529a52 2
carbune92 3:b6e4e5529a52 3 BTDevice::BTDevice():
carbune92 3:b6e4e5529a52 4 txCharacteristic(uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE),
carbune92 3:b6e4e5529a52 5 rxCharacteristic(uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
carbune92 3:b6e4e5529a52 6 uartService(uart_base_uuid, uartChars, sizeof(uartChars)/sizeof(GattCharacteristic *)),
carbune92 3:b6e4e5529a52 7 pc(USBTX, USBRX),
carbune92 3:b6e4e5529a52 8 ble()
carbune92 3:b6e4e5529a52 9 {
carbune92 3:b6e4e5529a52 10 this->ctrl = 0;
carbune92 3:b6e4e5529a52 11 memset(this->txPayload, 0, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 12 memset(this->rxPayload, 0, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 13 memset(this->rx_buf, 0, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 14 this->rx_len = 0;
carbune92 3:b6e4e5529a52 15 uartChars[0] = &txCharacteristic;
carbune92 3:b6e4e5529a52 16 uartChars[1] = &rxCharacteristic;
carbune92 3:b6e4e5529a52 17 }
carbune92 3:b6e4e5529a52 18
carbune92 3:b6e4e5529a52 19 BTDevice::~BTDevice() {
carbune92 3:b6e4e5529a52 20 delete this->ctrl;
carbune92 3:b6e4e5529a52 21 }
carbune92 3:b6e4e5529a52 22
carbune92 3:b6e4e5529a52 23 void BTDevice::init() {
carbune92 3:b6e4e5529a52 24 //this->ble = BLE::Instance();
carbune92 3:b6e4e5529a52 25 ble.init(this, &BTDevice::initCallback);
carbune92 3:b6e4e5529a52 26 }
carbune92 3:b6e4e5529a52 27
carbune92 3:b6e4e5529a52 28 void BTDevice::waitForEvent() {
carbune92 3:b6e4e5529a52 29 this->ble.waitForEvent();
carbune92 3:b6e4e5529a52 30 }
carbune92 3:b6e4e5529a52 31
carbune92 3:b6e4e5529a52 32 void BTDevice::getPayload(uint8_t *buff) {
carbune92 3:b6e4e5529a52 33 int i;
carbune92 3:b6e4e5529a52 34 for (i = 0; i < TXRX_BUF_LEN; i++) {
carbune92 3:b6e4e5529a52 35 buff[i] = this->txPayload[i];
carbune92 3:b6e4e5529a52 36 }
carbune92 3:b6e4e5529a52 37 memset(this->txPayload, 0, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 38 }
carbune92 3:b6e4e5529a52 39
carbune92 3:b6e4e5529a52 40 void BTDevice::initCallback(BLE::InitializationCompleteCallbackContext *params) {
carbune92 3:b6e4e5529a52 41 // BLE& ble = params->ble;
carbune92 3:b6e4e5529a52 42 // this->ble = params->ble;
carbune92 3:b6e4e5529a52 43 ble_error_t error = params->error;
carbune92 3:b6e4e5529a52 44
carbune92 3:b6e4e5529a52 45 if (error != BLE_ERROR_NONE) {
carbune92 3:b6e4e5529a52 46 /* In case of error, forward the error handling to onBleInitError */
carbune92 7:806b08205b25 47 // onBleInitError(this->ble, error);
carbune92 3:b6e4e5529a52 48 return;
carbune92 3:b6e4e5529a52 49 }
carbune92 3:b6e4e5529a52 50
carbune92 3:b6e4e5529a52 51 /* Ensure that it is the default instance of BLE */
carbune92 3:b6e4e5529a52 52 if(this->ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
carbune92 3:b6e4e5529a52 53 return;
carbune92 3:b6e4e5529a52 54 }
carbune92 3:b6e4e5529a52 55
carbune92 3:b6e4e5529a52 56 /* set callbacks */
carbune92 3:b6e4e5529a52 57 this->ble.onDataWritten(this, &BTDevice::dataWriteCallback);
carbune92 5:fca87573ed92 58 this->ble.onDisconnection(this, &BTDevice::disconnectionCallback);
carbune92 3:b6e4e5529a52 59
carbune92 3:b6e4e5529a52 60 this->pc.baud(9600);
carbune92 3:b6e4e5529a52 61 this->pc.attach(this, &BTDevice::uartCallback, pc.RxIrq);
carbune92 3:b6e4e5529a52 62
carbune92 3:b6e4e5529a52 63 /* setup advertising */
carbune92 3:b6e4e5529a52 64 this->ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
carbune92 3:b6e4e5529a52 65 this->ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (uint8_t *)"Gigel", sizeof("Gigel")-1);
carbune92 3:b6e4e5529a52 66 this->ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
carbune92 3:b6e4e5529a52 67 this->ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
carbune92 3:b6e4e5529a52 68 (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
carbune92 3:b6e4e5529a52 69 this->ble.setAdvertisingInterval(160);
carbune92 3:b6e4e5529a52 70
carbune92 3:b6e4e5529a52 71 this->ble.addService(uartService);
carbune92 3:b6e4e5529a52 72
carbune92 3:b6e4e5529a52 73 this->ble.startAdvertising();
carbune92 3:b6e4e5529a52 74 }
carbune92 3:b6e4e5529a52 75
carbune92 3:b6e4e5529a52 76 // void BTDevice::disconnectionCallback(const BLE::DisconnectionCompleteCallbackContext *params) {
carbune92 3:b6e4e5529a52 77
carbune92 3:b6e4e5529a52 78 // pc.printf("Disconnected \r\n");
carbune92 3:b6e4e5529a52 79 // pc.printf("Restart advertising \r\n");
carbune92 3:b6e4e5529a52 80 // this->ble.startAdvertising();
carbune92 3:b6e4e5529a52 81
carbune92 3:b6e4e5529a52 82 // } //TODO if needed
carbune92 3:b6e4e5529a52 83
carbune92 3:b6e4e5529a52 84
carbune92 3:b6e4e5529a52 85
carbune92 3:b6e4e5529a52 86
carbune92 3:b6e4e5529a52 87 void BTDevice::dataWriteCallback(const GattWriteCallbackParams *params) {
carbune92 3:b6e4e5529a52 88 uint8_t buf[TXRX_BUF_LEN];
carbune92 3:b6e4e5529a52 89 uint16_t bytesRead;
carbune92 3:b6e4e5529a52 90
carbune92 3:b6e4e5529a52 91 if (params->handle == txCharacteristic.getValueAttribute().getHandle()) {
carbune92 3:b6e4e5529a52 92 this->ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
carbune92 3:b6e4e5529a52 93 memcpy(this->txPayload, buf, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 94 //decode();
carbune92 3:b6e4e5529a52 95 //WriteBuffer(GlobalCommand);
carbune92 3:b6e4e5529a52 96 // conn_state_machine(&buf[0], &buf[1]);
carbune92 3:b6e4e5529a52 97 }
carbune92 3:b6e4e5529a52 98 }
carbune92 3:b6e4e5529a52 99
carbune92 5:fca87573ed92 100 void BTDevice::disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
carbune92 5:fca87573ed92 101 //TODO
carbune92 5:fca87573ed92 102 }
carbune92 5:fca87573ed92 103
carbune92 3:b6e4e5529a52 104 void BTDevice::uartCallback(void) {
carbune92 3:b6e4e5529a52 105
carbune92 3:b6e4e5529a52 106 while(pc.readable()) {
carbune92 3:b6e4e5529a52 107 this->rx_buf[rx_len++] = pc.getc();
carbune92 3:b6e4e5529a52 108 if(this->rx_len >= 20 || this->rx_buf[rx_len-1] == '\0' || this->rx_buf[rx_len-1] == '\n') {
carbune92 3:b6e4e5529a52 109 this->ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), rx_buf, rx_len);
carbune92 3:b6e4e5529a52 110 this->rx_len = 0;
carbune92 3:b6e4e5529a52 111 break;
carbune92 3:b6e4e5529a52 112 }
carbune92 3:b6e4e5529a52 113 }
carbune92 3:b6e4e5529a52 114
carbune92 3:b6e4e5529a52 115 }
carbune92 3:b6e4e5529a52 116
carbune92 3:b6e4e5529a52 117 void BTDevice::sentMsg(uint8_t *msg) {
carbune92 3:b6e4e5529a52 118 this->ble.updateCharacteristicValue(rxCharacteristic.getValueAttribute().getHandle(), msg, TXRX_BUF_LEN);
carbune92 3:b6e4e5529a52 119 }
carbune92 3:b6e4e5529a52 120
carbune92 3:b6e4e5529a52 121 bool BTDevice::isInit() {
carbune92 3:b6e4e5529a52 122 return this->ble.hasInitialized();
carbune92 3:b6e4e5529a52 123 }
carbune92 3:b6e4e5529a52 124
carbune92 3:b6e4e5529a52 125 void BTDevice::attachController(Controller *c) {
carbune92 3:b6e4e5529a52 126 ctrl = c;
carbune92 3:b6e4e5529a52 127 }
carbune92 3:b6e4e5529a52 128
carbune92 3:b6e4e5529a52 129 void BTDevice::setCtrlRef(float ref) {
carbune92 3:b6e4e5529a52 130 this->ctrl->updateRef(ref);
carbune92 3:b6e4e5529a52 131 }
carbune92 3:b6e4e5529a52 132
carbune92 3:b6e4e5529a52 133 void BTDevice::setCtrlParams(ControllerParams &cp) {
carbune92 3:b6e4e5529a52 134 this->ctrl->updateParams(cp);
carbune92 3:b6e4e5529a52 135 }
carbune92 3:b6e4e5529a52 136
carbune92 3:b6e4e5529a52 137 void BTDevice::updateOut(float _out) {
carbune92 3:b6e4e5529a52 138 out = _out;
carbune92 3:b6e4e5529a52 139 }
carbune92 3:b6e4e5529a52 140
carbune92 3:b6e4e5529a52 141 bool BTDevice::ctrlExists() {
carbune92 3:b6e4e5529a52 142 return 0 == this->ctrl;
carbune92 3:b6e4e5529a52 143 }
carbune92 3:b6e4e5529a52 144
carbune92 3:b6e4e5529a52 145 Controller* BTDevice::getCtrl() {
carbune92 3:b6e4e5529a52 146 return this->ctrl;
carbune92 3:b6e4e5529a52 147 }
carbune92 3:b6e4e5529a52 148
carbune92 3:b6e4e5529a52 149 /*
carbune92 3:b6e4e5529a52 150 void BTDevice::interpretCmd(uint8_t cmd[TXRX_BUF_LEN]) {
carbune92 3:b6e4e5529a52 151
carbune92 3:b6e4e5529a52 152 // ex:
carbune92 3:b6e4e5529a52 153 // ctrl<PI>_create<>
carbune92 3:b6e4e5529a52 154 // ctrl<PI>_updateParams<4.5,1>
carbune92 3:b6e4e5529a52 155 // ctrl<PI>_updateRef<10>
carbune92 3:b6e4e5529a52 156
carbune92 3:b6e4e5529a52 157 SysObj obj;
carbune92 3:b6e4e5529a52 158 SysObjTypes type;
carbune92 3:b6e4e5529a52 159 Action act;
carbune92 3:b6e4e5529a52 160 uint8_t actionParams[TXRX_BUF_LEN];
carbune92 3:b6e4e5529a52 161
carbune92 3:b6e4e5529a52 162 getTokens(*this, &obj, &type, &act);
carbune92 3:b6e4e5529a52 163
carbune92 3:b6e4e5529a52 164 // this->getTokens(cmd,&obj,&objType,&action,&actionParam);
carbune92 3:b6e4e5529a52 165
carbune92 3:b6e4e5529a52 166 // ControllerFactory cf;
carbune92 3:b6e4e5529a52 167
carbune92 3:b6e4e5529a52 168 // state machine for commands
carbune92 3:b6e4e5529a52 169 // ...
carbune92 3:b6e4e5529a52 170 // ex:
carbune92 3:b6e4e5529a52 171 // if("ctrl"==obj && action=="create") {
carbune92 3:b6e4e5529a52 172 // Controller *c = cf.createController(objType);
carbune92 3:b6e4e5529a52 173 // this->attachController(c); //currentCtrl = c;
carbune92 3:b6e4e5529a52 174 // }
carbune92 3:b6e4e5529a52 175
carbune92 3:b6e4e5529a52 176 // else if("ctrl"==obj && action=="updateParams") {
carbune92 3:b6e4e5529a52 177 // ControllerParams cp = cf.createCtrlParams(objType,actionParams);
carbune92 3:b6e4e5529a52 178 // this->setCtrlParams(cp);
carbune92 3:b6e4e5529a52 179 // }
carbune92 3:b6e4e5529a52 180
carbune92 3:b6e4e5529a52 181 // else if("ctrl"==obj && action=="updateRef") {
carbune92 3:b6e4e5529a52 182 // this->setCtrlRef(actionParams);
carbune92 3:b6e4e5529a52 183 // }
carbune92 3:b6e4e5529a52 184 // ....
carbune92 3:b6e4e5529a52 185
carbune92 3:b6e4e5529a52 186 }
carbune92 3:b6e4e5529a52 187
carbune92 3:b6e4e5529a52 188
carbune92 3:b6e4e5529a52 189 friend void getTokens(uint8_t cmd[TXRX_BUF_LEN], BTDevice &bt, SysObj &obj, SysObjTypes &type, Actions &act, uint8_t actionParams[TXRX_BUF_LEN]) {}
carbune92 3:b6e4e5529a52 190 */