/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by Evandro Copercini
   Refactored back to IDF by H2zero
*/

/** NimBLE differences highlighted in comment blocks **/

/*******original********
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
***********************/

#include <NimBLEDevice.h>

extern "C"{void app_main(void);}

int scanTime = 5 * 1000; // In milliseconds, 0 = scan forever
BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(const BLEAdvertisedDevice* advertisedDevice) {
      printf("Advertised Device: %s \n", advertisedDevice->toString().c_str());
    }
};

void scanTask (void * parameter){
    for(;;) {
        // put your main code here, to run repeatedly:
        BLEScanResults foundDevices = pBLEScan->getResults(scanTime, false);
        printf("Devices found: %d\n", foundDevices.getCount());
        printf("Scan done!\n");
        pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
        vTaskDelay(2000/portTICK_PERIOD_MS); // Delay a second between loops.
    }

    vTaskDelete(NULL);
}

void app_main(void) {
  printf("Scanning...\n");

  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setScanCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
  xTaskCreate(scanTask, "scanTask", 5000, NULL, 1, NULL);
}