#define BAUDRATE 115200 #define DEBUGOUTPUT 0 #include // Bluetooth #include // Bluetooth #include // 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 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 }