spicetools/external/cardio/cardio_runner.cpp

118 lines
3.7 KiB
C++

#include "cardio_runner.h"
#include <thread>
#include <mutex>
#include "misc/eamuse.h"
#include "util/logging.h"
#include "cardio_hid.h"
#include "cardio_window.h"
bool CARDIO_RUNNER_FLIP = false;
bool CARDIO_RUNNER_TOGGLE = false;
static bool CARDIO_RUNNER_INITIALIZED = false;
static std::thread* CARDIO_RUNNER_THREAD = nullptr;
static HWND CARDIO_RUNNER_HWND = NULL;
void cardio_runner_start(bool scan_hid) {
// initialize
if (!CARDIO_RUNNER_INITIALIZED) {
CARDIO_RUNNER_INITIALIZED = true;
log_info("cardio", "Initializing CARDIO");
// initialize
if (!cardio_window_init()) {
log_warning("cardio", "Couldn't init CARDIO window");
return;
}
if (!cardio_hid_init()) {
log_warning("cardio", "Couldn't init CARDIO HID");
return;
}
// scan HID devices
if (scan_hid) {
if (!cardio_hid_scan()) {
log_warning("cardio", "Couldn't scan for CARDIO devices");
return;
}
}
}
// create thread
if (CARDIO_RUNNER_THREAD == nullptr) {
CARDIO_RUNNER_THREAD = new std::thread([] {
// create window
if (CARDIO_RUNNER_HWND == NULL) {
if ((CARDIO_RUNNER_HWND = cardio_window_create(GetModuleHandle(NULL))) == NULL) {
log_warning("cardio", "Couldn't create CARDIO window");
return;
}
}
// main loop
while (CARDIO_RUNNER_HWND != NULL) {
// update window
cardio_window_update(CARDIO_RUNNER_HWND);
// update HID devices
EnterCriticalSection(&CARDIO_HID_CRIT_SECTION);
for (size_t device_no = 0; device_no < CARDIO_HID_CONTEXTS_LENGTH; device_no++) {
auto device = &CARDIO_HID_CONTEXTS[device_no];
// get status
auto status = cardio_hid_device_poll(device);
if (status == HID_POLL_CARD_READY) {
// read card
if (cardio_hid_device_read(device) == HID_CARD_NONE)
continue;
// if card not empty
if (*((uint64_t*) &device->usage_value[0]) > 0) {
bool flip_order = CARDIO_RUNNER_FLIP;
if (CARDIO_RUNNER_FLIP) {
log_info("cardio", "Flip order of readers since flip option is set");
}
if (CARDIO_RUNNER_TOGGLE && (GetKeyState(VK_NUMLOCK) & 1) > 0) {
log_info("cardio", "Flip order of readers since Num Lock is on");
flip_order = !flip_order;
}
// insert card
if (flip_order)
eamuse_card_insert((int) (device_no + 1) & 1, &device->usage_value[0]);
else
eamuse_card_insert((int) device_no & 1, &device->usage_value[0]);
}
}
}
LeaveCriticalSection(&CARDIO_HID_CRIT_SECTION);
// slow down
Sleep(15);
}
});
}
}
void cardio_runner_stop() {
// destroy window
cardio_window_close(CARDIO_RUNNER_HWND);
CARDIO_RUNNER_HWND = NULL;
cardio_window_shutdown();
// destroy thread
delete CARDIO_RUNNER_THREAD;
CARDIO_RUNNER_THREAD = nullptr;
// shutdown HID
cardio_hid_close();
// set initialized to false
CARDIO_RUNNER_INITIALIZED = false;
}