Moving Card Insert event to Update()

This commit is contained in:
Farewell_ 2023-05-12 21:37:47 +02:00
parent c047663c90
commit 824cf5efce
2 changed files with 87 additions and 69 deletions

View File

@ -2,5 +2,6 @@ LIBRARY cardio
EXPORTS EXPORTS
Init Init
Update
WaitTouch WaitTouch
Exit Exit

View File

@ -6,98 +6,94 @@ static bool CARDIO_RUNNER_INITIALIZED = false;
static HANDLE CARDIO_POLL_THREAD; static HANDLE CARDIO_POLL_THREAD;
static bool CARDIO_POLL_STOP_FLAG; static bool CARDIO_POLL_STOP_FLAG;
static bool waitingForTouch = false; static bool waitingForTouch = false;
static bool HasCard = false;
typedef void (*callbackTouch) (i32, i32, u8[168], u64); typedef void (*callbackTouch)(i32, i32, u8[168], u64);
callbackTouch touchCallback; callbackTouch touchCallback;
u64 touchData; u64 touchData;
static char AccessID[21] = "00000000000000000001"; static char AccessID[21] = "00000000000000000001";
// static char ChipID[33] = "00000000000000000000000000000001"; static u8 cardData[168] = {0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x2E, 0x58, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x5C, 0x97, 0x44, 0xF0, 0x88, 0x04, 0x00, 0x43, 0x26, 0x2C, 0x33, 0x00, 0x04,
0x06, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x42, 0x47, 0x49, 0x43, 0x36,
0x00, 0x00, 0xFA, 0xE9, 0x69, 0x00, 0xF6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void PollReader(){ void PollReader()
{
// update HID devices // update HID devices
EnterCriticalSection(&CARDIO_HID_CRIT_SECTION); EnterCriticalSection(&CARDIO_HID_CRIT_SECTION);
for (size_t device_no = 0; device_no < CARDIO_HID_CONTEXTS_LENGTH; device_no++) { for (size_t device_no = 0; device_no < CARDIO_HID_CONTEXTS_LENGTH; device_no++)
{
struct cardio_hid_device *device = &CARDIO_HID_CONTEXTS[device_no]; struct cardio_hid_device *device = &CARDIO_HID_CONTEXTS[device_no];
// get status // get status
cardio_hid_poll_value_t status = cardio_hid_device_poll(device); cardio_hid_poll_value_t status = cardio_hid_device_poll(device);
if (status == HID_POLL_CARD_READY) { if (status == HID_POLL_CARD_READY)
{
// read card // read card
if (cardio_hid_device_read(device) == HID_CARD_NONE) if (cardio_hid_device_read(device) == HID_CARD_NONE)
continue; continue;
// if card not empty // if card not empty
if (*((uint64_t*) &device->u.usage_value[0]) > 0) { if (*((uint64_t *)&device->u.usage_value[0]) > 0)
printWarning ("%s (%s): Read card %02X%02X%02X%02X%02X%02X%02X%02X\n", __func__, module, device->u.usage_value[0], device->u.usage_value[1], device->u.usage_value[2], device->u.usage_value[3], device->u.usage_value[4], device->u.usage_value[5], device->u.usage_value[6], device->u.usage_value[7]); {
printWarning("%s (%s): Read card %02X%02X%02X%02X%02X%02X%02X%02X\n", __func__, module, device->u.usage_value[0], device->u.usage_value[1], device->u.usage_value[2], device->u.usage_value[3], device->u.usage_value[4], device->u.usage_value[5], device->u.usage_value[6], device->u.usage_value[7]);
if(waitingForTouch){ if (waitingForTouch)
static u8 cardData[168] {
= { 0x01, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x2E, 0x58, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, // Convert card to proper format
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x5C, 0x97, 0x44, 0xF0, 0x88, 0x04, 0x00, 0x43, 0x26, 0x2C, 0x33, 0x00, 0x04,
0x06, 0x10, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x42, 0x47, 0x49, 0x43, 0x36,
0x00, 0x00, 0xFA, 0xE9, 0x69, 0x00, 0xF6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
//Convert card to proper format
sprintf(AccessID, "%020llu", device->u.usage64[0]); sprintf(AccessID, "%020llu", device->u.usage64[0]);
LeaveCriticalSection(&CARDIO_HID_CRIT_SECTION); // Format the AccessID in a way that doesn't crash the game.
memset(AccessID, '0', 10); // memset(AccessID, '0', 10);
//Generating a ChipID Derived from the AccessID HasCard = true;
char ChipID[33] = "000000000000";
strcat(ChipID, AccessID);
memset(ChipID, '0', 25);
//Insert card in game
printWarning ("%s (%s): AccessID %s, ChipID %s\n", __func__, module, AccessID, ChipID);
memcpy (cardData + 0x2C, ChipID, 33);
memcpy (cardData + 0x50, AccessID, 21);
touchCallback(0, 0, cardData, touchData);
}else{
LeaveCriticalSection(&CARDIO_HID_CRIT_SECTION);
} }
}else{
LeaveCriticalSection(&CARDIO_HID_CRIT_SECTION);
} }
} }
} }
Sleep(500); LeaveCriticalSection(&CARDIO_HID_CRIT_SECTION);
Sleep(15);
} }
static unsigned int __stdcall cardio_poll_thread_proc(void *ctx) static unsigned int __stdcall cardio_poll_thread_proc(void *ctx)
{ {
while (!CARDIO_POLL_STOP_FLAG) { while (!CARDIO_POLL_STOP_FLAG)
PollReader(); {
PollReader();
} }
return 0; return 0;
} }
void cardio_runner_start() { void cardio_runner_start()
{
// initialize // initialize
if (!CARDIO_RUNNER_INITIALIZED) { if (!CARDIO_RUNNER_INITIALIZED)
{
CARDIO_RUNNER_INITIALIZED = true; CARDIO_RUNNER_INITIALIZED = true;
printWarning ("%s (%s): Initializing CARDIO\n", __func__, module); printWarning("%s (%s): Initializing CARDIO\n", __func__, module);
// initialize // initialize
if (!cardio_hid_init()) { if (!cardio_hid_init())
printWarning ("%s (%s): Couldn't init CARDIO HID\n", __func__, module); {
printWarning("%s (%s): Couldn't init CARDIO HID\n", __func__, module);
return; return;
} }
// scan HID devices // scan HID devices
if (!cardio_hid_scan()) { if (!cardio_hid_scan())
printWarning ("%s (%s): Couldn't scan for CARDIO devices\n", __func__, module); {
printWarning("%s (%s): Couldn't scan for CARDIO devices\n", __func__, module);
return; return;
} }
} }
} }
void cardio_runner_stop() { void cardio_runner_stop()
{
// shutdown HID // shutdown HID
cardio_hid_close(); cardio_hid_close();
@ -105,34 +101,55 @@ void cardio_runner_stop() {
CARDIO_RUNNER_INITIALIZED = false; CARDIO_RUNNER_INITIALIZED = false;
} }
void Init(){ void Init()
printWarning ("%s (%s): Starting HID Service...\n", __func__, module); {
//Find and initialize reader(s) printWarning("%s (%s): Starting HID Service...\n", __func__, module);
// Find and initialize reader(s)
cardio_runner_start(); cardio_runner_start();
//Start reader thread // Start reader thread
CARDIO_POLL_STOP_FLAG = false; CARDIO_POLL_STOP_FLAG = false;
CARDIO_POLL_THREAD = (HANDLE) _beginthreadex( CARDIO_POLL_THREAD = (HANDLE)_beginthreadex(
NULL, NULL,
0, 0,
cardio_poll_thread_proc, cardio_poll_thread_proc,
NULL, NULL,
0, 0,
NULL); NULL);
} }
void WaitTouch(i32 (*callback) (i32, i32, u8[168], u64), u64 data){ void Update()
printWarning ("%s (%s): Waiting for touch\n", __func__, module); {
if (HasCard)
{
HasCard = false;
// Generating a ChipID Derived from the AccessID
char ChipID[33] = "000000000000";
strcat(ChipID, AccessID);
// Insert card in game
printWarning("%s (%s): Inserting Card %s, with ChipID %s\n", __func__, module, AccessID, ChipID);
memcpy(cardData + 0x2C, ChipID, 33);
memcpy(cardData + 0x50, AccessID, 21);
touchCallback(0, 0, cardData, touchData);
}
}
void WaitTouch(i32 (*callback)(i32, i32, u8[168], u64), u64 data)
{
printWarning("%s (%s): Waiting for touch\n", __func__, module);
waitingForTouch = true; waitingForTouch = true;
touchCallback = callback; touchCallback = callback;
touchData = data; touchData = data;
} }
void Exit(){ void Exit()
{
cardio_runner_stop(); cardio_runner_stop();
CARDIO_POLL_STOP_FLAG = true; CARDIO_POLL_STOP_FLAG = true;
WaitForSingleObject(CARDIO_POLL_THREAD, INFINITE); WaitForSingleObject(CARDIO_POLL_THREAD, INFINITE);
CloseHandle(CARDIO_POLL_THREAD); CloseHandle(CARDIO_POLL_THREAD);
CARDIO_POLL_THREAD = NULL; CARDIO_POLL_THREAD = NULL;
CARDIO_POLL_STOP_FLAG = false; CARDIO_POLL_STOP_FLAG = false;
} }