2019-02-26 02:56:45 +00:00
|
|
|
#include <windows.h>
|
|
|
|
|
2019-09-01 15:40:25 +00:00
|
|
|
#include <assert.h>
|
2019-02-26 02:56:45 +00:00
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
2019-06-07 21:23:42 +00:00
|
|
|
#include <stdlib.h>
|
2019-02-26 02:56:45 +00:00
|
|
|
|
|
|
|
#include "aimeio/aimeio.h"
|
|
|
|
|
|
|
|
#include "util/crc.h"
|
|
|
|
#include "util/dprintf.h"
|
|
|
|
|
2019-06-07 21:23:42 +00:00
|
|
|
struct aime_io_config {
|
|
|
|
wchar_t id_path[MAX_PATH];
|
|
|
|
uint8_t vk_scan;
|
|
|
|
};
|
2019-02-26 02:56:45 +00:00
|
|
|
|
2019-06-07 21:23:42 +00:00
|
|
|
static struct aime_io_config aime_io_cfg;
|
2019-02-26 02:56:45 +00:00
|
|
|
static uint8_t aime_io_luid[10];
|
|
|
|
|
2019-06-07 21:23:42 +00:00
|
|
|
static void aime_io_config_read(
|
|
|
|
struct aime_io_config *cfg,
|
|
|
|
const wchar_t *filename)
|
|
|
|
{
|
|
|
|
assert(cfg != NULL);
|
|
|
|
assert(filename != NULL);
|
|
|
|
|
|
|
|
GetPrivateProfileStringW(
|
|
|
|
L"aime",
|
|
|
|
L"cardPath",
|
|
|
|
L"DEVICE\\aime.txt",
|
|
|
|
cfg->id_path,
|
|
|
|
_countof(cfg->id_path),
|
|
|
|
filename);
|
|
|
|
|
|
|
|
cfg->vk_scan = GetPrivateProfileIntW(
|
|
|
|
L"aime",
|
|
|
|
L"scan",
|
|
|
|
VK_RETURN,
|
|
|
|
filename);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2019-02-26 02:56:45 +00:00
|
|
|
HRESULT aime_io_init(void)
|
|
|
|
{
|
2019-06-07 21:23:42 +00:00
|
|
|
aime_io_config_read(&aime_io_cfg, L"segatools.ini");
|
|
|
|
|
2019-02-26 02:56:45 +00:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void aime_io_fini(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT aime_io_mifare_poll(uint8_t unit_no, uint32_t *uid)
|
|
|
|
{
|
|
|
|
HRESULT hr;
|
|
|
|
FILE *f;
|
|
|
|
size_t i;
|
|
|
|
int byte;
|
|
|
|
int r;
|
|
|
|
|
|
|
|
if (unit_no != 0) {
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
hr = S_FALSE;
|
|
|
|
f = NULL;
|
|
|
|
|
2019-06-07 21:23:42 +00:00
|
|
|
if (!(GetAsyncKeyState(aime_io_cfg.vk_scan) & 0x8000)) {
|
2019-02-26 02:56:45 +00:00
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
2019-06-07 21:23:42 +00:00
|
|
|
f = _wfopen(aime_io_cfg.id_path, L"r");
|
2019-02-26 02:56:45 +00:00
|
|
|
|
|
|
|
if (f == NULL) {
|
2019-06-07 21:23:42 +00:00
|
|
|
dprintf("Aime DLL: Failed to open %S\n", aime_io_cfg.id_path);
|
2019-02-26 02:56:45 +00:00
|
|
|
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0 ; i < sizeof(aime_io_luid) ; i++) {
|
|
|
|
r = fscanf(f, "%02x ", &byte);
|
|
|
|
|
|
|
|
if (r != 1) {
|
|
|
|
dprintf("Aime DLL: fscanf[%i] failed: %i\n", (int) i, r);
|
|
|
|
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
aime_io_luid[i] = byte;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* NOTE: We are just arbitrarily using the CRC32 of the LUID here, real
|
|
|
|
cards do not work like this! However, neither the application code nor
|
|
|
|
the network protocol care what the UID is, it just has to be a stable
|
|
|
|
unique identifier for over-the-air NFC communications. */
|
|
|
|
|
|
|
|
*uid = crc32(aime_io_luid, sizeof(aime_io_luid), 0);
|
|
|
|
|
|
|
|
hr = S_OK;
|
|
|
|
|
|
|
|
end:
|
|
|
|
if (f != NULL) {
|
|
|
|
fclose(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
|
|
HRESULT aime_io_mifare_read_luid(
|
|
|
|
uint8_t unit_no,
|
|
|
|
uint32_t uid,
|
|
|
|
uint8_t *luid,
|
|
|
|
size_t luid_size)
|
|
|
|
{
|
|
|
|
assert(luid != NULL);
|
|
|
|
assert(luid_size == sizeof(aime_io_luid));
|
|
|
|
|
|
|
|
memcpy(luid, aime_io_luid, luid_size);
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void aime_io_led_set_color(uint8_t unit_no, uint8_t r, uint8_t g, uint8_t b)
|
|
|
|
{}
|