xm_player/src/cursor.cpp
2025-06-29 16:57:17 -05:00

75 lines
2.6 KiB
C++

#include <bit>
#include "maple/maple.hpp"
#include "maple/maple_host_command_writer.hpp"
#include "maple/maple_bus_bits.hpp"
#include "maple/maple_bus_commands.hpp"
#include "maple/maple_bus_ft0.hpp"
#include "maple/maple_bus_ft9.hpp"
#include "sh7091/serial.hpp"
#include "math/math.hpp"
#include "input.hpp"
#include "cursor.hpp"
#include "framebuffer.hpp"
namespace cursor {
struct cursor state[4];
void init()
{
for (int port_ix = 0; port_ix < 4; port_ix++) {
state[port_ix].x = framebuffer.px_width / 2;
state[port_ix].y = framebuffer.px_height / 2;
}
}
void update()
{
for (int port_ix = 0; port_ix < 4; port_ix++) {
state[port_ix].active = false;
auto& port = input::state.port[port_ix];
if ((port.function_type & function_type::controller) != 0 && port.host_response_data_transfer_ft0 != nullptr) {
auto& bus_data = port.host_response_data_transfer_ft0->bus_data;
auto& data_fields = bus_data.data_fields;
if ((std::byteswap(data_fields.function_type) & function_type::controller) == 0)
continue;
auto& data = data_fields.data;
float dx = static_cast<float>(data.analog_coordinate_axis[2] - 0x80) * 0.015;
float dy = static_cast<float>(data.analog_coordinate_axis[3] - 0x80) * 0.015;
state[port_ix].x += dx;
state[port_ix].y += dy;
state[port_ix].a = ft0::data_transfer::digital_button::a(data.digital_button) == 0;
state[port_ix].b = ft0::data_transfer::digital_button::b(data.digital_button) == 0;
state[port_ix].active = true;
} else if ((port.function_type & function_type::pointing) != 0 && port.host_response_data_transfer_ft9 != nullptr) {
auto& bus_data = port.host_response_data_transfer_ft9->bus_data;
auto& data_fields = bus_data.data_fields;
if ((std::byteswap(data_fields.function_type) & function_type::pointing) == 0)
continue;
auto& data = data_fields.data;
float dx = static_cast<float>(data.analog_coordinate_axis[0] - 0x200) * 0.65;
float dy = static_cast<float>(data.analog_coordinate_axis[1] - 0x200) * 0.65;
state[port_ix].x += dx;
state[port_ix].y += dy;
state[port_ix].a = ft9::data_transfer::digital_button::a(data.digital_button) == 0;
state[port_ix].b = ft9::data_transfer::digital_button::b(data.digital_button) == 0;
state[port_ix].active = true;
}
state[port_ix].x = clamp<float>(state[port_ix].x, 0, framebuffer.px_width - 1);
state[port_ix].y = clamp<float>(state[port_ix].y, 0, framebuffer.px_height - 1);
}
}
}