mirror of
https://github.com/spicetools/spicetools.git
synced 2026-03-22 02:14:22 -05:00
1063 lines
38 KiB
C++
1063 lines
38 KiB
C++
#include "extdev.h"
|
|
#include <cmath>
|
|
#include <string>
|
|
#include <windows.h>
|
|
#include "util/utils.h"
|
|
#include "util/detour.h"
|
|
#include "util/libutils.h"
|
|
#include "util/circular_buffer.h"
|
|
#include "misc/eamuse.h"
|
|
#include "cfg/api.h"
|
|
#include "acio/icca/icca.h"
|
|
#include "games/gitadora/io.h"
|
|
#include "avs/game.h"
|
|
|
|
using namespace GameAPI;
|
|
|
|
// card unit
|
|
static size_t EXTDEV_CARDUNIT_COUNT = 0;
|
|
static circular_buffer<int> EXTDEV_CARDUNIT_KEY[2] = {
|
|
circular_buffer<int>(32),
|
|
circular_buffer<int>(32)
|
|
};
|
|
static circular_buffer<const char*> EXTDEV_CARDUNIT_KEY_STR[2] = {
|
|
circular_buffer<const char*>(32),
|
|
circular_buffer<const char*>(32)
|
|
};
|
|
static int EXTDEV_CARDUNIT_EJECT[2] = {0, 0};
|
|
static bool EXTDEV_CARD_IN[2] = {false, false};
|
|
static bool EXTDEV_CARD_PRESSED[2] = {false, false};
|
|
static uint8_t EXTDEV_CARD[2][8];
|
|
static bool EXTDEV_CARDUNIT_TENKEY_STATE[2][12]{};
|
|
static std::string EXTDEV_CARDUNIT_TENKEY_STRINGS[] = {
|
|
"0",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"4",
|
|
"5",
|
|
"6",
|
|
"7",
|
|
"8",
|
|
"9",
|
|
"RETURN", // enter
|
|
"00" // double zero
|
|
};
|
|
static unsigned int EXTDEV_CARDUNIT_TENKEY_EAMUSE_MAPPING[] = {
|
|
0, 1, 5, 9, 2, 6, 10, 3, 7, 11, 8, 4
|
|
};
|
|
static unsigned int EXTDEV_CARDUNIT_TENKEY_NUMS[] {
|
|
0, 1, 5, 9, 2, 6, 10, 3, 7, 11, 8, 4
|
|
};
|
|
|
|
// GFDM
|
|
static int32_t GFDM_DM_ATTACK_BORDER_VALUE[] = {
|
|
0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50
|
|
};
|
|
static bool GFDM_GF_PICK_STATE_UP[2]{};
|
|
static bool GFDM_GF_PICK_STATE_DOWN[2]{};
|
|
|
|
// state
|
|
static HINSTANCE EXTDEV_INSTANCE;
|
|
static std::string EXTDEV_INSTANCE_NAMES[] = {
|
|
"ext_dev.dll",
|
|
"libextio.dll",
|
|
"libcardunit.dll",
|
|
"libledunit.dll",
|
|
"libgfdm_unit2.dll",
|
|
};
|
|
|
|
static void __cdecl cardunit_boot2(int a1, int a2, int a3) {
|
|
|
|
// default reader count to 1
|
|
EXTDEV_CARDUNIT_COUNT = 1;
|
|
|
|
// exceptions for games with two readers
|
|
if (avs::game::is_model({ "J33", "K33", "L33", "M32" })) {
|
|
EXTDEV_CARDUNIT_COUNT = 2;
|
|
}
|
|
}
|
|
|
|
static void __cdecl cardunit_boot(int a1, int a2) {
|
|
cardunit_boot2(1, a1, a2);
|
|
}
|
|
|
|
static int __cdecl cardunit_boot_initialize() {
|
|
return 0;
|
|
}
|
|
|
|
static void __cdecl cardunit_boot_no_slot_type(int a1, int a2) {
|
|
cardunit_boot2(1, a1, a2);
|
|
}
|
|
|
|
static void __cdecl cardunit_card_eject(int unit) {
|
|
EXTDEV_CARDUNIT_EJECT[unit] = 1;
|
|
}
|
|
|
|
static int __cdecl cardunit_card_eject_complete(int unit) {
|
|
EXTDEV_CARD_IN[unit] = false;
|
|
return EXTDEV_CARDUNIT_EJECT[unit];
|
|
}
|
|
|
|
static int __cdecl cardunit_card_eject_wait(int unit) {
|
|
return EXTDEV_CARDUNIT_EJECT[unit];
|
|
}
|
|
|
|
static int __cdecl cardunit_card_read2(int unit, void *card, int *status) {
|
|
|
|
// clear the eject flag
|
|
EXTDEV_CARDUNIT_EJECT[unit] = 0;
|
|
|
|
// check if a card was inserted
|
|
if (EXTDEV_CARD_IN[unit]) {
|
|
|
|
// copy card, return success
|
|
memcpy(card, EXTDEV_CARD[unit], 8);
|
|
*status = is_card_uid_felica(EXTDEV_CARD[unit]) ? 2 : 1;
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
// tried to read card with no card inserted, return fail
|
|
memset(card, 0, 8);
|
|
*status = 0;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
static int __cdecl cardunit_card_read(int unit, void *card) {
|
|
return cardunit_card_read2(unit, card, nullptr);
|
|
}
|
|
|
|
static void __cdecl cardunit_card_ready(int unit) {
|
|
EXTDEV_CARDUNIT_EJECT[unit] = 0;
|
|
}
|
|
|
|
static int __cdecl cardunit_card_sensor() {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl cardunit_card_sensor_raw(int a1) {
|
|
return 1;
|
|
}
|
|
|
|
static void __cdecl cardunit_update() {
|
|
|
|
// update all units
|
|
for (size_t unit = 0; unit < EXTDEV_CARDUNIT_COUNT; unit++) {
|
|
bool kb_insert_press = false;
|
|
|
|
// eamio keypress
|
|
kb_insert_press |= eamuse_get_keypad_state(unit) & (1 << EAM_IO_INSERT);
|
|
|
|
// update card inserts
|
|
if (eamuse_card_insert_consume((int) EXTDEV_CARDUNIT_COUNT, unit) ||
|
|
(kb_insert_press && !EXTDEV_CARD_PRESSED[unit])) {
|
|
EXTDEV_CARD_PRESSED[unit] = true;
|
|
if (!EXTDEV_CARD_IN[unit]) {
|
|
EXTDEV_CARD_IN[unit] = true;
|
|
eamuse_get_card((int) EXTDEV_CARDUNIT_COUNT, unit, EXTDEV_CARD[unit]);
|
|
}
|
|
} else
|
|
EXTDEV_CARD_PRESSED[unit] = false;
|
|
|
|
// get eamu key states
|
|
uint16_t eamu_state = eamuse_get_keypad_state(unit);
|
|
|
|
// iterate all keys
|
|
for (int i = 0; i < 12; i++) {
|
|
|
|
// check if key is pressed
|
|
if (eamu_state & (1 << EXTDEV_CARDUNIT_TENKEY_EAMUSE_MAPPING[i])) {
|
|
|
|
// check if key was pressed before
|
|
if (!EXTDEV_CARDUNIT_TENKEY_STATE[unit][i]) {
|
|
|
|
// remember key press
|
|
EXTDEV_CARDUNIT_TENKEY_STATE[unit][i] = true;
|
|
|
|
// set last key
|
|
EXTDEV_CARDUNIT_KEY[unit].put(EXTDEV_CARDUNIT_TENKEY_NUMS[i]);
|
|
EXTDEV_CARDUNIT_KEY_STR[unit].put(EXTDEV_CARDUNIT_TENKEY_STRINGS[i].c_str());
|
|
|
|
// we can only detect one key at a time
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
|
|
// forget old key press
|
|
EXTDEV_CARDUNIT_TENKEY_STATE[unit][i] = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static int __cdecl cardunit_get_status(int unit) {
|
|
|
|
// might not be needed
|
|
cardunit_update();
|
|
|
|
// TODO: why only for reflec beat?
|
|
if (avs::game::is_model("MBR")) {
|
|
return EXTDEV_CARD_IN[unit] && is_card_uid_felica(EXTDEV_CARD[unit]) ? 2 : 1;
|
|
}
|
|
|
|
// gitadora always wants 1 apparently
|
|
return 1;
|
|
}
|
|
|
|
static long __cdecl cardunit_cardnumber_obfuscate_decode(void* a1, int a2, void* a3, void* a4) {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl cardunit_cardnumber_obfuscate_encode(void* a1, int a2, void* a3, void* a4) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl cardunit_get_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl cardunit_get_recvcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl cardunit_get_sendcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static const char* __cdecl cardunit_get_version(int a1) {
|
|
static const char* ver = "DUMMY\x04\x02\x00";
|
|
return ver;
|
|
}
|
|
|
|
static int __cdecl cardunit_check_version() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl cardunit_key_get(int unit) {
|
|
if (EXTDEV_CARDUNIT_KEY[unit].empty())
|
|
return -1;
|
|
return EXTDEV_CARDUNIT_KEY[unit].get();
|
|
}
|
|
|
|
static const char *__cdecl cardunit_key_str(int unit) {
|
|
if (EXTDEV_CARDUNIT_KEY_STR[unit].empty())
|
|
return nullptr;
|
|
return EXTDEV_CARDUNIT_KEY_STR[unit].get();
|
|
}
|
|
|
|
static int __cdecl cardunit_reset() {
|
|
return 0;
|
|
}
|
|
|
|
static void __cdecl cardunit_shutdown() {
|
|
}
|
|
|
|
static void __cdecl cardunit_sleep(int unit) {
|
|
}
|
|
|
|
static const size_t gitadora_button_mapping[] = {
|
|
games::gitadora::Buttons::Service,
|
|
games::gitadora::Buttons::Test,
|
|
games::gitadora::Buttons::Coin,
|
|
games::gitadora::Buttons::GuitarP1PickUp,
|
|
games::gitadora::Buttons::GuitarP1PickDown,
|
|
games::gitadora::Buttons::GuitarP1R,
|
|
games::gitadora::Buttons::GuitarP1G,
|
|
games::gitadora::Buttons::GuitarP1B,
|
|
games::gitadora::Buttons::GuitarP1Y,
|
|
games::gitadora::Buttons::GuitarP1P,
|
|
games::gitadora::Buttons::GuitarP1KnobUp,
|
|
games::gitadora::Buttons::GuitarP1KnobDown,
|
|
games::gitadora::Buttons::GuitarP1WailUp,
|
|
games::gitadora::Buttons::GuitarP1WailDown,
|
|
games::gitadora::Buttons::GuitarP2PickUp,
|
|
games::gitadora::Buttons::GuitarP2PickDown,
|
|
games::gitadora::Buttons::GuitarP2R,
|
|
games::gitadora::Buttons::GuitarP2G,
|
|
games::gitadora::Buttons::GuitarP2B,
|
|
games::gitadora::Buttons::GuitarP2Y,
|
|
games::gitadora::Buttons::GuitarP2P,
|
|
games::gitadora::Buttons::GuitarP2KnobUp,
|
|
games::gitadora::Buttons::GuitarP2KnobDown,
|
|
games::gitadora::Buttons::GuitarP2WailUp,
|
|
games::gitadora::Buttons::GuitarP2WailDown,
|
|
games::gitadora::Buttons::DrumHiHat,
|
|
games::gitadora::Buttons::DrumHiHatClosed,
|
|
games::gitadora::Buttons::DrumHiHatHalfOpen,
|
|
games::gitadora::Buttons::DrumSnare,
|
|
games::gitadora::Buttons::DrumHiTom,
|
|
games::gitadora::Buttons::DrumLowTom,
|
|
games::gitadora::Buttons::DrumRightCymbal,
|
|
games::gitadora::Buttons::DrumBassPedal,
|
|
games::gitadora::Buttons::DrumLeftCymbal,
|
|
games::gitadora::Buttons::DrumLeftPedal,
|
|
games::gitadora::Buttons::DrumFloorTom,
|
|
};
|
|
|
|
static const size_t gitadora_analog_mapping[] = {
|
|
games::gitadora::Analogs::GuitarP1WailX,
|
|
games::gitadora::Analogs::GuitarP1WailY,
|
|
games::gitadora::Analogs::GuitarP1WailZ,
|
|
games::gitadora::Analogs::GuitarP1Knob,
|
|
games::gitadora::Analogs::GuitarP2WailX,
|
|
games::gitadora::Analogs::GuitarP2WailY,
|
|
games::gitadora::Analogs::GuitarP2WailZ,
|
|
games::gitadora::Analogs::GuitarP2Knob,
|
|
};
|
|
|
|
static void __cdecl gfdm_unit_boot(unsigned int is_dm, unsigned int a2, unsigned int a3) {
|
|
}
|
|
|
|
static void __cdecl gfdm_unit2_boot(unsigned int is_dm, unsigned int a2, unsigned int a3) {
|
|
}
|
|
|
|
static int __cdecl gfdm_unit_boot_initialize() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit2_boot_initialize() {
|
|
return 1;
|
|
}
|
|
|
|
static void *__cdecl gfdm_unit_get_button_p(void *a1, int a2, size_t player) {
|
|
memset(a1, 0, 64);
|
|
|
|
// irrelevant for drummania
|
|
if (avs::game::is_model({ "J32", "K32", "L32" }) ||
|
|
(avs::game::is_model("M32") && avs::game::SPEC[0] == 'B'))
|
|
return a1;
|
|
|
|
// get buttons
|
|
auto &buttons = games::gitadora::get_buttons();
|
|
auto &analogs = games::gitadora::get_analogs();
|
|
|
|
// X
|
|
((int *) a1)[4] = a2 == 1 ? 4080 : -4080;
|
|
if (analogs.at(player * 3 + 0).isSet())
|
|
((int *) a1)[4] = lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 0])) * 8160.f) - 4080;
|
|
|
|
// Y
|
|
((int *) a1)[5] = 0;
|
|
if (analogs.at(player * 3 + 1).isSet())
|
|
((int *) a1)[5] = lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 1])) * 8160.f) - 4080;
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[12 + 11 * (size_t) player])))
|
|
((int *) a1)[5] = -4080;
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[13 + 11 * (size_t) player])))
|
|
((int *) a1)[5] = 4080;
|
|
|
|
// Z
|
|
((int *) a1)[6] = 0;
|
|
if (analogs.at(player * 3 + 2).isSet())
|
|
((int *) a1)[6] = lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 2])) * 8160.f) - 4080;
|
|
|
|
// return the same buffer
|
|
return a1;
|
|
}
|
|
|
|
static void *__cdecl gfdm_unit_get_button(void *a1, int a2) {
|
|
return gfdm_unit_get_button_p(a1, a2, 0);
|
|
}
|
|
|
|
static void *__cdecl gfdm_unit2_get_button(void *a1, int a2) {
|
|
return gfdm_unit_get_button_p(a1, a2, 1);
|
|
}
|
|
|
|
static bool __cdecl gfdm_unit_get_button_dm(int a1) {
|
|
return a1 == 9 || a1 == 8;
|
|
}
|
|
|
|
static bool __cdecl gfdm_unit2_get_button_dm(int a1) {
|
|
return a1 == 9 || a1 == 8;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit_get_button_gf(int a1, int a2) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit2_get_button_gf(int a1, int a2) {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_dm_attack_border_value(int a1, int *a2) {
|
|
if (a1 >= 7)
|
|
return -1;
|
|
memcpy(a2, GFDM_DM_ATTACK_BORDER_VALUE, 7 * sizeof(int32_t));
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit2_get_dm_attack_border_value(int a1, int *a2) {
|
|
if (a1 >= 7)
|
|
return -1;
|
|
memcpy(a2, GFDM_DM_ATTACK_BORDER_VALUE, 7 * sizeof(int32_t));
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit2_get_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_input_p(int device, size_t player) {
|
|
long ret = 0;
|
|
|
|
// get buttons and analogs
|
|
auto &buttons = games::gitadora::get_buttons();
|
|
auto &analogs = games::gitadora::get_analogs();
|
|
|
|
// drum mania
|
|
if (avs::game::is_model({ "J32", "K32", "L32" }) ||
|
|
(avs::game::is_model("M32") && avs::game::SPEC[0] == 'B')) {
|
|
|
|
// we don't want input for this
|
|
if (device == 1)
|
|
return 0;
|
|
|
|
// hi hat
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[25])) ||
|
|
Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[26])) ||
|
|
Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[27])))
|
|
{
|
|
ret |= 0x20;
|
|
}
|
|
|
|
// snare
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[28]))) {
|
|
ret |= 0x40;
|
|
}
|
|
|
|
// hi tom
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[29]))) {
|
|
ret |= 0x80;
|
|
}
|
|
|
|
// low tom
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[30]))) {
|
|
ret |= 0x100;
|
|
}
|
|
|
|
// right cymbal
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[31]))) {
|
|
ret |= 0x200;
|
|
}
|
|
|
|
// bass pedal
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[32]))) {
|
|
ret |= 0x800;
|
|
}
|
|
|
|
// left cymbal
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[33]))) {
|
|
ret |= 0x4000;
|
|
}
|
|
|
|
// left pedal
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[34]))) {
|
|
ret |= 0x8000;
|
|
}
|
|
|
|
// floor tom
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[35]))) {
|
|
ret |= 0x10000;
|
|
}
|
|
}
|
|
|
|
// guitar freaks
|
|
if (avs::game::is_model({ "J33", "K33", "L33" }) ||
|
|
(avs::game::is_model("M32") && avs::game::SPEC[0] == 'A'))
|
|
{
|
|
auto offset = player * 11;
|
|
|
|
// pick up
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[3 + offset]))) {
|
|
if (!GFDM_GF_PICK_STATE_UP[player]) {
|
|
GFDM_GF_PICK_STATE_UP[player] = true;
|
|
ret |= 0x80 | 0x20;
|
|
}
|
|
} else {
|
|
GFDM_GF_PICK_STATE_UP[player] = false;
|
|
}
|
|
|
|
// pick down
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[4 + offset]))) {
|
|
if (!GFDM_GF_PICK_STATE_DOWN[player]) {
|
|
GFDM_GF_PICK_STATE_DOWN[player] = true;
|
|
ret |= 0x100 | 0x20;
|
|
}
|
|
} else {
|
|
GFDM_GF_PICK_STATE_DOWN[player] = false;
|
|
}
|
|
|
|
// button R
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[5 + offset]))) {
|
|
ret |= 0x200;
|
|
}
|
|
|
|
// button G
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[6 + offset]))) {
|
|
ret |= 0x400;
|
|
}
|
|
|
|
// button B
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[7 + offset]))) {
|
|
ret |= 0x800;
|
|
}
|
|
|
|
// button Y
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[8 + offset]))) {
|
|
ret |= 0x1000;
|
|
}
|
|
|
|
// button P
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[9 + offset]))) {
|
|
ret |= 0x4000;
|
|
}
|
|
|
|
// knob statics
|
|
static size_t knob[2]{};
|
|
static long knob_flags[] = {
|
|
0x8000,
|
|
0x18000,
|
|
0x10000,
|
|
0x30000,
|
|
0x38000,
|
|
0x28000
|
|
};
|
|
|
|
// knob up
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[10 + offset]))) {
|
|
if ((knob[player] >> 2) < 5) {
|
|
knob[player]++;
|
|
}
|
|
}
|
|
|
|
// knob down
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[11 + offset]))) {
|
|
if (knob[player] > 0) {
|
|
knob[player]--;
|
|
}
|
|
}
|
|
|
|
// get value from 0 to 5
|
|
size_t value = knob[player] >> 2;
|
|
|
|
// analog override
|
|
if (analogs.at(gitadora_analog_mapping[player * 4 + 3]).isSet()) {
|
|
value = (size_t) (Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 3])) * 5.999f);
|
|
}
|
|
|
|
// apply value
|
|
ret |= knob_flags[value];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_input(int device) {
|
|
if (device > 0) {
|
|
return gfdm_unit_get_input_p(device, 1);
|
|
} else {
|
|
return gfdm_unit_get_input_p(device, 0);
|
|
}
|
|
}
|
|
|
|
static long __cdecl gfdm_unit2_get_input(int device) {
|
|
return gfdm_unit_get_input_p(device, 1);
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_sensor_gf_p(int a1, int a2, size_t player) {
|
|
|
|
// return if it's actually drum mania
|
|
if (avs::game::is_model({ "J32", "K32", "L32" }) ||
|
|
(avs::game::is_model("M32") && avs::game::SPEC[0] == 'B'))
|
|
return 0;
|
|
|
|
// get buttons and analogs
|
|
auto &buttons = games::gitadora::get_buttons();
|
|
auto &analogs = games::gitadora::get_analogs();
|
|
|
|
// X
|
|
if (a2 == 0) {
|
|
|
|
// analog override
|
|
if (analogs.at(gitadora_analog_mapping[player * 3 + 0]).isSet()) {
|
|
return lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 0])) * 8160.f) - 4080;
|
|
}
|
|
|
|
// default
|
|
return a1 == 1 ? 4080 : -4080;
|
|
}
|
|
|
|
// Y
|
|
if (a2 == 1) {
|
|
|
|
// analog override
|
|
if (analogs.at(player * 3 + 1).isSet()) {
|
|
return lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 1])) * 8160.f) - 4080;
|
|
}
|
|
|
|
// variables
|
|
long ret = 0;
|
|
size_t offset = (size_t) player * 11;
|
|
|
|
// wail up
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[12 + offset]))) {
|
|
ret -= 4080;
|
|
}
|
|
|
|
// wail down
|
|
if (Buttons::getState(RI_MGR, buttons.at(gitadora_button_mapping[13 + offset]))) {
|
|
ret += 4080;
|
|
}
|
|
|
|
// return value
|
|
return ret;
|
|
}
|
|
|
|
// Z
|
|
if (a2 == 2) {
|
|
|
|
// analog override
|
|
if (analogs.at(gitadora_analog_mapping[player * 3 + 2]).isSet()) {
|
|
return lroundf(Analogs::getState(
|
|
RI_MGR, analogs.at(gitadora_analog_mapping[player * 4 + 2])) * 8160.f) - 4080;
|
|
}
|
|
|
|
// default
|
|
return 0;
|
|
}
|
|
|
|
// unknown sensor
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_get_sensor_gf(int a1, int a2) {
|
|
return gfdm_unit_get_sensor_gf_p(a1, a2, 0);
|
|
}
|
|
|
|
static long __cdecl gfdm_unit2_get_sensor_gf(int a1, int a2) {
|
|
return gfdm_unit_get_sensor_gf_p(a1, a2, 1);
|
|
}
|
|
|
|
static int __cdecl gfdm_unit_get_status(int a1) {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit2_get_status(int a1) {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit_get_stream_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit2_get_stream_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static const char *__cdecl gfdm_unit_get_version() {
|
|
static const char* ver = "DUMMY\x04\x02\x00";
|
|
return ver;
|
|
}
|
|
|
|
static const char *__cdecl gfdm_unit2_get_version() {
|
|
static const char* ver = "DUMMY\x04\x02\x00";
|
|
return ver;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit_reset() {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl gfdm_unit2_reset() {
|
|
return 0;
|
|
}
|
|
|
|
static void __cdecl gfdm_unit_reset_stream_errorcount(int a1) {
|
|
}
|
|
|
|
static void __cdecl gfdm_unit2_reset_stream_errorcount(int a1) {
|
|
}
|
|
|
|
static int __cdecl gfdm_unit_send_motor_value(size_t motor, uint8_t value) {
|
|
if (motor == 0) {
|
|
auto &lights = games::gitadora::get_lights();
|
|
auto &light = lights.at(games::gitadora::Lights::GuitarP1Motor);
|
|
GameAPI::Lights::writeLight(RI_MGR, light, value / 127.f);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl gfdm_unit2_send_motor_value(size_t motor, uint8_t value) {
|
|
if (motor == 0) {
|
|
auto &lights = games::gitadora::get_lights();
|
|
auto &light = lights.at(games::gitadora::Lights::GuitarP2Motor);
|
|
GameAPI::Lights::writeLight(RI_MGR, light, value / 127.f);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void __cdecl gfdm_unit_set_dm_attack_border_value(int32_t *a1) {
|
|
memcpy(GFDM_DM_ATTACK_BORDER_VALUE, a1, 7 * sizeof(int32_t));
|
|
}
|
|
|
|
static void __cdecl gfdm_unit2_set_dm_attack_border_value(int32_t *a1) {
|
|
memcpy(GFDM_DM_ATTACK_BORDER_VALUE, a1, 7 * sizeof(int32_t));
|
|
}
|
|
|
|
static void __cdecl gfdm_unit_shutdown() {
|
|
}
|
|
|
|
static void __cdecl gfdm_unit2_shutdown() {
|
|
}
|
|
|
|
static void __cdecl gfdm_unit_update() {
|
|
}
|
|
|
|
static void __cdecl gfdm_unit2_update() {
|
|
}
|
|
|
|
static const char* __cdecl led_get_version() {
|
|
static const char* ver = "DUMMY\x04\x02\x00";
|
|
return ver;
|
|
}
|
|
|
|
static void __cdecl led_unit_boot(int a1, int a2) {
|
|
}
|
|
|
|
static int __cdecl led_unit_boot_initialize() {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl led_unit_get_errorcount(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl led_unit_get_status() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl led_unit_reset() {
|
|
return 0;
|
|
}
|
|
|
|
static unsigned int __cdecl led_unit_send_custom1(int a1, unsigned char *a2) {
|
|
return 0;
|
|
}
|
|
|
|
static unsigned int __cdecl led_unit_send_custom2(int a1, unsigned char *a2) {
|
|
return 0;
|
|
}
|
|
|
|
static long __cdecl led_unit_send_direct(long a1, uint8_t *a2) {
|
|
return 0;
|
|
}
|
|
|
|
static void __cdecl led_unit_shutdown() {
|
|
}
|
|
|
|
static void __cdecl led_unit_update() {
|
|
}
|
|
|
|
static int __cdecl sci_boot() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl sci_clear_error(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_close(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_flush() {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_flush_complete() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl sci_get_error(int a1) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_gets(int a1, int a2, int a3) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_print_error(int a1, void *a2) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_puts(int a1, int a2, int a3) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_set_linebreak(int a1, int a2) {
|
|
return 0;
|
|
}
|
|
|
|
static int __cdecl sci_setparam(int a1, int a2, int a3, char a4) {
|
|
return 1;
|
|
}
|
|
|
|
void extdev_attach() {
|
|
|
|
// get instance
|
|
for (auto &name : EXTDEV_INSTANCE_NAMES) {
|
|
auto instance = libutils::try_module(name);
|
|
if (instance) {
|
|
EXTDEV_INSTANCE = instance;
|
|
} else {
|
|
continue;
|
|
}
|
|
|
|
// card unit
|
|
detour::inline_hook((void *) cardunit_boot2, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_boot2", "?cardunit_boot2@@YAXHHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_boot, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_boot", "?cardunit_boot@@YAXHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_boot_initialize, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_boot_initialize", "?cardunit_boot_initialize@@YAHXZ"}));
|
|
detour::inline_hook((void *) cardunit_boot_no_slot_type, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_boot_no_slot_type", "?cardunit_boot_no_slot_type@@YAXHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_eject, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_eject", "?cardunit_card_eject@@YAXH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_eject_complete, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_eject_complete", "?cardunit_card_eject_complete@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_eject_wait, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_eject_wait", "?cardunit_card_eject_wait@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_read2, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_read2",
|
|
"?cardunit_card_read2@@YAHHQAEPAH@Z",
|
|
"?cardunit_card_read2@@YAHHQEAEPEAH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_read, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_read", "?cardunit_card_read@@YAHHQAE@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_ready, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_ready", "?cardunit_card_ready@@YAXH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_sensor, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_sensor", "?cardunit_card_sensor@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_card_sensor_raw, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_card_sensor_raw", "?cardunit_card_sensor_raw@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_update, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_update", "?cardunit_update@@YAXXZ"}));
|
|
detour::inline_hook((void *) cardunit_get_status, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_get_status", "?cardunit_get_status@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_cardnumber_obfuscate_decode, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_cardnumber_obfuscate_decode",
|
|
"?cardunit_cardnumber_obfuscate_decode@@YAHPEADHPEBD1@Z"}));
|
|
detour::inline_hook((void *) cardunit_cardnumber_obfuscate_encode, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_cardnumber_obfuscate_encode",
|
|
"?cardunit_cardnumber_obfuscate_encode@@YAHPEADHPEBD1@Z"}));
|
|
detour::inline_hook((void *) cardunit_get_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_get_errorcount", "?cardunit_get_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_get_recvcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_get_recvcount", "?cardunit_get_recvcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_get_sendcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_get_sendcount", "?cardunit_get_sendcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_get_version, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_get_version",
|
|
"?cardunit_get_version@@YAPBUcardunit_firm_version@@H@Z"}));
|
|
detour::inline_hook((void *) cardunit_check_version, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_check_version", "?cardunit_check_version@@YAEH@Z"}));
|
|
detour::inline_hook((void *) cardunit_key_get, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_key_get", "?cardunit_key_get@@YAHH@Z"}));
|
|
detour::inline_hook((void *) cardunit_key_str, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_key_str", "?cardunit_key_str@@YAPBDH@Z"}));
|
|
detour::inline_hook((void *) cardunit_reset, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_reset", "?cardunit_reset@@YAHXZ"}));
|
|
detour::inline_hook((void *) cardunit_shutdown, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_shutdown", "?cardunit_shutdown@@YAXXZ"}));
|
|
detour::inline_hook((void *) cardunit_sleep, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"cardunit_sleep", "?cardunit_sleep@@YAXH@Z"}));
|
|
|
|
// GFDM UNIT
|
|
detour::inline_hook((void *) gfdm_unit_boot, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_boot",
|
|
"?gfdm_unit_boot@@YAXW4UNIT_TYPE@@HH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_boot_initialize, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_boot_initialize",
|
|
"?gfdm_unit_boot_initialize@@YAHXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_button, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_button",
|
|
"?gfdm_unit_get_button@@YA?AUunit_button_t@@H@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_button_dm, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_button_dm",
|
|
"?gfdm_unit_get_button_dm@@YAHW4DM_BUTTON_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_button_gf, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_button_gf",
|
|
"?gfdm_unit_get_button_gf@@YAHW4UNIT_NO@@W4GF_BUTTON_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_dm_attack_border_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_dm_attack_border_value",
|
|
"?gfdm_unit_get_dm_attack_border_value@@YAHHPEAH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_errorcount",
|
|
"?gfdm_unit_get_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_input, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_input",
|
|
"?gfdm_unit_get_input@@YAIH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_sensor_gf, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_sensor_gf",
|
|
"?gfdm_unit_get_sensor_gf@@YAHW4UNIT_NO@@W4GF_SENSOR_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_status, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_status",
|
|
"?gfdm_unit_get_status@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_stream_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_stream_errorcount",
|
|
"?gfdm_unit_get_stream_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_get_version, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_get_version",
|
|
"?gfdm_unit_get_version@@YAPEBUfirm_version@@H@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_reset, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_reset",
|
|
"?gfdm_unit_reset@@YAHXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit_reset_stream_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_reset_stream_errorcount",
|
|
"?gfdm_unit_reset_stream_errorcount@@YAXH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_send_motor_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_send_motor_value",
|
|
"?gfdm_unit_send_motor_value@@YAIHE@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_set_dm_attack_border_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_set_dm_attack_border_value",
|
|
"?gfdm_unit_set_dm_attack_border_value@@YAXQEAH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit_shutdown, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_shutdown",
|
|
"?gfdm_unit_shutdown@@YAXXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit_update, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit_update",
|
|
"?gfdm_unit_update@@YAXXZ"}));
|
|
|
|
// GFDM UNIT 2
|
|
detour::inline_hook((void *) gfdm_unit2_boot, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_boot",
|
|
"?gfdm_unit2_boot@@YAXW4UNIT_TYPE@@HH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_boot_initialize, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_boot_initialize",
|
|
"?gfdm_unit2_boot_initialize@@YAHXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_button, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_button",
|
|
"?gfdm_unit2_get_button@@YA?AUunit_button_t@@H@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_button_dm, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_button_dm",
|
|
"?gfdm_unit2_get_button_dm@@YAHW4DM_BUTTON_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_button_gf, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_button_gf",
|
|
"?gfdm_unit2_get_button_gf@@YAHW4UNIT_NO@@W4GF_BUTTON_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_dm_attack_border_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_dm_attack_border_value",
|
|
"?gfdm_unit2_get_dm_attack_border_value@@YAHHPEAH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_errorcount",
|
|
"?gfdm_unit2_get_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_input, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_input",
|
|
"?gfdm_unit2_get_input@@YAIH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_sensor_gf, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_sensor_gf",
|
|
"?gfdm_unit2_get_sensor_gf@@YAHW4UNIT_NO@@W4GF_SENSOR_DEFINITION@@@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_status, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_status",
|
|
"?gfdm_unit2_get_status@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_stream_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_stream_errorcount",
|
|
"?gfdm_unit2_get_stream_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_get_version, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_get_version",
|
|
"?gfdm_unit2_get_version@@YAPEBUfirm_version@@H@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_reset, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_reset",
|
|
"?gfdm_unit2_reset@@YAHXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit2_reset_stream_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_reset_stream_errorcount",
|
|
"?gfdm_unit2_reset_stream_errorcount@@YAXH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_send_motor_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_send_motor_value",
|
|
"?gfdm_unit2_send_motor_value@@YAIHE@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_set_dm_attack_border_value, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_set_dm_attack_border_value",
|
|
"?gfdm_unit2_set_dm_attack_border_value@@YAXQEAH@Z"}));
|
|
detour::inline_hook((void *) gfdm_unit2_shutdown, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_shutdown",
|
|
"?gfdm_unit2_shutdown@@YAXXZ"}));
|
|
detour::inline_hook((void *) gfdm_unit2_update, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"gfdm_unit2_update",
|
|
"?gfdm_unit2_update@@YAXXZ"}));
|
|
|
|
// led unit
|
|
detour::inline_hook((void *) led_get_version, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_get_version",
|
|
"?led_get_version@@YAPEBUfirm_version@@H@Z"}));
|
|
detour::inline_hook((void *) led_unit_boot, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_boot",
|
|
"?led_unit_boot@@YAXHH@Z"}));
|
|
detour::inline_hook((void *) led_unit_boot_initialize, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_boot_initialize",
|
|
"?led_unit_boot_initialize@@YAHXZ"}));
|
|
detour::inline_hook((void *) led_unit_get_errorcount, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_get_errorcount",
|
|
"?led_unit_get_errorcount@@YAHH@Z"}));
|
|
detour::inline_hook((void *) led_unit_get_status, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_get_status",
|
|
"?led_unit_get_status@@YAHH@Z"}));
|
|
detour::inline_hook((void *) led_unit_reset, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_reset",
|
|
"?led_unit_reset@@YAHXZ"}));
|
|
detour::inline_hook((void *) led_unit_send_custom1, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_send_custom1",
|
|
"?led_unit_send_custom1@@YAIHQEAE@Z"}));
|
|
detour::inline_hook((void *) led_unit_send_custom2, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_send_custom2",
|
|
"?led_unit_send_custom2@@YAIHQEAE@Z"}));
|
|
detour::inline_hook((void *) led_unit_send_direct, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_send_direct",
|
|
"?led_unit_send_direct@@YAIHQEAE@Z"}));
|
|
detour::inline_hook((void *) led_unit_shutdown, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_shutdown",
|
|
"?led_unit_shutdown@@YAXXZ"}));
|
|
detour::inline_hook((void *) led_unit_update, libutils::try_proc_list(
|
|
EXTDEV_INSTANCE, {"led_unit_update",
|
|
"?led_unit_update@@YAXXZ"}));
|
|
|
|
// SCI
|
|
detour::inline_hook((void *) sci_boot, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_boot"));
|
|
detour::inline_hook((void *) sci_clear_error, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_clear_error"));
|
|
detour::inline_hook((void *) sci_close, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_close"));
|
|
detour::inline_hook((void *) sci_flush, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_flush"));
|
|
detour::inline_hook((void *) sci_flush_complete, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_flush_complete"));
|
|
detour::inline_hook((void *) sci_get_error, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_get_error"));
|
|
detour::inline_hook((void *) sci_gets, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_gets"));
|
|
detour::inline_hook((void *) sci_print_error, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_print_error"));
|
|
detour::inline_hook((void *) sci_puts, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_puts"));
|
|
detour::inline_hook((void *) sci_set_linebreak, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_set_linebreak"));
|
|
detour::inline_hook((void *) sci_setparam, libutils::try_proc(
|
|
EXTDEV_INSTANCE, "sci_setparam"));
|
|
}
|
|
}
|
|
|
|
void extdev_detach() {
|
|
// TODO
|
|
}
|