93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
#include "foot.h"
|
|
|
|
#include "rawinput/rawinput.h"
|
|
#include "util/logging.h"
|
|
|
|
#include "../ddr.h"
|
|
#include "../io.h"
|
|
|
|
bool games::ddr::DDRFOOTHandle::open(LPCWSTR lpFileName) {
|
|
if (wcscmp(lpFileName, L"COM1") != 0) {
|
|
return false;
|
|
}
|
|
log_info("ddr", "Opened COM1 (FOOT)");
|
|
return true;
|
|
}
|
|
|
|
int games::ddr::DDRFOOTHandle::read(LPVOID lpBuffer, DWORD nNumberOfBytesToRead) {
|
|
|
|
// check data trigger and buffer size
|
|
if (data_trigger && nNumberOfBytesToRead >= 1) {
|
|
data_trigger = false;
|
|
memset(lpBuffer, 0x11, 1);
|
|
return 1;
|
|
}
|
|
|
|
// no data
|
|
return 0;
|
|
}
|
|
|
|
int games::ddr::DDRFOOTHandle::write(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite) {
|
|
|
|
// check buffer size for lights
|
|
if (nNumberOfBytesToWrite == 4) {
|
|
|
|
// mappings
|
|
static const size_t mapping_bits[] = {
|
|
4, 6, 3, 5, // P1 L, U, R, D,
|
|
12, 14, 11, 13, // P2 L, U, R, D
|
|
22 // NEON
|
|
};
|
|
|
|
static const size_t mapping[] = {
|
|
Lights::P1_FOOT_LEFT,
|
|
Lights::P1_FOOT_UP,
|
|
Lights::P1_FOOT_RIGHT,
|
|
Lights::P1_FOOT_DOWN,
|
|
Lights::P2_FOOT_LEFT,
|
|
Lights::P2_FOOT_UP,
|
|
Lights::P2_FOOT_RIGHT,
|
|
Lights::P2_FOOT_DOWN,
|
|
Lights::NEON
|
|
};
|
|
|
|
// get light bits
|
|
uint32_t light_bits = *((uint32_t*) lpBuffer);
|
|
|
|
// get lights
|
|
auto &lights = get_lights();
|
|
|
|
// bit scan
|
|
for (size_t i = 0; i < 8; i++) {
|
|
float value = (light_bits & (1 << mapping_bits[i])) ? 1.f : 0.f;
|
|
GameAPI::Lights::writeLight(RI_MGR, lights.at(mapping[i]), value);
|
|
}
|
|
|
|
// only set the neon if in SD mode
|
|
// p3io sets it for HD mode.
|
|
if (games::ddr::SDMODE) {
|
|
float value = (light_bits & (1 << mapping_bits[8])) ? 1.f : 0.f;
|
|
GameAPI::Lights::writeLight(RI_MGR, lights.at(mapping[8]), value);
|
|
}
|
|
|
|
// flush
|
|
RI_MGR->devices_flush_output();
|
|
}
|
|
|
|
// trigger out data
|
|
data_trigger = true;
|
|
|
|
// return all data written
|
|
return (int) nNumberOfBytesToWrite;
|
|
}
|
|
|
|
int games::ddr::DDRFOOTHandle::device_io(DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer,
|
|
DWORD nOutBufferSize) {
|
|
return -1;
|
|
}
|
|
|
|
bool games::ddr::DDRFOOTHandle::close() {
|
|
log_info("ddr", "Closed COM1 (FOOT).");
|
|
return true;
|
|
}
|