Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added BLE Radio on/off scanning. #53

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 52 additions & 3 deletions BLEServer/BLEServer/BLEServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@
#include <io.h>

using namespace Platform;
using namespace Windows::Foundation::Collections;
using namespace Windows::Devices;
using namespace Windows::Devices::Radios;
using namespace Windows::Data::Json;
using namespace concurrency;

Bluetooth::Advertisement::BluetoothLEAdvertisementWatcher^ bleAdvertisementWatcher;
auto devices = ref new Collections::Map<String^, Bluetooth::BluetoothLEDevice^>();
Expand Down Expand Up @@ -463,10 +466,56 @@ int main(Array<String^>^ args) {
// TODO manfuacturer data / flags / data sections ?
writeObject(msg);
});

// Added the ability to track the BLE Radio State
auto getRadiosOperation = Radio::GetRadiosAsync();
create_task(getRadiosOperation).then(
[](task<IVectorView<Radio^>^> asyncInfo)
{
auto radios = asyncInfo.get();
for (Windows::Devices::Radios::Radio^ radio : radios)
{
if (radio->Kind == RadioKind::Bluetooth)
{
if (radio->State == Windows::Devices::Radios::RadioState::On)
{
// Ble Radio On
JsonObject^ msg = ref new JsonObject();
msg->Insert("_type", JsonValue::CreateStringValue("Start"));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please change to "start" and "stop" (camelCase) to keep consistent with the other values for _type

writeObject(msg);
}
else
{
// Ble Radio Off
JsonObject^ msg = ref new JsonObject();
msg->Insert("_type", JsonValue::CreateStringValue("Stop"));
writeObject(msg);
}

radio->StateChanged += ref new Windows::Foundation::TypedEventHandler<Windows::Devices::Radios::Radio^, Platform::Object^>(
[](Windows::Devices::Radios::Radio^ sender, Platform::Object^ args)
{
if (sender->State == Windows::Devices::Radios::RadioState::On)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This exact same code repeats a few lines above. I'd refactor it into a function that gets the radio state, creates the message and calls writeObject. In addition, you can write it more concisely as:

JsonObject^ msg = ref new JsonObject();
if (sender->State == Windows::Devices::Radios::RadioState::On) {
    msg->Insert("_type", JsonValue::CreateStringValue("start"));
} else {
    msg->Insert("_type", JsonValue::CreateStringValue("stop"));
}
writeObject(msg);

{
// Ble Radio Switched On
JsonObject^ msg = ref new JsonObject();
msg->Insert("_type", JsonValue::CreateStringValue("Start"));
writeObject(msg);
}
else
{
// Ble Radio Switched Off
JsonObject^ msg = ref new JsonObject();
msg->Insert("_type", JsonValue::CreateStringValue("Stop"));
writeObject(msg);
}
}
);
}
}
}
);

JsonObject^ msg = ref new JsonObject();
msg->Insert("_type", JsonValue::CreateStringValue("Start"));
writeObject(msg);

// Set STDIN / STDOUT to binary mode
if ((_setmode(0, _O_BINARY) == -1) || (_setmode(1, _O_BINARY) == -1)) {
Expand Down