184 lines
5.9 KiB
C++
184 lines
5.9 KiB
C++
#define BAUDRATE 115200
|
|
#define DEBUGOUTPUT 0
|
|
#include <map> // Bluetooth
|
|
#include <BluetoothSerial.h> // Bluetooth
|
|
#include <M5Core2.h>
|
|
|
|
// Bluetooth Serial, variables
|
|
BluetoothSerial SerialBT;
|
|
#define BT_DISCOVER_TIME 10000
|
|
esp_spp_sec_t sec_mask=ESP_SPP_SEC_NONE;
|
|
esp_spp_role_t role=ESP_SPP_ROLE_SLAVE;
|
|
|
|
// checksum variables
|
|
byte generatedChecksum = 0;
|
|
byte checksum = 0;
|
|
int payloadLength = 0;
|
|
byte payloadData[64] = {0};
|
|
byte poorQuality = 0;
|
|
byte attention = 0;
|
|
byte meditation = 0;
|
|
|
|
// system variables
|
|
long lastReceivedPacket = 0;
|
|
boolean bigPacket = false;
|
|
|
|
//////////////////////////
|
|
// Microprocessor Setup //
|
|
//////////////////////////
|
|
|
|
void setup(){
|
|
Serial.begin(BAUDRATE);
|
|
M5.begin();
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
//////////////////////////
|
|
// BLUETOOTH CONNECTION //
|
|
//////////////////////////
|
|
|
|
if(! SerialBT.begin("ESP32test", true) ) {
|
|
Serial.println("========== serialBT failed!");
|
|
abort();
|
|
}
|
|
|
|
Serial.println("Starting discoverAsync...");
|
|
BTScanResults* btDeviceList = SerialBT.getScanResults();
|
|
if (SerialBT.discoverAsync([](BTAdvertisedDevice* pDevice) {
|
|
Serial.printf(">>>>>>>>>>>Found a new device asynchronously: %s\n", pDevice->toString().c_str());
|
|
} )
|
|
) {
|
|
delay(BT_DISCOVER_TIME);
|
|
Serial.print("Stopping discoverAsync... ");
|
|
SerialBT.discoverAsyncStop();
|
|
Serial.println("discoverAsync stopped");
|
|
delay(5000);
|
|
if(btDeviceList->getCount() > 0) {
|
|
BTAddress addr;
|
|
int channel=0;
|
|
Serial.println("Found devices:");
|
|
for (int i=0; i < btDeviceList->getCount(); i++) {
|
|
BTAdvertisedDevice *device=btDeviceList->getDevice(i);
|
|
Serial.printf(" ----- %s %s %d\n", device->getAddress().toString().c_str(), device->getName().c_str(), device->getRSSI());
|
|
std::map<int,std::string> channels=SerialBT.getChannels(device->getAddress());
|
|
Serial.printf("scanned for services, found %d\n", channels.size());
|
|
for(auto const &entry : channels) {
|
|
Serial.printf(" channel %d (%s)\n", entry.first, entry.second.c_str());
|
|
}
|
|
if(channels.size() > 0) {
|
|
addr = device->getAddress();
|
|
channel=channels.begin()->first;
|
|
}
|
|
}
|
|
if(addr) {
|
|
Serial.printf("connecting to %s - %d\n", addr.toString().c_str(), channel);
|
|
SerialBT.connect(addr, channel, sec_mask, role);
|
|
}
|
|
} else {
|
|
Serial.println("Didn't find any devices");
|
|
}
|
|
} else {
|
|
Serial.println("Error on discoverAsync f.e. not workin after a \"connect\"");
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------------------------------------------------
|
|
}
|
|
|
|
/////////////////////////////////////
|
|
// Read data from Serial Bluetooth //
|
|
/////////////////////////////////////
|
|
|
|
byte ReadOneByte() {
|
|
int ByteRead;
|
|
if(! SerialBT.isClosed() && SerialBT.connected()) {
|
|
while(!SerialBT.available());
|
|
ByteRead = SerialBT.read();
|
|
|
|
#if DEBUGOUTPUT
|
|
Serial.print((char)ByteRead); // echo the same byte out the USB serial (for debug purposes)
|
|
#endif
|
|
|
|
return ByteRead;
|
|
} else {
|
|
Serial.println("not connected");
|
|
}
|
|
}
|
|
|
|
/////////////
|
|
//MAIN LOOP//
|
|
/////////////
|
|
void loop() {
|
|
// Look for sync bytes
|
|
if(ReadOneByte() == 170) {
|
|
if(ReadOneByte() == 170) {
|
|
payloadLength = ReadOneByte();
|
|
if(payloadLength > 169) //Payload length can not be greater than 169
|
|
return;
|
|
|
|
generatedChecksum = 0;
|
|
for(int i = 0; i < payloadLength; i++) {
|
|
payloadData[i] = ReadOneByte(); //Read payload into memory
|
|
generatedChecksum += payloadData[i];
|
|
}
|
|
|
|
checksum = ReadOneByte(); //Read checksum byte from stream
|
|
generatedChecksum = 255 - generatedChecksum; //Take one's compliment of generated checksum
|
|
|
|
if(checksum == generatedChecksum) {
|
|
|
|
poorQuality = 200;
|
|
attention = 0;
|
|
meditation = 0;
|
|
|
|
for(int i = 0; i < payloadLength; i++) { // Parse the payload
|
|
switch (payloadData[i]) {
|
|
case 2:
|
|
i++;
|
|
poorQuality = payloadData[i];
|
|
bigPacket = true;
|
|
break;
|
|
case 4:
|
|
i++;
|
|
attention = payloadData[i];
|
|
break;
|
|
case 5:
|
|
i++;
|
|
meditation = payloadData[i];
|
|
break;
|
|
case 0x80:
|
|
i = i + 3;
|
|
break;
|
|
case 0x83:
|
|
i = i + 25;
|
|
break;
|
|
default:
|
|
break;
|
|
} // switch
|
|
} // for loop
|
|
|
|
#if !DEBUGOUTPUT
|
|
// *** Add your code here ***
|
|
if(bigPacket) {
|
|
Serial.print("Attention: ");
|
|
Serial.print(attention);
|
|
Serial.print("\n");
|
|
Serial.print("Poor quality: ");
|
|
Serial.print(poorQuality);
|
|
Serial.print("\n");
|
|
Serial.print("Meditation: ");
|
|
Serial.print(meditation);
|
|
Serial.print("\n");
|
|
}
|
|
#endif
|
|
bigPacket = false;
|
|
}
|
|
else {
|
|
// Checksum Error
|
|
} // end if else for checksum
|
|
} // end if read 0xAA byte
|
|
} // end if read 0xAA byte
|
|
} |