Esempio n. 1
0
int DInputPad::TokenIn(uint8_t *buf, int len)
{
	int range = range_max(mType);

	// Setting to unpressed
	ZeroMemory(&mWheelData, sizeof(wheel_data_t));
	mWheelData.steering = range >> 1;
	mWheelData.clutch = 0xFF;
	mWheelData.throttle = 0xFF;
	mWheelData.brake = 0xFF;
	mWheelData.hatswitch = 0x8;

	//TODO Atleast GT4 detects DFP then
	if(sendCrap)
	{
		pad_copy_data(mType, buf, mWheelData);
		sendCrap = false;
		return len;
	}

	PollDevices();

	//Allow in both ports but warn in configure dialog that only one DX wheel is supported for now
	//if(idx == 0){
		//mWheelData.steering = 8191 + (int)(GetControl(STEERING, false)* 8191.0f) ;
		
		if(calibrating){
			//Alternate full extents
			if (alternate)calidata--;
			else calidata++;

			if(calidata>range-1 || calidata < 1) alternate = !alternate;  //invert

			mWheelData.steering = calidata;		//pass fake

			//breakout after 11 seconds
			if(GetTickCount()-calibrationtime > 11000){
				calibrating = false;
				mWheelData.steering = range >> 1;
			}
		}else{
static int usb_pad_poll(PADState *ps, uint8_t *buf, int buflen)
{
	LinuxPADState *s = (LinuxPADState*)ps;
	uint8_t idx = 1 - s->padState.port;
	ssize_t len;
	if(idx > 1) return 0; //invalid port

	int range = range_max(idx);

	if(sendCrap)
	{
		// Setting to unpressed
		memset(&wheel_data, 0, sizeof(wheel_data_t));
		wheel_data.axis_x = range >> 1;
		wheel_data.axis_y = 0xFF;
		wheel_data.axis_z = 0xFF;
		wheel_data.axis_rz = 0xFF;
		wheel_data.hatswitch = 0x8;
		pad_copy_data(idx, buf, wheel_data);
		sendCrap = false;
		return len;
	}

	// Events are raised if state changes, so keep old generic_data intact
	//memset(&wheel_data, 0, sizeof(wheel_data_t));

	struct js_event event;
	int wtype = conf.WheelType[idx];

	//Non-blocking read sets len to -1 and errno to EAGAIN if no new data
	//TODO what happens when emulator is paused?
	while((len = read(s->fd, &event, sizeof(event))) > -1)
	{
		//Dbg("Read js len: %d %d\n", len, errno);
		if (len == sizeof(event))
		{ // ok
			if (event.type & JS_EVENT_AXIS)
			{
				//Dbg("Axis: %d, %d\n", event.number, event.value);
				switch(s->axismap[event.number])
				{
					case ABS_X: wheel_data.axis_x = NORM(event.value, range); break;
					case ABS_Y: wheel_data.axis_y = NORM(event.value, 0xFF); break;
					case ABS_Z: wheel_data.axis_z = NORM(event.value, 0xFF); break;
					//case ABS_RX: wheel_data.axis_rx = NORM(event.value, 0xFF); break;
					//case ABS_RY: wheel_data.axis_ry = NORM(event.value, 0xFF); break;
					case ABS_RZ: wheel_data.axis_rz = NORM(event.value, 0xFF); break;

					//FIXME hatswitch mapping
					//TODO Ignoring diagonal directions
					case ABS_HAT0X:
					case ABS_HAT1X:
						if(event.value < 0 ) //left usually
							wheel_data.hatswitch = PAD_HAT_W;
						else if(event.value > 0 ) //right
							wheel_data.hatswitch = PAD_HAT_E;
						else
							wheel_data.hatswitch = PAD_HAT_COUNT;
					break;
					case ABS_HAT0Y:
					case ABS_HAT1Y:
						if(event.value < 0 ) //up usually
							wheel_data.hatswitch = PAD_HAT_N;
						else if(event.value > 0 ) //down
							wheel_data.hatswitch = PAD_HAT_S;
						else
							wheel_data.hatswitch = PAD_HAT_COUNT;
					break;
					default: break;
				}
			}
			else if (event.type & JS_EVENT_BUTTON)
			{
				//Dbg("Button: %d, %d\n", event.number, event.value);
				//TODO can have 12 bits for buttons?
				if(event.number < 10)
				{
					//FIXME bit juggling
					if(event.value)
						wheel_data.buttons |= 1 << event.number; //on
					else
						wheel_data.buttons &= ~(1 << event.number); //off
				}
			}
		}
		else
		{
			Dbg("usb_pad_poll: unknown read error\n");
			break;
		}
	}

	//Dbg("call pad_copy_data\n");
	pad_copy_data(idx, buf, wheel_data);
	return buflen;
}
Esempio n. 3
0
int RawInputPad::TokenIn(uint8_t *buf, int len)
{
	uint8_t data[64];
	DWORD waitRes;
	ULONG value = 0;
	int ply = 1 - mPort;

	//fprintf(stderr,"usb-pad: poll len=%li\n", len);
	if(this->doPassthrough && this->usbHandle != INVALID_HANDLE_VALUE)
	{
		//ZeroMemory(buf, len);
		ReadFile(this->usbHandle, data, MIN(this->caps.InputReportByteLength, sizeof(data)), 0, &this->ovl);
		waitRes = WaitForSingleObject(this->ovl.hEvent, 50);
		if(waitRes == WAIT_TIMEOUT || waitRes == WAIT_ABANDONED){
			CancelIo(this->usbHandle);
			return 0;
		}
		memcpy(buf, data, len);
		return len;
	}

	//in case compiler magic with bitfields interferes
	wheel_data_t data_summed;
	memset(&data_summed, 0xFF, sizeof(data_summed));
	data_summed.hatswitch = 0x8;
	data_summed.buttons = 0;

	//TODO Atleast GT4 detects DFP then
	if(sendCrap)
	{
		sendCrap = false;
		pad_copy_data(mType, buf, data_summed);
		return len;
	}

	int copied = 0;
	//TODO fix the logics, also Config.cpp
	MapVector::iterator it = mapVector.begin();
	for(; it!=mapVector.end(); it++)
	{

		if (data_summed.steering < (*it).data[ply].steering)
		{
			data_summed.steering = (*it).data[ply].steering;
			copied |= 1;
		}

		//if(data_summed.clutch < (*it).data[ply].clutch)
		//	data_summed.clutch = (*it).data[ply].clutch;

		if (data_summed.throttle < (*it).data[ply].throttle)
		{
			data_summed.throttle = (*it).data[ply].throttle;
			copied |= 2;
		}

		if (data_summed.brake < (*it).data[ply].brake)
		{
			data_summed.brake = (*it).data[ply].brake;
			copied |= 4;
		}

		data_summed.buttons |= (*it).data[ply].buttons;
		if(data_summed.hatswitch > (*it).data[ply].hatswitch)
			data_summed.hatswitch = (*it).data[ply].hatswitch;
	}

	if (!copied)
		memcpy(&data_summed, &mDataCopy, sizeof(wheel_data_t));
	else
	{
		if (!(copied & 1))
			data_summed.steering = mDataCopy.steering;
		if (!(copied & 2))
			data_summed.throttle = mDataCopy.throttle;
		if (!(copied & 4))
			data_summed.brake = mDataCopy.brake;
	}

	pad_copy_data(mType, buf, data_summed);

	if (copied)
		memcpy(&mDataCopy, &data_summed, sizeof(wheel_data_t));
	return len;
}