this is using the mbed os version 5-13-1
Diff: source/BleManager.cpp
- Branch:
- PassingRegression
- Revision:
- 119:8d939a902333
- Parent:
- 118:8df0e9c2ee3f
- Child:
- 120:779b74689747
--- a/source/BleManager.cpp Sat May 25 16:25:42 2019 +0000
+++ b/source/BleManager.cpp Mon May 27 12:34:58 2019 +0000
@@ -32,7 +32,7 @@
//static const uint8_t DEVICE_NAME[] = "SM_device";
//static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID};
extern UARTService *uart;
-extern char buffer[BUFFER_LEN];
+
/** This example demonstrates all the basic setup required
* for pairing and setting up link security both as a central and peripheral
*
@@ -97,10 +97,13 @@
ble_error_t error;
/* to show we're running we'll blink every 10secs */
- _event_queue.call_every(10000, this, &SMDevice::blink);
+ //_event_queue.call_every(10000, this, &SMDevice::blink);
/* to show we're advertising we'll print status every minute */
- _event_queue.call_every(60000, this, &SMDevice::reportGapState);
+ //_event_queue.call_every(60000, this, &SMDevice::reportGapState);
+
+ /* process queues every BLE_PROCESS_QUEUES_INTERVAL_MS */
+ _event_queue.call_every(BLE_PROCESS_QUEUES_INTERVAL_MS, this, &SMDevice::processQueues);
@@ -534,6 +537,94 @@
}
+void SMDevicePeripheral::processQueues()
+{
+ dequeueATdataResponse();
+ switch(bleCmd)
+ {
+ case BLE_CMD_NONE:
+ break;
+ case BLE_CMD_CONFIG:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ case BLE_CMD_CONNECT:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ case BLE_CMD_DISCONNECT:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ case BLE_CMD_SEND_RX_DATA_2AT:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ case BLE_CMD_SEND_AT_DATA_2BLE:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ default:
+ _aT2BleDatamPool->free(data_msg);
+ bleCmd = BLE_CMD_NONE;
+ break;
+ }
+
+}
+
+
+bool SMDevicePeripheral::queueBleDataResponse(ble_at_msg_t at_resp)
+{
+ ble_at_msg_t *atData = _ble2ATDatamPool->alloc();
+ if(atData == NULL) return false; // queue full;
+ atData->at_resp = at_resp.at_resp;
+ atData->dataLen = at_resp.dataLen;
+ memcpy(atData->buffer, at_resp.buffer, at_resp.dataLen);
+ _ble2ATDataQueue->put(atData);
+ dbg_printf(LOG, "[BLE-MAN] queued data size = %d : at_resp = %d\n", at_resp.dataLen, at_resp.at_resp);
+ return true;
+}
+
+
+bool SMDevicePeripheral::dequeueATdataResponse(){
+ if(bleCmd != BLE_CMD_NONE) return false; // busy
+ osEvent evt = _aT2BleDataQueue->get(0);
+ if(evt.status == osEventMessage){
+ data_msg = (at_ble_msg_t*)evt.value.p;
+ setNextCommand(data_msg->ble_cmd);
+ //_wiFi2ATDatamPool->free(data_msg);
+ }
+ return true;
+}
+
+void SMDevicePeripheral::sendATresponseBytes(at_cmd_resp_t at_cmd, const uint8_t * buf, int len)
+{
+ at_data_resp = new ble_at_msg_t;
+ // package and send on BLE data queue
+ // set string length
+ at_data_resp->dataLen = len;
+ // copy data
+ memcpy(at_data_resp->buffer, buf, len);
+ // copy response type
+ at_data_resp->at_resp = at_cmd;
+ bool queueResult = true;
+ int wait_count = 0;
+ queueResult = queueBleDataResponse(*at_data_resp);
+ delete at_data_resp;
+ at_data_resp = NULL;
+ dbg_printf(LOG, "[BLE-MAN] sendATresponseBytes completed successfully\r\n");
+}
+
+bool SMDevicePeripheral::setNextCommand(ble_cmd_t cmd)
+{
+ dbg_printf(LOG, "\n [BLE-MAN] About to set next BLE manager command to %d\n", cmd);
+ if(bleCmd == BLE_CMD_NONE){
+ bleCmd = cmd;
+ return true; // success
+ }
+ dbg_printf(LOG, "\n [BLE-MAN] Busy : current state = %d \n", bleCmd);
+ return false; // BleManager busy
+}
/** A central device will scan, connect to a peer and request pairing. */