mirror of
https://github.com/AkaiiKitsune/TAL_CardReader
synced 2024-11-27 18:30:48 +01:00
Moving Card Insert event to Update()
This commit is contained in:
parent
c047663c90
commit
824cf5efce
@ -2,5 +2,6 @@ LIBRARY cardio
|
|||||||
|
|
||||||
EXPORTS
|
EXPORTS
|
||||||
Init
|
Init
|
||||||
|
Update
|
||||||
WaitTouch
|
WaitTouch
|
||||||
Exit
|
Exit
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user