LP Long Distance IR Vision Robot

Dependencies:   max77650_charger_sample BufferedSerial SX1276GenericLib Adafruit-MotorShield NEO-6m-GPS MAX17055_EZconfig Adafruit_GFX USBDeviceHT Adafruit-PWM-Servo-Driver

Committer:
walterluu
Date:
Wed Dec 29 06:53:23 2021 +0000
Revision:
44:8be011a3fba0
Parent:
30:66f9750cc44c
LP Long Distance IR Vision Robot;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dev_alexander 29:f7a0e49b826b 1 /* mbed Microcontroller Library
dev_alexander 29:f7a0e49b826b 2 * Copyright (c) 2006-2013 ARM Limited
dev_alexander 29:f7a0e49b826b 3 *
dev_alexander 29:f7a0e49b826b 4 * Licensed under the Apache License, Version 2.0 (the "License");
dev_alexander 29:f7a0e49b826b 5 * you may not use this file except in compliance with the License.
dev_alexander 29:f7a0e49b826b 6 * You may obtain a copy of the License at
dev_alexander 29:f7a0e49b826b 7 *
dev_alexander 29:f7a0e49b826b 8 * http://www.apache.org/licenses/LICENSE-2.0
dev_alexander 29:f7a0e49b826b 9 *
dev_alexander 29:f7a0e49b826b 10 * Unless required by applicable law or agreed to in writing, software
dev_alexander 29:f7a0e49b826b 11 * distributed under the License is distributed on an "AS IS" BASIS,
dev_alexander 29:f7a0e49b826b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dev_alexander 29:f7a0e49b826b 13 * See the License for the specific language governing permissions and
dev_alexander 29:f7a0e49b826b 14 * limitations under the License.
dev_alexander 29:f7a0e49b826b 15 */
dev_alexander 29:f7a0e49b826b 16
dev_alexander 29:f7a0e49b826b 17 #ifndef __BLE_UART_SERVICE_H__
dev_alexander 29:f7a0e49b826b 18 #define __BLE_UART_SERVICE_H__
dev_alexander 29:f7a0e49b826b 19
dev_alexander 29:f7a0e49b826b 20 #ifdef YOTTA_CFG_MBED_OS
dev_alexander 29:f7a0e49b826b 21 #include "mbed-drivers/mbed.h"
dev_alexander 29:f7a0e49b826b 22 #include "mbed-drivers/Stream.h"
dev_alexander 29:f7a0e49b826b 23 #else
dev_alexander 29:f7a0e49b826b 24 #include "mbed.h"
dev_alexander 29:f7a0e49b826b 25 #include "Stream.h"
dev_alexander 29:f7a0e49b826b 26 #endif
dev_alexander 29:f7a0e49b826b 27
dev_alexander 29:f7a0e49b826b 28 #include "ble/UUID.h"
dev_alexander 29:f7a0e49b826b 29 #include "ble/BLE.h"
dev_alexander 29:f7a0e49b826b 30
dev_alexander 29:f7a0e49b826b 31 extern const uint8_t UARTServiceBaseUUID[UUID::LENGTH_OF_LONG_UUID];
dev_alexander 29:f7a0e49b826b 32 extern const uint16_t UARTServiceShortUUID;
dev_alexander 29:f7a0e49b826b 33 extern const uint16_t UARTServiceTXCharacteristicShortUUID;
dev_alexander 29:f7a0e49b826b 34 extern const uint16_t UARTServiceRXCharacteristicShortUUID;
dev_alexander 29:f7a0e49b826b 35
dev_alexander 29:f7a0e49b826b 36 extern const uint8_t UARTServiceUUID[UUID::LENGTH_OF_LONG_UUID];
dev_alexander 29:f7a0e49b826b 37 extern const uint8_t UARTServiceUUID_reversed[UUID::LENGTH_OF_LONG_UUID];
dev_alexander 29:f7a0e49b826b 38
dev_alexander 29:f7a0e49b826b 39 extern const uint8_t UARTServiceTXCharacteristicUUID[UUID::LENGTH_OF_LONG_UUID];
dev_alexander 29:f7a0e49b826b 40 extern const uint8_t UARTServiceRXCharacteristicUUID[UUID::LENGTH_OF_LONG_UUID];
dev_alexander 29:f7a0e49b826b 41
dev_alexander 29:f7a0e49b826b 42 /**
dev_alexander 29:f7a0e49b826b 43 * @class UARTService.
dev_alexander 29:f7a0e49b826b 44 * @brief BLE Service to enable UART over BLE.
dev_alexander 29:f7a0e49b826b 45 */
dev_alexander 29:f7a0e49b826b 46 class UARTService {
dev_alexander 29:f7a0e49b826b 47 public:
dev_alexander 29:f7a0e49b826b 48 /**< Maximum length of data (in bytes) that the UART service module can transmit to the peer. */
dev_alexander 29:f7a0e49b826b 49 static const unsigned BLE_UART_SERVICE_MAX_DATA_LEN = (BLE_GATT_MTU_SIZE_DEFAULT - 18);
dev_alexander 29:f7a0e49b826b 50
dev_alexander 29:f7a0e49b826b 51 public:
dev_alexander 29:f7a0e49b826b 52
dev_alexander 29:f7a0e49b826b 53 /**
dev_alexander 29:f7a0e49b826b 54 * @param[ref] ble
dev_alexander 29:f7a0e49b826b 55 * BLE object for the underlying controller.
dev_alexander 29:f7a0e49b826b 56 */
dev_alexander 29:f7a0e49b826b 57 UARTService(BLE &_ble) :
dev_alexander 29:f7a0e49b826b 58 ble(_ble),
dev_alexander 29:f7a0e49b826b 59 receiveBuffer(),
dev_alexander 29:f7a0e49b826b 60 sendBuffer(),
dev_alexander 29:f7a0e49b826b 61 sendBufferIndex(0),
dev_alexander 29:f7a0e49b826b 62 numBytesReceived(0),
dev_alexander 29:f7a0e49b826b 63 receiveBufferIndex(0),
dev_alexander 29:f7a0e49b826b 64 txCharacteristic(UARTServiceTXCharacteristicUUID, receiveBuffer, 1, BLE_UART_SERVICE_MAX_DATA_LEN,
dev_alexander 29:f7a0e49b826b 65 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE),
dev_alexander 29:f7a0e49b826b 66 rxCharacteristic(UARTServiceRXCharacteristicUUID, sendBuffer, 1, BLE_UART_SERVICE_MAX_DATA_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY) {
dev_alexander 29:f7a0e49b826b 67 GattCharacteristic *charTable[] = {&txCharacteristic, &rxCharacteristic};
dev_alexander 29:f7a0e49b826b 68 GattService uartService(UARTServiceUUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
dev_alexander 29:f7a0e49b826b 69
dev_alexander 30:66f9750cc44c 70 ble.gattServer().addService(uartService);
dev_alexander 30:66f9750cc44c 71 ble.gattServer().onDataWritten(this, &UARTService::onDataWritten);
dev_alexander 29:f7a0e49b826b 72 }
dev_alexander 29:f7a0e49b826b 73
dev_alexander 29:f7a0e49b826b 74 /**
dev_alexander 29:f7a0e49b826b 75 * Note: TX and RX characteristics are to be interpreted from the viewpoint of the GATT client using this service.
dev_alexander 29:f7a0e49b826b 76 */
dev_alexander 29:f7a0e49b826b 77 uint16_t getTXCharacteristicHandle() {
dev_alexander 29:f7a0e49b826b 78 return txCharacteristic.getValueAttribute().getHandle();
dev_alexander 29:f7a0e49b826b 79 }
dev_alexander 29:f7a0e49b826b 80
dev_alexander 29:f7a0e49b826b 81 /**
dev_alexander 29:f7a0e49b826b 82 * Note: TX and RX characteristics are to be interpreted from the viewpoint of the GATT client using this service.
dev_alexander 29:f7a0e49b826b 83 */
dev_alexander 29:f7a0e49b826b 84 uint16_t getRXCharacteristicHandle() {
dev_alexander 29:f7a0e49b826b 85 return rxCharacteristic.getValueAttribute().getHandle();
dev_alexander 29:f7a0e49b826b 86 }
dev_alexander 29:f7a0e49b826b 87
dev_alexander 29:f7a0e49b826b 88 /**
dev_alexander 29:f7a0e49b826b 89 * We attempt to collect bytes before pushing them to the UART RX
dev_alexander 29:f7a0e49b826b 90 * characteristic; writing to the RX characteristic then generates
dev_alexander 29:f7a0e49b826b 91 * notifications for the client. Updates made in quick succession to a
dev_alexander 29:f7a0e49b826b 92 * notification-generating characteristic result in data being buffered
dev_alexander 29:f7a0e49b826b 93 * in the Bluetooth stack as notifications are sent out. The stack has
dev_alexander 29:f7a0e49b826b 94 * its limits for this buffering - typically a small number under 10.
dev_alexander 29:f7a0e49b826b 95 * Collecting data into the sendBuffer buffer helps mitigate the rate of
dev_alexander 29:f7a0e49b826b 96 * updates. But we shouldn't buffer a large amount of data before updating
dev_alexander 29:f7a0e49b826b 97 * the characteristic, otherwise the client needs to turn around and make
dev_alexander 29:f7a0e49b826b 98 * a long read request; this is because notifications include only the first
dev_alexander 29:f7a0e49b826b 99 * 20 bytes of the updated data.
dev_alexander 29:f7a0e49b826b 100 *
dev_alexander 29:f7a0e49b826b 101 * @param buffer The received update.
dev_alexander 29:f7a0e49b826b 102 * @param length Number of characters to be appended.
dev_alexander 29:f7a0e49b826b 103 * @return Number of characters appended to the rxCharacteristic.
dev_alexander 29:f7a0e49b826b 104 */
dev_alexander 29:f7a0e49b826b 105 size_t write(const void *_buffer, size_t length) {
dev_alexander 29:f7a0e49b826b 106 size_t origLength = length;
dev_alexander 29:f7a0e49b826b 107 const uint8_t *buffer = static_cast<const uint8_t *>(_buffer);
dev_alexander 29:f7a0e49b826b 108
dev_alexander 30:66f9750cc44c 109 if (ble.gap().getState().connected) {
dev_alexander 29:f7a0e49b826b 110 unsigned bufferIndex = 0;
dev_alexander 29:f7a0e49b826b 111 while (length) {
dev_alexander 29:f7a0e49b826b 112 unsigned bytesRemainingInSendBuffer = BLE_UART_SERVICE_MAX_DATA_LEN - sendBufferIndex;
dev_alexander 29:f7a0e49b826b 113 unsigned bytesToCopy = (length < bytesRemainingInSendBuffer) ? length : bytesRemainingInSendBuffer;
dev_alexander 29:f7a0e49b826b 114
dev_alexander 29:f7a0e49b826b 115 /* Copy bytes into sendBuffer. */
dev_alexander 29:f7a0e49b826b 116 memcpy(&sendBuffer[sendBufferIndex], &buffer[bufferIndex], bytesToCopy);
dev_alexander 29:f7a0e49b826b 117 length -= bytesToCopy;
dev_alexander 29:f7a0e49b826b 118 sendBufferIndex += bytesToCopy;
dev_alexander 29:f7a0e49b826b 119 bufferIndex += bytesToCopy;
dev_alexander 29:f7a0e49b826b 120
dev_alexander 29:f7a0e49b826b 121 /* Have we collected enough? */
dev_alexander 29:f7a0e49b826b 122 if ((sendBufferIndex == BLE_UART_SERVICE_MAX_DATA_LEN) ||
dev_alexander 29:f7a0e49b826b 123 // (sendBuffer[sendBufferIndex - 1] == '\r') ||
dev_alexander 29:f7a0e49b826b 124 (sendBuffer[sendBufferIndex - 1] == '\n')) {
dev_alexander 29:f7a0e49b826b 125 ble.gattServer().write(getRXCharacteristicHandle(), static_cast<const uint8_t *>(sendBuffer), sendBufferIndex);
dev_alexander 29:f7a0e49b826b 126 sendBufferIndex = 0;
dev_alexander 29:f7a0e49b826b 127 }
dev_alexander 29:f7a0e49b826b 128 }
dev_alexander 29:f7a0e49b826b 129 }
dev_alexander 29:f7a0e49b826b 130
dev_alexander 29:f7a0e49b826b 131 return origLength;
dev_alexander 29:f7a0e49b826b 132 }
dev_alexander 29:f7a0e49b826b 133
dev_alexander 29:f7a0e49b826b 134 /**
dev_alexander 29:f7a0e49b826b 135 * Helper function to write out strings.
dev_alexander 29:f7a0e49b826b 136 * @param str The received string.
dev_alexander 29:f7a0e49b826b 137 * @return Number of characters appended to the rxCharacteristic.
dev_alexander 29:f7a0e49b826b 138 */
dev_alexander 29:f7a0e49b826b 139 size_t writeString(const char *str) {
dev_alexander 29:f7a0e49b826b 140 return write(str, strlen(str));
dev_alexander 29:f7a0e49b826b 141 }
dev_alexander 29:f7a0e49b826b 142
dev_alexander 29:f7a0e49b826b 143 /**
dev_alexander 29:f7a0e49b826b 144 * Override for Stream::_putc().
dev_alexander 29:f7a0e49b826b 145 * @param c
dev_alexander 29:f7a0e49b826b 146 * This function writes the character c, cast to an unsigned char, to stream.
dev_alexander 29:f7a0e49b826b 147 * @return
dev_alexander 29:f7a0e49b826b 148 * The character written as an unsigned char cast to an int or EOF on error.
dev_alexander 29:f7a0e49b826b 149 */
dev_alexander 29:f7a0e49b826b 150 int _putc(int c) {
dev_alexander 29:f7a0e49b826b 151 return (write(&c, 1) == 1) ? 1 : EOF;
dev_alexander 29:f7a0e49b826b 152 }
dev_alexander 29:f7a0e49b826b 153
dev_alexander 29:f7a0e49b826b 154 /**
dev_alexander 29:f7a0e49b826b 155 * Override for Stream::_getc().
dev_alexander 29:f7a0e49b826b 156 * @return
dev_alexander 29:f7a0e49b826b 157 * The character read.
dev_alexander 29:f7a0e49b826b 158 */
dev_alexander 29:f7a0e49b826b 159 int _getc() {
dev_alexander 29:f7a0e49b826b 160 if (receiveBufferIndex == numBytesReceived) {
dev_alexander 29:f7a0e49b826b 161 return EOF;
dev_alexander 29:f7a0e49b826b 162 }
dev_alexander 29:f7a0e49b826b 163
dev_alexander 29:f7a0e49b826b 164 return receiveBuffer[receiveBufferIndex++];
dev_alexander 29:f7a0e49b826b 165 }
dev_alexander 29:f7a0e49b826b 166
dev_alexander 29:f7a0e49b826b 167 protected:
dev_alexander 29:f7a0e49b826b 168 /**
dev_alexander 29:f7a0e49b826b 169 * This callback allows the UART service to receive updates to the
dev_alexander 29:f7a0e49b826b 170 * txCharacteristic. The application should forward the call to this
dev_alexander 29:f7a0e49b826b 171 * function from the global onDataWritten() callback handler; if that's
dev_alexander 29:f7a0e49b826b 172 * not used, this method can be used as a callback directly.
dev_alexander 29:f7a0e49b826b 173 */
dev_alexander 29:f7a0e49b826b 174 void onDataWritten(const GattWriteCallbackParams *params) {
dev_alexander 29:f7a0e49b826b 175 if (params->handle == getTXCharacteristicHandle()) {
dev_alexander 29:f7a0e49b826b 176 uint16_t bytesRead = params->len;
dev_alexander 29:f7a0e49b826b 177 if (bytesRead <= BLE_UART_SERVICE_MAX_DATA_LEN) {
dev_alexander 29:f7a0e49b826b 178 numBytesReceived = bytesRead;
dev_alexander 29:f7a0e49b826b 179 receiveBufferIndex = 0;
dev_alexander 29:f7a0e49b826b 180 memcpy(receiveBuffer, params->data, numBytesReceived);
dev_alexander 29:f7a0e49b826b 181 }
dev_alexander 29:f7a0e49b826b 182 }
dev_alexander 29:f7a0e49b826b 183 }
dev_alexander 29:f7a0e49b826b 184
dev_alexander 29:f7a0e49b826b 185 protected:
dev_alexander 29:f7a0e49b826b 186 BLE &ble;
dev_alexander 29:f7a0e49b826b 187
dev_alexander 29:f7a0e49b826b 188 uint8_t receiveBuffer[BLE_UART_SERVICE_MAX_DATA_LEN]; /**< The local buffer into which we receive
dev_alexander 29:f7a0e49b826b 189 * inbound data before forwarding it to the
dev_alexander 29:f7a0e49b826b 190 * application. */
dev_alexander 29:f7a0e49b826b 191
dev_alexander 29:f7a0e49b826b 192 uint8_t sendBuffer[BLE_UART_SERVICE_MAX_DATA_LEN]; /**< The local buffer into which outbound data is
dev_alexander 29:f7a0e49b826b 193 * accumulated before being pushed to the
dev_alexander 29:f7a0e49b826b 194 * rxCharacteristic. */
dev_alexander 29:f7a0e49b826b 195 uint8_t sendBufferIndex;
dev_alexander 29:f7a0e49b826b 196 uint8_t numBytesReceived;
dev_alexander 29:f7a0e49b826b 197 uint8_t receiveBufferIndex;
dev_alexander 29:f7a0e49b826b 198
dev_alexander 29:f7a0e49b826b 199 GattCharacteristic txCharacteristic; /**< From the point of view of the external client, this is the characteristic
dev_alexander 29:f7a0e49b826b 200 * they'd write into in order to communicate with this application. */
dev_alexander 29:f7a0e49b826b 201 GattCharacteristic rxCharacteristic; /**< From the point of view of the external client, this is the characteristic
dev_alexander 29:f7a0e49b826b 202 * they'd read from in order to receive the bytes transmitted by this
dev_alexander 29:f7a0e49b826b 203 * application. */
dev_alexander 29:f7a0e49b826b 204 };
dev_alexander 29:f7a0e49b826b 205
dev_alexander 29:f7a0e49b826b 206 #endif /* #ifndef __BLE_UART_SERVICE_H__*/