
Refactoring and other updates
Dependencies: BLE_API mbed nRF51822
Fork of nRF51822_SimpleChat by
BTDevice.cpp@7:806b08205b25, 2017-05-10 (annotated)
- 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?
User | Revision | Line number | New 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 | */ |