mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2026-09-26 08:55:24 -05:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1008576ce | ||
|
|
f41cdba8b8 | ||
|
|
1379c1e11b | ||
|
|
d1525a98dd | ||
|
|
329d6a80a3 | ||
|
|
f37f216c69 | ||
|
|
bdf493d2fb | ||
|
|
bec007d52a | ||
|
|
a177913bd6 | ||
|
|
0fdde8b32d | ||
|
|
09b3a6c24a | ||
|
|
f8b2f5f40d |
17
CHANGELOG.md
17
CHANGELOG.md
@@ -2,6 +2,23 @@
|
|||||||
Note for CI/CD: Ensure the version formatting in the sections is kept identical to the versions
|
Note for CI/CD: Ensure the version formatting in the sections is kept identical to the versions
|
||||||
given in tags. The pipeline will pick this up and cuts out the relevant section for release notes.
|
given in tags. The pipeline will pick this up and cuts out the relevant section for release notes.
|
||||||
|
|
||||||
|
## 5.48
|
||||||
|
### Features
|
||||||
|
* feat(config): Add invert analog input option. Remark: The old configuration file format is
|
||||||
|
upgraded but downgrading is not possible anymore. The new saves are using a new filename
|
||||||
|
and it doesn't delete the old files, see `C:\Users\<YOUR_USERNAME>\AppData\Roaming\DJHACKERS`
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
## 5.47
|
||||||
|
### Features
|
||||||
|
N/A
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
* fix(ddr/p3ioemu): Handle unknown 2B command to fix DDR X IO errors
|
||||||
|
* fix(ddr/p3io): Crash on all supported DDR games due to incorrect p3io message size validation
|
||||||
|
* fix(geninput): Sony DualShock 4 not working
|
||||||
|
|
||||||
## 5.46
|
## 5.46
|
||||||
### Features
|
### Features
|
||||||
* feat(ddrio): Wrapper/shim library to drive another ddrio in a dedicated IO thread. Improves performance for highly IO
|
* feat(ddrio): Wrapper/shim library to drive another ddrio in a dedicated IO thread. Improves performance for highly IO
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Bemanitools 5
|
# Bemanitools 5
|
||||||
|
|
||||||
Version: `5.46`
|
Version: `5.48`
|
||||||
|
|
||||||
[Changelog](CHANGELOG.md)
|
[Changelog](CHANGELOG.md)
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,13 @@ static INT_PTR analog_ui_handle_init(HWND hwnd, struct analog_def *def);
|
|||||||
static void analog_ui_handle_init_label(HWND hwnd);
|
static void analog_ui_handle_init_label(HWND hwnd);
|
||||||
static void analog_ui_handle_init_dev(HWND hwnd);
|
static void analog_ui_handle_init_dev(HWND hwnd);
|
||||||
static void analog_ui_handle_init_sensitivity(HWND hwnd);
|
static void analog_ui_handle_init_sensitivity(HWND hwnd);
|
||||||
|
static void analog_ui_handle_init_invert(HWND hwnd);
|
||||||
static bool analog_ui_match_device(struct hid_stub *hid);
|
static bool analog_ui_match_device(struct hid_stub *hid);
|
||||||
static void analog_ui_populate_controls(HWND hwnd);
|
static void analog_ui_populate_controls(HWND hwnd);
|
||||||
static INT_PTR analog_ui_handle_device_change(HWND hwnd);
|
static INT_PTR analog_ui_handle_device_change(HWND hwnd);
|
||||||
static INT_PTR analog_ui_handle_control_change(HWND hwnd);
|
static INT_PTR analog_ui_handle_control_change(HWND hwnd);
|
||||||
static INT_PTR analog_ui_handle_sensitivity_change(HWND hwnd);
|
static INT_PTR analog_ui_handle_sensitivity_change(HWND hwnd);
|
||||||
|
static INT_PTR analog_ui_handle_invert_change(HWND hwnd);
|
||||||
static INT_PTR analog_ui_handle_tick(HWND hwnd);
|
static INT_PTR analog_ui_handle_tick(HWND hwnd);
|
||||||
static INT_PTR analog_ui_handle_fini(HWND hwnd);
|
static INT_PTR analog_ui_handle_fini(HWND hwnd);
|
||||||
|
|
||||||
@@ -213,6 +215,15 @@ analog_ui_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case BN_CLICKED:
|
||||||
|
switch (LOWORD(wparam)) {
|
||||||
|
case IDC_ANALOG_INVERT:
|
||||||
|
return analog_ui_handle_invert_change(hwnd);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -248,6 +259,7 @@ static INT_PTR analog_ui_handle_init(HWND hwnd, struct analog_def *def)
|
|||||||
analog_ui_handle_init_label(hwnd);
|
analog_ui_handle_init_label(hwnd);
|
||||||
analog_ui_handle_init_dev(hwnd);
|
analog_ui_handle_init_dev(hwnd);
|
||||||
analog_ui_handle_init_sensitivity(hwnd);
|
analog_ui_handle_init_sensitivity(hwnd);
|
||||||
|
analog_ui_handle_init_invert(hwnd);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -343,6 +355,17 @@ static void analog_ui_handle_init_sensitivity(HWND hwnd)
|
|||||||
EnableWindow(slider, !mapper_is_analog_absolute(ui->def->tag));
|
EnableWindow(slider, !mapper_is_analog_absolute(ui->def->tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void analog_ui_handle_init_invert(HWND hwnd)
|
||||||
|
{
|
||||||
|
struct analog_ui *ui;
|
||||||
|
|
||||||
|
ui = (struct analog_ui *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||||||
|
|
||||||
|
if (mapper_get_analog_invert(ui->def->tag)) {
|
||||||
|
SendMessage(GetDlgItem(hwnd, IDC_ANALOG_INVERT), BM_SETCHECK, BST_CHECKED, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool analog_ui_match_device(struct hid_stub *hid)
|
static bool analog_ui_match_device(struct hid_stub *hid)
|
||||||
{
|
{
|
||||||
struct hid_control *controls;
|
struct hid_control *controls;
|
||||||
@@ -519,6 +542,21 @@ static INT_PTR analog_ui_handle_sensitivity_change(HWND hwnd)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT_PTR analog_ui_handle_invert_change(HWND hwnd)
|
||||||
|
{
|
||||||
|
struct analog_ui *ui;
|
||||||
|
HWND btn;
|
||||||
|
bool invert;
|
||||||
|
|
||||||
|
ui = (struct analog_ui *) GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
||||||
|
btn = GetDlgItem(hwnd, IDC_ANALOG_INVERT);
|
||||||
|
invert = SendMessage(btn, BM_GETCHECK, 0, 0) == BST_CHECKED;
|
||||||
|
|
||||||
|
mapper_set_analog_invert(ui->def->tag, invert);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static INT_PTR analog_ui_handle_tick(HWND hwnd)
|
static INT_PTR analog_ui_handle_tick(HWND hwnd)
|
||||||
{
|
{
|
||||||
struct analog_ui *ui;
|
struct analog_ui *ui;
|
||||||
|
|||||||
@@ -22,18 +22,19 @@ IDR_USAGES USAGES "config/usages.txt"
|
|||||||
// Dialog resources
|
// Dialog resources
|
||||||
//
|
//
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_ANALOG DIALOG 0, 0, 220, 100
|
IDD_ANALOG DIALOG 0, 0, 220, 115
|
||||||
STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW
|
STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_VISIBLE | WS_CHILDWINDOW
|
||||||
EXSTYLE WS_EX_CONTROLPARENT
|
EXSTYLE WS_EX_CONTROLPARENT
|
||||||
FONT 8, "Ms Shell Dlg"
|
FONT 8, "Ms Shell Dlg"
|
||||||
{
|
{
|
||||||
GROUPBOX "", IDC_GROUP, 5, 5, 210, 90
|
GROUPBOX "", IDC_GROUP, 5, 5, 210, 105
|
||||||
CONTROL "", IDC_SENSITIVITY, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS, 10, 75, 200, 15
|
CONTROL "", IDC_SENSITIVITY, TRACKBAR_CLASS, WS_TABSTOP | TBS_AUTOTICKS, 10, 75, 200, 15
|
||||||
LTEXT "Device", IDC_STATIC, 15, 15, 24, 8, SS_LEFT
|
LTEXT "Device", IDC_STATIC, 15, 15, 24, 8, SS_LEFT
|
||||||
COMBOBOX IDC_DEVICE, 15, 25, 135, 30, WS_GROUP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
|
COMBOBOX IDC_DEVICE, 15, 25, 135, 30, WS_GROUP | WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
|
||||||
COMBOBOX IDC_CONTROL, 15, 50, 135, 30, WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
|
COMBOBOX IDC_CONTROL, 15, 50, 135, 30, WS_TABSTOP | CBS_DROPDOWNLIST | CBS_HASSTRINGS
|
||||||
LTEXT "Sensitivity", IDC_STATIC, 15, 65, 32, 8, SS_LEFT
|
LTEXT "Sensitivity", IDC_STATIC, 15, 65, 32, 8, SS_LEFT
|
||||||
LTEXT "Control", IDC_STATIC, 15, 40, 23, 8, SS_LEFT
|
LTEXT "Control", IDC_STATIC, 15, 40, 23, 8, SS_LEFT
|
||||||
|
AUTOCHECKBOX "Invert Axis", IDC_ANALOG_INVERT, 15, 95, 141, 8
|
||||||
CONTROL "", IDC_POSITION, "spinner", 0x50020000, 160, 15, 50, 50, 0x02002000
|
CONTROL "", IDC_POSITION, "spinner", 0x50020000, 160, 15, 50, 50, 0x02002000
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +127,7 @@ FONT 8, "Ms Shell Dlg"
|
|||||||
|
|
||||||
|
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_TAB_ANALOGS DIALOG 0, 0, 220, 215
|
IDD_TAB_ANALOGS DIALOG 0, 0, 220, 230
|
||||||
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
||||||
CAPTION "Analogs"
|
CAPTION "Analogs"
|
||||||
FONT 8, "Ms Shell Dlg"
|
FONT 8, "Ms Shell Dlg"
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#define IDC_DEVICE 1005
|
#define IDC_DEVICE 1005
|
||||||
#define IDC_BINDING_EDIT 1006
|
#define IDC_BINDING_EDIT 1006
|
||||||
#define IDC_CONTROL 1006
|
#define IDC_CONTROL 1006
|
||||||
|
#define IDC_ANALOG_INVERT 1007
|
||||||
#define IDC_BINDING_CLEAR 1007
|
#define IDC_BINDING_CLEAR 1007
|
||||||
#define IDC_BINDING_MIN 1008
|
#define IDC_BINDING_MIN 1008
|
||||||
#define IDC_PAGE_TEXT 1008
|
#define IDC_PAGE_TEXT 1008
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void dev_list_init(struct dev_list *devs, const GUID *class_guid)
|
|||||||
devs->infolist = SetupDiGetClassDevs(
|
devs->infolist = SetupDiGetClassDevs(
|
||||||
devs->class_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
devs->class_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||||
|
|
||||||
if (devs->infolist == NULL) {
|
if (devs->infolist == INVALID_HANDLE_VALUE) {
|
||||||
log_fatal(
|
log_fatal(
|
||||||
"SetupDiGetClassDevs failed: %08x", (unsigned int) GetLastError());
|
"SetupDiGetClassDevs failed: %08x", (unsigned int) GetLastError());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ EXPORTS
|
|||||||
mapper_get_action_map
|
mapper_get_action_map
|
||||||
mapper_get_analog_map
|
mapper_get_analog_map
|
||||||
mapper_get_analog_sensitivity
|
mapper_get_analog_sensitivity
|
||||||
|
mapper_get_analog_invert
|
||||||
mapper_get_npages
|
mapper_get_npages
|
||||||
mapper_get_nanalogs
|
mapper_get_nanalogs
|
||||||
mapper_get_nlights
|
mapper_get_nlights
|
||||||
@@ -44,6 +45,7 @@ EXPORTS
|
|||||||
mapper_set_action_map
|
mapper_set_action_map
|
||||||
mapper_set_analog_map
|
mapper_set_analog_map
|
||||||
mapper_set_analog_sensitivity
|
mapper_set_analog_sensitivity
|
||||||
|
mapper_set_analog_invert
|
||||||
mapper_set_light_map
|
mapper_set_light_map
|
||||||
mapper_set_nanalogs
|
mapper_set_nanalogs
|
||||||
mapper_set_nlights
|
mapper_set_nlights
|
||||||
|
|||||||
@@ -48,7 +48,12 @@ arrays_fail:
|
|||||||
hid_meta_out_fini_caps(meta);
|
hid_meta_out_fini_caps(meta);
|
||||||
|
|
||||||
caps_fail:
|
caps_fail:
|
||||||
return false;
|
/**
|
||||||
|
* Still allow the device to be used as input.
|
||||||
|
* Useful for devices like the Sony DUALSHOCK 4, where it indicates it can receive outputs
|
||||||
|
* but it errors out when trying to initialize an output report.
|
||||||
|
*/
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@@ -99,9 +104,11 @@ hid_meta_out_init_caps(struct hid_meta_out *meta, PHIDP_PREPARSED_DATA ppd)
|
|||||||
|
|
||||||
caps_val_fail:
|
caps_val_fail:
|
||||||
free(meta->caps_val);
|
free(meta->caps_val);
|
||||||
|
meta->caps_val = NULL;
|
||||||
|
|
||||||
caps_btn_fail:
|
caps_btn_fail:
|
||||||
free(meta->caps_btn);
|
free(meta->caps_btn);
|
||||||
|
meta->caps_btn = NULL;
|
||||||
|
|
||||||
caps_tlc_fail:
|
caps_tlc_fail:
|
||||||
return false;
|
return false;
|
||||||
@@ -114,7 +121,6 @@ static bool hid_meta_out_init_arrays(struct hid_meta_out *meta)
|
|||||||
bool *report_presence;
|
bool *report_presence;
|
||||||
unsigned int nreports;
|
unsigned int nreports;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint8_t *bytes;
|
|
||||||
size_t nbytes;
|
size_t nbytes;
|
||||||
size_t count;
|
size_t count;
|
||||||
|
|
||||||
@@ -174,7 +180,6 @@ static bool hid_meta_out_init_arrays(struct hid_meta_out *meta)
|
|||||||
for (i = 0; i < 0x100; i++) {
|
for (i = 0; i < 0x100; i++) {
|
||||||
if (report_presence[i]) {
|
if (report_presence[i]) {
|
||||||
nbytes = meta->caps_tlc.OutputReportByteLength;
|
nbytes = meta->caps_tlc.OutputReportByteLength;
|
||||||
bytes = xmalloc(meta->caps_tlc.OutputReportByteLength);
|
|
||||||
|
|
||||||
if (!hid_report_out_init(
|
if (!hid_report_out_init(
|
||||||
&meta->reports[meta->nreports],
|
&meta->reports[meta->nreports],
|
||||||
@@ -198,14 +203,22 @@ static bool hid_meta_out_init_arrays(struct hid_meta_out *meta)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
r_init_fail:
|
r_init_fail:
|
||||||
free(bytes);
|
|
||||||
|
|
||||||
for (i = meta->nreports; i > 0; i--) {
|
for (i = meta->nreports; i > 0; i--) {
|
||||||
hid_report_out_fini(&meta->reports[i - 1]);
|
hid_report_out_fini(&meta->reports[i - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(report_presence);
|
free(report_presence);
|
||||||
|
|
||||||
|
// Clear out all output/light data
|
||||||
|
meta->nreports = 0;
|
||||||
free(meta->reports);
|
free(meta->reports);
|
||||||
|
meta->reports = NULL;
|
||||||
|
|
||||||
|
meta->nlights = 0;
|
||||||
|
meta->nbuttons = 0;
|
||||||
|
// Failed out before allocating memory
|
||||||
|
meta->lights = NULL;
|
||||||
|
meta->priv_lights = NULL;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -433,5 +446,8 @@ static void hid_meta_out_fini_arrays(struct hid_meta_out *meta)
|
|||||||
static void hid_meta_out_fini_caps(struct hid_meta_out *meta)
|
static void hid_meta_out_fini_caps(struct hid_meta_out *meta)
|
||||||
{
|
{
|
||||||
free(meta->caps_btn);
|
free(meta->caps_btn);
|
||||||
|
meta->caps_btn = NULL;
|
||||||
|
|
||||||
free(meta->caps_val);
|
free(meta->caps_val);
|
||||||
|
meta->caps_val = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ bool mapper_get_action_map(
|
|||||||
uint8_t action, uint8_t page, struct mapped_action *ma);
|
uint8_t action, uint8_t page, struct mapped_action *ma);
|
||||||
bool mapper_get_analog_map(uint8_t analog, struct mapped_analog *ma);
|
bool mapper_get_analog_map(uint8_t analog, struct mapped_analog *ma);
|
||||||
int32_t mapper_get_analog_sensitivity(uint8_t analog);
|
int32_t mapper_get_analog_sensitivity(uint8_t analog);
|
||||||
|
bool mapper_get_analog_invert(uint8_t analog);
|
||||||
uint8_t mapper_get_nanalogs(void);
|
uint8_t mapper_get_nanalogs(void);
|
||||||
uint8_t mapper_get_nlights(void);
|
uint8_t mapper_get_nlights(void);
|
||||||
uint8_t mapper_get_npages(void);
|
uint8_t mapper_get_npages(void);
|
||||||
@@ -25,6 +26,7 @@ void mapper_set_action_map(
|
|||||||
uint8_t action, uint8_t page, uint8_t bit, const struct mapped_action *ma);
|
uint8_t action, uint8_t page, uint8_t bit, const struct mapped_action *ma);
|
||||||
bool mapper_set_analog_map(uint8_t analog, const struct mapped_analog *ma);
|
bool mapper_set_analog_map(uint8_t analog, const struct mapped_analog *ma);
|
||||||
bool mapper_set_analog_sensitivity(uint8_t analog, int32_t sensitivity);
|
bool mapper_set_analog_sensitivity(uint8_t analog, int32_t sensitivity);
|
||||||
|
bool mapper_set_analog_invert(uint8_t analog, bool invert);
|
||||||
void mapper_set_nanalogs(uint8_t nanalogs);
|
void mapper_set_nanalogs(uint8_t nanalogs);
|
||||||
void mapper_set_nlights(uint8_t nlights);
|
void mapper_set_nlights(uint8_t nlights);
|
||||||
void mapper_set_light_map(const struct mapped_light *ml, uint8_t game_light);
|
void mapper_set_light_map(const struct mapped_light *ml, uint8_t game_light);
|
||||||
|
|||||||
@@ -25,10 +25,20 @@ static volatile long input_init_count;
|
|||||||
static FILE *mapper_config_open(const char *game_type, const char *mode)
|
static FILE *mapper_config_open(const char *game_type, const char *mode)
|
||||||
{
|
{
|
||||||
char path[MAX_PATH];
|
char path[MAX_PATH];
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
str_format(path, sizeof(path), "%s_v5_00a07.bin", game_type);
|
str_format(path, sizeof(path), "%s.bin", game_type);
|
||||||
|
f = fopen_appdata("DJHACKERS", path, mode);
|
||||||
|
|
||||||
return fopen_appdata("DJHACKERS", path, mode);
|
// Try to load the old save file only if we're loading
|
||||||
|
if (f == NULL) {
|
||||||
|
if (strchr(mode, 'r') != NULL) {
|
||||||
|
str_format(path, sizeof(path), "%s_v5_00a07.bin", game_type);
|
||||||
|
f = fopen_appdata("DJHACKERS", path, mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void input_set_loggers(
|
void input_set_loggers(
|
||||||
@@ -144,6 +154,11 @@ int32_t mapper_get_analog_sensitivity(uint8_t analog)
|
|||||||
return mapper_impl_get_analog_sensitivity(mapper_inst, analog);
|
return mapper_impl_get_analog_sensitivity(mapper_inst, analog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mapper_get_analog_invert(uint8_t analog)
|
||||||
|
{
|
||||||
|
return mapper_impl_get_analog_invert(mapper_inst, analog);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t mapper_get_nanalogs(void)
|
uint8_t mapper_get_nanalogs(void)
|
||||||
{
|
{
|
||||||
return mapper_impl_get_nanalogs(mapper_inst);
|
return mapper_impl_get_nanalogs(mapper_inst);
|
||||||
@@ -190,6 +205,11 @@ bool mapper_set_analog_sensitivity(uint8_t analog, int32_t sensitivity)
|
|||||||
return mapper_impl_set_analog_sensitivity(mapper_inst, analog, sensitivity);
|
return mapper_impl_set_analog_sensitivity(mapper_inst, analog, sensitivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mapper_set_analog_invert(uint8_t analog, bool invert)
|
||||||
|
{
|
||||||
|
return mapper_impl_set_analog_invert(mapper_inst, analog, invert);
|
||||||
|
}
|
||||||
|
|
||||||
void mapper_set_light_map(const struct mapped_light *ml, uint8_t game_light)
|
void mapper_set_light_map(const struct mapped_light *ml, uint8_t game_light)
|
||||||
{
|
{
|
||||||
mapper_impl_set_light_map(mapper_inst, ml, game_light);
|
mapper_impl_set_light_map(mapper_inst, ml, game_light);
|
||||||
|
|||||||
@@ -6,9 +6,25 @@
|
|||||||
#include "util/fs.h"
|
#include "util/fs.h"
|
||||||
#include "util/mem.h"
|
#include "util/mem.h"
|
||||||
|
|
||||||
static bool mapper_impl_config_load_actions(struct mapper *m, FILE *f);
|
enum mapper_config_version {
|
||||||
static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f);
|
MAPPER_VERSION_BEFORE_VERSIONING = 0,
|
||||||
static bool mapper_impl_config_load_lights(struct mapper *m, FILE *f);
|
MAPPER_VERSION_INVERT_AXIS,
|
||||||
|
|
||||||
|
// --- Add new versions above this line --- //
|
||||||
|
MAPPER_VERSION_PLUS_ONE,
|
||||||
|
MAPPER_VERSION_LATEST = MAPPER_VERSION_PLUS_ONE - 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FOURCC(a, b, c, d) \
|
||||||
|
((uint32_t) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a)))
|
||||||
|
|
||||||
|
// Bemanitools Mapper Data
|
||||||
|
static const uint32_t mapper_fourcc = FOURCC('B', 'T', 'M', 'D');
|
||||||
|
|
||||||
|
static uint32_t mapper_impl_config_load_version(FILE *f);
|
||||||
|
static bool mapper_impl_config_load_actions(struct mapper *m, FILE *f, uint32_t version);
|
||||||
|
static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f, uint32_t version);
|
||||||
|
static bool mapper_impl_config_load_lights(struct mapper *m, FILE *f, uint32_t version);
|
||||||
static void mapper_impl_config_save_actions(struct mapper *m, FILE *f);
|
static void mapper_impl_config_save_actions(struct mapper *m, FILE *f);
|
||||||
static void mapper_impl_config_save_analogs(struct mapper *m, FILE *f);
|
static void mapper_impl_config_save_analogs(struct mapper *m, FILE *f);
|
||||||
static void mapper_impl_config_save_lights(struct mapper *m, FILE *f);
|
static void mapper_impl_config_save_lights(struct mapper *m, FILE *f);
|
||||||
@@ -16,14 +32,17 @@ static void mapper_impl_config_save_lights(struct mapper *m, FILE *f);
|
|||||||
struct mapper *mapper_impl_config_load(FILE *f)
|
struct mapper *mapper_impl_config_load(FILE *f)
|
||||||
{
|
{
|
||||||
struct mapper *m;
|
struct mapper *m;
|
||||||
|
uint32_t version = MAPPER_VERSION_BEFORE_VERSIONING;
|
||||||
|
|
||||||
hid_mgr_lock(); /* Need to convert from HID objects to /dev nodes */
|
hid_mgr_lock(); /* Need to convert from HID objects to /dev nodes */
|
||||||
|
|
||||||
|
version = mapper_impl_config_load_version(f);
|
||||||
|
|
||||||
m = mapper_impl_create();
|
m = mapper_impl_create();
|
||||||
|
|
||||||
if (!mapper_impl_config_load_actions(m, f) ||
|
if (!mapper_impl_config_load_actions(m, f, version) ||
|
||||||
!mapper_impl_config_load_analogs(m, f) ||
|
!mapper_impl_config_load_analogs(m, f, version) ||
|
||||||
!mapper_impl_config_load_lights(m, f)) {
|
!mapper_impl_config_load_lights(m, f, version)) {
|
||||||
mapper_impl_destroy(m);
|
mapper_impl_destroy(m);
|
||||||
m = NULL;
|
m = NULL;
|
||||||
}
|
}
|
||||||
@@ -33,7 +52,29 @@ struct mapper *mapper_impl_config_load(FILE *f)
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mapper_impl_config_load_actions(struct mapper *m, FILE *f)
|
static uint32_t mapper_impl_config_load_version(FILE *f)
|
||||||
|
{
|
||||||
|
uint32_t fourcc = 0;
|
||||||
|
uint32_t version = MAPPER_VERSION_BEFORE_VERSIONING;
|
||||||
|
|
||||||
|
if (!read_u32(f, &fourcc)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fourcc == mapper_fourcc) {
|
||||||
|
|
||||||
|
if (!read_u32(f, &version)) {
|
||||||
|
fseek(f, -4, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
fseek(f, -4, SEEK_CUR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool mapper_impl_config_load_actions(struct mapper *m, FILE *f, uint32_t version)
|
||||||
{
|
{
|
||||||
char *dev_node;
|
char *dev_node;
|
||||||
struct mapped_action ma;
|
struct mapped_action ma;
|
||||||
@@ -69,11 +110,12 @@ static bool mapper_impl_config_load_actions(struct mapper *m, FILE *f)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f)
|
static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f, uint32_t version)
|
||||||
{
|
{
|
||||||
char *dev_node;
|
char *dev_node;
|
||||||
struct mapped_analog ma;
|
struct mapped_analog ma;
|
||||||
int32_t sensitivity;
|
int32_t sensitivity;
|
||||||
|
bool invert;
|
||||||
uint8_t nanalogs;
|
uint8_t nanalogs;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
@@ -101,8 +143,19 @@ static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version >= MAPPER_VERSION_INVERT_AXIS) {
|
||||||
|
|
||||||
|
if (!read_u8(f, &invert)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
invert = false;
|
||||||
|
}
|
||||||
|
|
||||||
mapper_impl_set_analog_map(m, i, &ma);
|
mapper_impl_set_analog_map(m, i, &ma);
|
||||||
mapper_impl_set_analog_sensitivity(m, i, sensitivity);
|
mapper_impl_set_analog_sensitivity(m, i, sensitivity);
|
||||||
|
mapper_impl_set_analog_invert(m, i, invert);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(dev_node);
|
free(dev_node);
|
||||||
@@ -111,7 +164,7 @@ static bool mapper_impl_config_load_analogs(struct mapper *m, FILE *f)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mapper_impl_config_load_lights(struct mapper *m, FILE *f)
|
static bool mapper_impl_config_load_lights(struct mapper *m, FILE *f, uint32_t version)
|
||||||
{
|
{
|
||||||
char *dev_node;
|
char *dev_node;
|
||||||
struct mapped_light ml;
|
struct mapped_light ml;
|
||||||
@@ -156,8 +209,13 @@ static bool mapper_impl_config_load_lights(struct mapper *m, FILE *f)
|
|||||||
|
|
||||||
void mapper_impl_config_save(struct mapper *m, FILE *f)
|
void mapper_impl_config_save(struct mapper *m, FILE *f)
|
||||||
{
|
{
|
||||||
|
const uint32_t mapper_latest_version = MAPPER_VERSION_LATEST;
|
||||||
|
|
||||||
hid_mgr_lock();
|
hid_mgr_lock();
|
||||||
|
|
||||||
|
write_u32(f, &mapper_fourcc);
|
||||||
|
write_u32(f, &mapper_latest_version);
|
||||||
|
|
||||||
mapper_impl_config_save_actions(m, f);
|
mapper_impl_config_save_actions(m, f);
|
||||||
mapper_impl_config_save_analogs(m, f);
|
mapper_impl_config_save_analogs(m, f);
|
||||||
mapper_impl_config_save_lights(m, f);
|
mapper_impl_config_save_lights(m, f);
|
||||||
@@ -211,6 +269,7 @@ static void mapper_impl_config_save_analogs(struct mapper *m, FILE *f)
|
|||||||
{
|
{
|
||||||
struct mapped_analog ma;
|
struct mapped_analog ma;
|
||||||
int32_t sensitivity;
|
int32_t sensitivity;
|
||||||
|
bool invert;
|
||||||
uint8_t nanalogs;
|
uint8_t nanalogs;
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
|
||||||
@@ -224,10 +283,12 @@ static void mapper_impl_config_save_analogs(struct mapper *m, FILE *f)
|
|||||||
write_str(f, "");
|
write_str(f, "");
|
||||||
} else {
|
} else {
|
||||||
sensitivity = mapper_impl_get_analog_sensitivity(m, i);
|
sensitivity = mapper_impl_get_analog_sensitivity(m, i);
|
||||||
|
invert = mapper_impl_get_analog_invert(m, i);
|
||||||
|
|
||||||
write_str(f, hid_stub_get_dev_node(ma.hid));
|
write_str(f, hid_stub_get_dev_node(ma.hid));
|
||||||
write_u32(f, &ma.control_no);
|
write_u32(f, &ma.control_no);
|
||||||
write_u32(f, &sensitivity);
|
write_u32(f, &sensitivity);
|
||||||
|
write_u8(f, &invert);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ struct analog_mapping {
|
|||||||
bool bound;
|
bool bound;
|
||||||
bool valid;
|
bool valid;
|
||||||
bool absolute;
|
bool absolute;
|
||||||
double affine_scale;
|
bool invert;
|
||||||
double affine_bias;
|
double analog_min;
|
||||||
|
double analog_max;
|
||||||
|
double inv_analog_range;
|
||||||
uint8_t pos;
|
uint8_t pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -169,8 +171,9 @@ static void analog_mapping_bind(struct analog_mapping *am)
|
|||||||
|
|
||||||
ctl = &controls[am->src.control_no];
|
ctl = &controls[am->src.control_no];
|
||||||
|
|
||||||
am->affine_bias = ctl->value_min;
|
am->analog_min = ctl->value_min;
|
||||||
am->affine_scale = ctl->value_max - ctl->value_min;
|
am->analog_max = ctl->value_max;
|
||||||
|
am->inv_analog_range = 1.0 / ((int64_t)ctl->value_max - ctl->value_min);
|
||||||
am->absolute = !(ctl->flags & HID_FLAG_RELATIVE);
|
am->absolute = !(ctl->flags & HID_FLAG_RELATIVE);
|
||||||
am->valid = true;
|
am->valid = true;
|
||||||
|
|
||||||
@@ -187,6 +190,7 @@ static void analog_mapping_update(struct analog_mapping *am)
|
|||||||
{
|
{
|
||||||
double tmp;
|
double tmp;
|
||||||
int32_t value;
|
int32_t value;
|
||||||
|
int8_t delta;
|
||||||
|
|
||||||
if (!am->bound) {
|
if (!am->bound) {
|
||||||
analog_mapping_bind(am);
|
analog_mapping_bind(am);
|
||||||
@@ -201,10 +205,24 @@ static void analog_mapping_update(struct analog_mapping *am)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (am->absolute) {
|
if (am->absolute) {
|
||||||
tmp = (value - am->affine_bias) / am->affine_scale;
|
|
||||||
|
if (am->invert) {
|
||||||
|
tmp = am->analog_max - value;
|
||||||
|
} else {
|
||||||
|
tmp = value - am->analog_min;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale the input value to [0,1] range
|
||||||
|
tmp *= am->inv_analog_range;
|
||||||
am->pos = (uint8_t) ((tmp + 0.5) * 256.0);
|
am->pos = (uint8_t) ((tmp + 0.5) * 256.0);
|
||||||
} else {
|
} else {
|
||||||
am->pos += (int8_t) (value * exp(am->sensitivity / 256.0));
|
delta = (int8_t) (value * exp(am->sensitivity / 256.0));
|
||||||
|
|
||||||
|
if (am->invert) {
|
||||||
|
delta *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
am->pos += delta;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -406,6 +424,15 @@ int32_t mapper_impl_get_analog_sensitivity(struct mapper *m, uint8_t analog)
|
|||||||
return m->analogs[analog].sensitivity;
|
return m->analogs[analog].sensitivity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mapper_impl_get_analog_invert(struct mapper* m, uint8_t analog)
|
||||||
|
{
|
||||||
|
if (analog >= m->nanalogs) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return m->analogs[analog].invert;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t mapper_impl_get_nanalogs(struct mapper *m)
|
uint8_t mapper_impl_get_nanalogs(struct mapper *m)
|
||||||
{
|
{
|
||||||
return m->nanalogs;
|
return m->nanalogs;
|
||||||
@@ -531,6 +558,18 @@ bool mapper_impl_set_analog_sensitivity(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mapper_impl_set_analog_invert(
|
||||||
|
struct mapper *m, uint8_t analog, bool invert)
|
||||||
|
{
|
||||||
|
if (analog >= m->nanalogs) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m->analogs[analog].invert = invert;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void mapper_impl_set_light_map(
|
void mapper_impl_set_light_map(
|
||||||
struct mapper *m, const struct mapped_light *ml, uint8_t game_light)
|
struct mapper *m, const struct mapped_light *ml, uint8_t game_light)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ bool mapper_impl_get_analog_map(
|
|||||||
bool mapper_impl_get_action_map(
|
bool mapper_impl_get_action_map(
|
||||||
struct mapper *m, uint8_t action, uint8_t page, struct mapped_action *ma);
|
struct mapper *m, uint8_t action, uint8_t page, struct mapped_action *ma);
|
||||||
int32_t mapper_impl_get_analog_sensitivity(struct mapper *m, uint8_t analog);
|
int32_t mapper_impl_get_analog_sensitivity(struct mapper *m, uint8_t analog);
|
||||||
|
bool mapper_impl_get_analog_invert(struct mapper *m, uint8_t analog);
|
||||||
uint8_t mapper_impl_get_nanalogs(struct mapper *m);
|
uint8_t mapper_impl_get_nanalogs(struct mapper *m);
|
||||||
uint8_t mapper_impl_get_nlights(struct mapper *m);
|
uint8_t mapper_impl_get_nlights(struct mapper *m);
|
||||||
uint8_t mapper_impl_get_npages(struct mapper *m);
|
uint8_t mapper_impl_get_npages(struct mapper *m);
|
||||||
@@ -73,6 +74,8 @@ bool mapper_impl_set_analog_map(
|
|||||||
struct mapper *m, uint8_t analog, const struct mapped_analog *ma);
|
struct mapper *m, uint8_t analog, const struct mapped_analog *ma);
|
||||||
bool mapper_impl_set_analog_sensitivity(
|
bool mapper_impl_set_analog_sensitivity(
|
||||||
struct mapper *m, uint8_t analog, int32_t sensitivity);
|
struct mapper *m, uint8_t analog, int32_t sensitivity);
|
||||||
|
bool mapper_impl_set_analog_invert(
|
||||||
|
struct mapper *m, uint8_t analog, bool invert);
|
||||||
void mapper_impl_set_light_map(
|
void mapper_impl_set_light_map(
|
||||||
struct mapper *m, const struct mapped_light *ml, uint8_t game_light);
|
struct mapper *m, const struct mapped_light *ml, uint8_t game_light);
|
||||||
void mapper_impl_set_nanalogs(struct mapper *m, uint8_t nanalogs);
|
void mapper_impl_set_nanalogs(struct mapper *m, uint8_t nanalogs);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ static HANDLE mm_open_device(void)
|
|||||||
dev_info = SetupDiGetClassDevsW(
|
dev_info = SetupDiGetClassDevsW(
|
||||||
&hid_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
&hid_guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||||
|
|
||||||
if (dev_info == NULL) {
|
if (dev_info == INVALID_HANDLE_VALUE) {
|
||||||
log_fatal("SetupDiGetClassDevs failed");
|
log_fatal("SetupDiGetClassDevs failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ void p3io_resp_hdr_init(
|
|||||||
{
|
{
|
||||||
log_assert(resp_hdr != NULL);
|
log_assert(resp_hdr != NULL);
|
||||||
log_assert(req_hdr != NULL);
|
log_assert(req_hdr != NULL);
|
||||||
log_assert(nbytes < P3IO_MAX_MESSAGE_SIZE);
|
log_assert(nbytes <= P3IO_MAX_MESSAGE_SIZE);
|
||||||
|
|
||||||
/* Length byte in this packet format counts everything from the length
|
/* Length byte in this packet format counts everything from the length
|
||||||
byte onwards. The length byte itself occurs at the start of the frame. */
|
byte onwards. The length byte itself occurs at the start of the frame. */
|
||||||
|
|||||||
@@ -161,6 +161,11 @@ struct p3io_req_rs232_write {
|
|||||||
uint8_t bytes[128];
|
uint8_t bytes[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct p3io_req_unknown_generic {
|
||||||
|
struct p3io_hdr hdr;
|
||||||
|
uint8_t unknown;
|
||||||
|
};
|
||||||
|
|
||||||
struct p3io_req_raw {
|
struct p3io_req_raw {
|
||||||
uint8_t data[P3IO_MAX_MESSAGE_SIZE];
|
uint8_t data[P3IO_MAX_MESSAGE_SIZE];
|
||||||
};
|
};
|
||||||
@@ -182,6 +187,7 @@ union p3io_req_any {
|
|||||||
struct p3io_req_rs232_open_close rs232_open_close;
|
struct p3io_req_rs232_open_close rs232_open_close;
|
||||||
struct p3io_req_rs232_read rs232_read;
|
struct p3io_req_rs232_read rs232_read;
|
||||||
struct p3io_req_rs232_write rs232_write;
|
struct p3io_req_rs232_write rs232_write;
|
||||||
|
struct p3io_req_unknown_generic unknown_generic;
|
||||||
struct p3io_req_raw raw;
|
struct p3io_req_raw raw;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -266,6 +272,11 @@ struct p3io_resp_rs232_write {
|
|||||||
uint8_t nbytes;
|
uint8_t nbytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct p3io_resp_unknown_generic {
|
||||||
|
struct p3io_hdr hdr;
|
||||||
|
uint8_t unknown;
|
||||||
|
};
|
||||||
|
|
||||||
struct p3io_resp_raw {
|
struct p3io_resp_raw {
|
||||||
uint8_t data[P3IO_MAX_MESSAGE_SIZE];
|
uint8_t data[P3IO_MAX_MESSAGE_SIZE];
|
||||||
};
|
};
|
||||||
@@ -286,6 +297,7 @@ union p3io_resp_any {
|
|||||||
struct p3io_resp_rs232_open_close rs232_open_close;
|
struct p3io_resp_rs232_open_close rs232_open_close;
|
||||||
struct p3io_resp_rs232_read rs232_read;
|
struct p3io_resp_rs232_read rs232_read;
|
||||||
struct p3io_resp_rs232_write rs232_write;
|
struct p3io_resp_rs232_write rs232_write;
|
||||||
|
struct p3io_resp_unknown_generic unknown_generic;
|
||||||
struct p3io_resp_raw raw;
|
struct p3io_resp_raw raw;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ static void p3io_cmd_get_video_freq(
|
|||||||
const struct p3io_req_get_video_freq *req,
|
const struct p3io_req_get_video_freq *req,
|
||||||
struct p3io_resp_get_video_freq *resp);
|
struct p3io_resp_get_video_freq *resp);
|
||||||
static void
|
static void
|
||||||
|
p3io_cmd_unknown_2b(const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp);
|
||||||
|
static void
|
||||||
p3io_cmd_init(const struct p3io_req_init *req, struct p3io_resp_init *resp);
|
p3io_cmd_init(const struct p3io_req_init *req, struct p3io_resp_init *resp);
|
||||||
static void p3io_cmd_get_coinstock(
|
static void p3io_cmd_get_coinstock(
|
||||||
const struct p3io_req_coin_stock *req, struct p3io_resp_coin_stock *resp);
|
const struct p3io_req_coin_stock *req, struct p3io_resp_coin_stock *resp);
|
||||||
@@ -56,7 +58,7 @@ static void p3io_cmd_set_coin_counter(
|
|||||||
const struct p3io_req_set_coin_counter *req,
|
const struct p3io_req_set_coin_counter *req,
|
||||||
struct p3io_resp_set_coin_counter *resp);
|
struct p3io_resp_set_coin_counter *resp);
|
||||||
static void
|
static void
|
||||||
p3io_cmd_unknown(const union p3io_req_any *req, struct p3io_resp_raw *resp);
|
p3io_cmd_unknown(const struct p3io_req_unknown_generic *req, struct p3io_resp_unknown_generic *resp);
|
||||||
|
|
||||||
void p3io_emu_init(const struct p3io_ops *ops, void *ctx)
|
void p3io_emu_init(const struct p3io_ops *ops, void *ctx)
|
||||||
{
|
{
|
||||||
@@ -268,6 +270,11 @@ static HRESULT p3io_cmd_dispatch(const union p3io_req_any *req)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case P3IO_CMD_UNKNOWN_2B:
|
||||||
|
p3io_cmd_unknown_2b(&req->unknown_2b, &resp.unknown_2b);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case P3IO_CMD_INIT:
|
case P3IO_CMD_INIT:
|
||||||
p3io_cmd_init(&req->init, &resp.init);
|
p3io_cmd_init(&req->init, &resp.init);
|
||||||
|
|
||||||
@@ -301,7 +308,7 @@ static HRESULT p3io_cmd_dispatch(const union p3io_req_any *req)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
p3io_cmd_unknown(req, &resp.raw);
|
p3io_cmd_unknown(&req->unknown_generic, &resp.unknown_generic);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -511,6 +518,16 @@ static void p3io_cmd_get_video_freq(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
p3io_cmd_unknown_2b(const struct p3io_req_unknown_2b *req, struct p3io_resp_unknown_2b *resp)
|
||||||
|
{
|
||||||
|
log_misc("Unknown 2b");
|
||||||
|
|
||||||
|
p3io_resp_hdr_init(&resp->hdr, sizeof(*resp), &req->hdr);
|
||||||
|
|
||||||
|
resp->unknown = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
p3io_cmd_init(const struct p3io_req_init *req, struct p3io_resp_init *resp)
|
p3io_cmd_init(const struct p3io_req_init *req, struct p3io_resp_init *resp)
|
||||||
{
|
{
|
||||||
@@ -557,15 +574,16 @@ static void p3io_cmd_set_coin_counter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
p3io_cmd_unknown(const union p3io_req_any *req, struct p3io_resp_raw *resp)
|
p3io_cmd_unknown(const struct p3io_req_unknown_generic *req, struct p3io_resp_unknown_generic *resp)
|
||||||
{
|
{
|
||||||
log_warning("Unsupported P3IO command: %02x", req->hdr.cmd);
|
log_warning("Unsupported P3IO command, sending default response (might not work/crash though): %02x",
|
||||||
|
req->hdr.cmd);
|
||||||
|
|
||||||
p3io_resp_hdr_init(
|
p3io_resp_hdr_init(&resp->hdr, sizeof(*resp), &req->hdr);
|
||||||
(struct p3io_hdr *) &resp->data, sizeof(*resp), &req->hdr);
|
|
||||||
|
|
||||||
// Not always applicable/correct as there are several commands not
|
// Not always applicable/correct as there are several commands not
|
||||||
// responding with any data, but fine for the majority of (unsupported)
|
// responding with any data, but fine for the majority of (unsupported)
|
||||||
// commands
|
// commands
|
||||||
resp->data[sizeof(struct p3io_hdr) + 0] = 0;
|
// Remark: This might also lead to unpredictable behaviour or crashes
|
||||||
|
resp->unknown = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user