134 lines
3.6 KiB
C++
134 lines
3.6 KiB
C++
#include "BLESerial.h"
|
|
|
|
// #define BLE_SERIAL_DEBUG
|
|
|
|
BLESerial* BLESerial::_instance = NULL;
|
|
|
|
BLESerial::BLESerial(unsigned char req, unsigned char rdy, unsigned char rst) :
|
|
BLEPeripheral(req, rdy, rst)
|
|
{
|
|
this->_txCount = 0;
|
|
this->_rxHead = this->_rxTail = 0;
|
|
this->_flushed = 0;
|
|
BLESerial::_instance = this;
|
|
|
|
addAttribute(this->_uartService);
|
|
addAttribute(this->_uartNameDescriptor);
|
|
setAdvertisedServiceUuid(this->_uartService.uuid());
|
|
addAttribute(this->_rxCharacteristic);
|
|
addAttribute(this->_rxNameDescriptor);
|
|
this->_rxCharacteristic.setEventHandler(BLEWritten, BLESerial::_received);
|
|
addAttribute(this->_txCharacteristic);
|
|
addAttribute(this->_txNameDescriptor);
|
|
}
|
|
|
|
void BLESerial::begin(...) {
|
|
BLEPeripheral::begin();
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.println(F("BLESerial::begin()"));
|
|
#endif
|
|
}
|
|
|
|
void BLESerial::poll() {
|
|
if (millis() < this->_flushed + 100) {
|
|
BLEPeripheral::poll();
|
|
} else {
|
|
flush();
|
|
}
|
|
}
|
|
|
|
void BLESerial::end() {
|
|
this->_rxCharacteristic.setEventHandler(BLEWritten, NULL);
|
|
this->_rxHead = this->_rxTail = 0;
|
|
flush();
|
|
BLEPeripheral::disconnect();
|
|
}
|
|
|
|
int BLESerial::available(void) {
|
|
BLEPeripheral::poll();
|
|
int retval = (this->_rxHead - this->_rxTail + sizeof(this->_rxBuffer)) % sizeof(this->_rxBuffer);
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::available() = "));
|
|
Serial.println(retval);
|
|
#endif
|
|
return retval;
|
|
}
|
|
|
|
int BLESerial::peek(void) {
|
|
BLEPeripheral::poll();
|
|
if (this->_rxTail == this->_rxHead) return -1;
|
|
uint8_t byte = this->_rxBuffer[this->_rxTail];
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::peek() = "));
|
|
Serial.print((char) byte);
|
|
Serial.print(F(" 0x"));
|
|
Serial.println(byte, HEX);
|
|
#endif
|
|
return byte;
|
|
}
|
|
|
|
int BLESerial::read(void) {
|
|
BLEPeripheral::poll();
|
|
if (this->_rxTail == this->_rxHead) return -1;
|
|
this->_rxTail = (this->_rxTail + 1) % sizeof(this->_rxBuffer);
|
|
uint8_t byte = this->_rxBuffer[this->_rxTail];
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::read() = "));
|
|
Serial.print((char) byte);
|
|
Serial.print(F(" 0x"));
|
|
Serial.println(byte, HEX);
|
|
#endif
|
|
return byte;
|
|
}
|
|
|
|
void BLESerial::flush(void) {
|
|
if (this->_txCount == 0) return;
|
|
this->_txCharacteristic.setValue(this->_txBuffer, this->_txCount);
|
|
this->_flushed = millis();
|
|
this->_txCount = 0;
|
|
BLEPeripheral::poll();
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.println(F("BLESerial::flush()"));
|
|
#endif
|
|
}
|
|
|
|
size_t BLESerial::write(uint8_t byte) {
|
|
BLEPeripheral::poll();
|
|
if (this->_txCharacteristic.subscribed() == false) return 0;
|
|
this->_txBuffer[this->_txCount++] = byte;
|
|
if (this->_txCount == sizeof(this->_txBuffer)) flush();
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::write("));
|
|
Serial.print((char) byte);
|
|
Serial.print(F(" 0x"));
|
|
Serial.print(byte, HEX);
|
|
Serial.println(F(") = 1"));
|
|
#endif
|
|
return 1;
|
|
}
|
|
|
|
BLESerial::operator bool() {
|
|
bool retval = BLEPeripheral::connected();
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::operator bool() = "));
|
|
Serial.println(retval);
|
|
#endif
|
|
return retval;
|
|
}
|
|
|
|
void BLESerial::_received(const uint8_t* data, size_t size) {
|
|
for (int i = 0; i < size; i++) {
|
|
this->_rxHead = (this->_rxHead + 1) % sizeof(this->_rxBuffer);
|
|
this->_rxBuffer[this->_rxHead] = data[i];
|
|
}
|
|
#ifdef BLE_SERIAL_DEBUG
|
|
Serial.print(F("BLESerial::received("));
|
|
for (int i = 0; i < size; i++) Serial.print((char) data[i]);
|
|
Serial.println(F(")"));
|
|
#endif
|
|
}
|
|
|
|
void BLESerial::_received(BLECentral& /*central*/, BLECharacteristic& rxCharacteristic) {
|
|
BLESerial::_instance->_received(rxCharacteristic.value(), rxCharacteristic.valueLength());
|
|
}
|