forked from Hay1tsme/segatools
26cf9aa4a7
These never get called at the moment, so we have no way of guaranteeing that any existing implementations are even correct. If we do decide to start emulating the coin blocker then we will need to advance the API versions, which will (hopefully) force any third-party devs to test their coin blocker code before opting in.
139 lines
2.8 KiB
C
139 lines
2.8 KiB
C
#include <windows.h>
|
|
|
|
#include <process.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#include "chuniio/chuniio.h"
|
|
#include "chuniio/config.h"
|
|
|
|
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx);
|
|
|
|
static bool chuni_io_coin;
|
|
static uint16_t chuni_io_coins;
|
|
static uint8_t chuni_io_hand_pos;
|
|
static HANDLE chuni_io_slider_thread;
|
|
static bool chuni_io_slider_stop_flag;
|
|
static struct chuni_io_config chuni_io_cfg;
|
|
|
|
uint16_t chuni_io_get_api_version(void)
|
|
{
|
|
return 0x0101;
|
|
}
|
|
|
|
HRESULT chuni_io_jvs_init(void)
|
|
{
|
|
chuni_io_config_load(&chuni_io_cfg, L".\\segatools.ini");
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void chuni_io_jvs_read_coin_counter(uint16_t *out)
|
|
{
|
|
if (out == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (GetAsyncKeyState(chuni_io_cfg.vk_coin)) {
|
|
if (!chuni_io_coin) {
|
|
chuni_io_coin = true;
|
|
chuni_io_coins++;
|
|
}
|
|
} else {
|
|
chuni_io_coin = false;
|
|
}
|
|
|
|
*out = chuni_io_coins;
|
|
}
|
|
|
|
void chuni_io_jvs_poll(uint8_t *opbtn, uint8_t *beams)
|
|
{
|
|
size_t i;
|
|
|
|
if (GetAsyncKeyState(chuni_io_cfg.vk_test)) {
|
|
*opbtn |= 0x01; /* Test */
|
|
}
|
|
|
|
if (GetAsyncKeyState(chuni_io_cfg.vk_service)) {
|
|
*opbtn |= 0x02; /* Service */
|
|
}
|
|
|
|
if (GetAsyncKeyState(chuni_io_cfg.vk_ir)) {
|
|
if (chuni_io_hand_pos < 6) {
|
|
chuni_io_hand_pos++;
|
|
}
|
|
} else {
|
|
if (chuni_io_hand_pos > 0) {
|
|
chuni_io_hand_pos--;
|
|
}
|
|
}
|
|
|
|
for (i = 0 ; i < 6 ; i++) {
|
|
if (chuni_io_hand_pos > i) {
|
|
*beams |= (1 << i);
|
|
}
|
|
}
|
|
}
|
|
|
|
HRESULT chuni_io_slider_init(void)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
void chuni_io_slider_start(chuni_io_slider_callback_t callback)
|
|
{
|
|
if (chuni_io_slider_thread != NULL) {
|
|
return;
|
|
}
|
|
|
|
chuni_io_slider_thread = (HANDLE) _beginthreadex(
|
|
NULL,
|
|
0,
|
|
chuni_io_slider_thread_proc,
|
|
callback,
|
|
0,
|
|
NULL);
|
|
}
|
|
|
|
void chuni_io_slider_stop(void)
|
|
{
|
|
if (chuni_io_slider_thread == NULL) {
|
|
return;
|
|
}
|
|
|
|
chuni_io_slider_stop_flag = true;
|
|
|
|
WaitForSingleObject(chuni_io_slider_thread, INFINITE);
|
|
CloseHandle(chuni_io_slider_thread);
|
|
chuni_io_slider_thread = NULL;
|
|
chuni_io_slider_stop_flag = false;
|
|
}
|
|
|
|
void chuni_io_slider_set_leds(const uint8_t *rgb)
|
|
{
|
|
}
|
|
|
|
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx)
|
|
{
|
|
chuni_io_slider_callback_t callback;
|
|
uint8_t pressure[32];
|
|
size_t i;
|
|
|
|
callback = ctx;
|
|
|
|
while (!chuni_io_slider_stop_flag) {
|
|
for (i = 0 ; i < _countof(pressure) ; i++) {
|
|
if (GetAsyncKeyState(chuni_io_cfg.vk_cell[i]) & 0x8000) {
|
|
pressure[i] = 128;
|
|
} else {
|
|
pressure[i] = 0;
|
|
}
|
|
}
|
|
|
|
callback(pressure);
|
|
Sleep(1);
|
|
}
|
|
|
|
return 0;
|
|
}
|