#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()); }