#include "BluetoothSerial.h"
#include "driver/uart.h"
#define BAUD_RATE 115200 * 8
#define SIZE_BUFFER 256
#define SIZE_FIFO SIZE_BUFFER * 8
#define SAVE_MODE
//#define DEBUG_MODE
//#define USE_PIN
#ifdef USE_PIN
const char* pin = "1234";
#endif
const String device_name = "SCANMATIK #A111788";
BluetoothSerial SerialBT;
uint8_t buffer[SIZE_BUFFER];
unsigned int available=0;
unsigned int availableBT=0;
size_t bytesRead=0;
size_t bytesWrite=0;
#ifdef SAVE_MODE
uint32_t min_delay = 1;
uint32_t max_delay = min_delay * 1024;
uint32_t cur_delay = min_delay;
uint32_t critical_size = SIZE_FIFO / 2;
#endif
#ifdef DEBUG_MODE
#include <chrono>
using namespace std::chrono;
auto timePointSerial = high_resolution_clock::now();
auto timePointBT = high_resolution_clock::now();
#endif
void setup() {
Serial.setRxBufferSize(SIZE_FIFO);
Serial.setTxBufferSize(SIZE_FIFO);
Serial.begin(BAUD_RATE);
memset(buffer, 0, sizeof(buffer));
// setup UART from hardware (RTS/CTS)
uart_set_pin(UART_NUM_0, 1, 3, 22, 19); // UART, TX, RX, RTS, CTS
uart_set_hw_flow_ctrl(UART_NUM_0, UART_HW_FLOWCTRL_CTS_RTS, 64);
uart_set_mode(UART_NUM_0, UART_MODE_UART);
SerialBT.begin(device_name);
#ifdef USE_PIN
SerialBT.setPin(pin);
#endif
Serial.print("AT-AB -BypassMode-\n");
}
void loop() {
available = Serial.available();
if (available > 0) {
bytesRead = Serial.readBytes(buffer, min(available, sizeof(buffer)));
bytesWrite = SerialBT.write(buffer, bytesRead);
#ifdef SAVE_MODE
if (cur_delay > min_delay) {
cur_delay /= 2;
}
#endif
#ifdef DEBUG_MODE
auto timeoutSerial = high_resolution_clock::now() - timePointSerial;
Serial.printf("\n\rAvailable from Serial %u, cur_delay %u , timeout %u\n", available, cur_delay, duration_cast<microseconds>(timeoutSerial).count());
Serial.printf("\n\rFrom Serial to BT Read = %u, Write = %u\n", bytesRead, bytesWrite);
timePointSerial = high_resolution_clock::now();
#endif
}
availableBT = SerialBT.available();
if (availableBT > 0) {
bytesRead = SerialBT.readBytes(buffer, min(availableBT, sizeof(buffer)));
bytesWrite = Serial.write(buffer, bytesRead);
#ifdef SAVE_MODE
if (cur_delay > min_delay) {
cur_delay /= 2;
}
#endif
#ifdef DEBUG_MODE
auto timeoutBT = high_resolution_clock::now() - timePointBT;
Serial.printf("\n\rAvailable from BT %u, cur_delay %u, timeout %u\n", availableBT, cur_delay, duration_cast<microseconds>(timeoutBT).count());
Serial.printf("\n\rFrom BT to Serial Read = %u, Write = %u\n", bytesRead, bytesWrite);
timePointBT = high_resolution_clock::now();
#endif
}
#ifdef SAVE_MODE
if ((available < critical_size) && (availableBT < critical_size)) {
delay(cur_delay);
}
if ((available <= 0) && (availableBT <= 0)) {
if (cur_delay < max_delay) {
cur_delay *= 2;
}
}
#endif
}
для визуального контроля работы интерфейсов раскоментировать //#define DEBUG_MODE
Это для экспериментов до установки в сканматик. Устанавливать с включенным DEBUG лучше не надо