summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/xavix_mtrk_wheel.cpp
blob: 7816bf3b06cf3c05782ff0fabb7b12be0f25f5cb (plain) (tree)































































                                                                                                                                 
                                                                                                                                                                                                   

























                                                                                                                                    
// license:BSD-3-Clause
// copyright-holders:David Haywood
#include "emu.h"
#include "machine/xavix_mtrk_wheel.h"

DEFINE_DEVICE_TYPE(XAVIX_MTRK_WHEEL, xavix_mtrk_wheel_device, "xavix_mtrk_wheel", "XaviX / Radica Monster Truck Steering Wheel")

xavix_mtrk_wheel_device::xavix_mtrk_wheel_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
	: device_t(mconfig, XAVIX_MTRK_WHEEL, tag, owner, clock),
	m_event_out_cb(*this),
	m_in(*this, "WHEEL")
{
}

TIMER_CALLBACK_MEMBER(xavix_mtrk_wheel_device::event_timer)
{
	m_event_out_cb(1);
	m_is_running = 0;
	check_wheel();
}

void xavix_mtrk_wheel_device::check_wheel()
{
	uint8_t wheelval = m_in->read();

	if (wheelval == 0x80)
	{
		m_event_timer->adjust(attotime::never, 0);
		m_direction = 0;
		m_is_running = 0;
	}
	else if (wheelval > 0x80)
	{
		wheelval = wheelval - 0x80;
		m_direction = 1;
		// TODO: set frequency based on value
		m_event_timer->adjust(attotime::from_hz(20), 0);
		m_is_running = 1;
	}
	else
	{
		wheelval = 0x7f - wheelval;
		m_direction = 0;
		// TODO: set frequency based on value
		m_event_timer->adjust(attotime::from_hz(20), 0);
		m_is_running = 1;
	}
}

INPUT_CHANGED_MEMBER( xavix_mtrk_wheel_device::changed )
{
	// this could happen while the timer is still active, which could end up cancelling it in flight
	// should probably calculate adjustment based on current expiry?
	// instead I'm just making sure the timer isn't running right now
	//printf("wheel changed to %02x\n", m_in->read());
	if (!m_is_running)
	{
		check_wheel();
	}
}


static INPUT_PORTS_START( wheel )
	PORT_START("WHEEL")
	PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x20,0xe0) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_CENTERDELTA(20) PORT_CHANGED_MEMBER(DEVICE_SELF, xavix_mtrk_wheel_device, changed, 0)
INPUT_PORTS_END


ioport_constructor xavix_mtrk_wheel_device::device_input_ports() const
{
	return INPUT_PORTS_NAME(wheel);
}


void xavix_mtrk_wheel_device::device_start()
{
	m_event_out_cb.resolve_safe();
	m_event_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(xavix_mtrk_wheel_device::event_timer), this));
}

void xavix_mtrk_wheel_device::device_reset()
{
	m_direction = 0;
	m_event_timer->adjust(attotime::never, 0);
	m_is_running = 0;
}

int xavix_mtrk_wheel_device::read_direction()
{
	return m_direction;
}