예제 #1
0
/**
 * Reset controller
 **/
static void ResetController()
{
	int i = 0;
	for (i = 0; i < 4; i++) {
		struct controller_data_s ctrl_zero = {};
		set_controller_data(i, &ctrl_zero);
	}
}
예제 #2
0
static int usbctrl_ireq_callback(usbreq_t *ur)
{
	usbctrl_softc_t *uhid = (ur->ur_ref); //FIXME: are we allowed to use ur_ref for this purpose?
	
/*	int i;
	for (i = 0; i < uhid->uhid_ipipemps; ++i)
		printf("%02x ", ur->ur_buffer[i]);
	printf("\n");  */
	
	/*
	 * If the driver is unloaded, the request will be cancelled.
	 */

	if (ur->ur_status == 0xFF) {
		usb_free_request(ur);
		return 0;
	}

	/*
	printf("Dump:\n");
	int i;
	for (i = 0; i < uhid->uhid_ipipemps; ++i)
		printf("%02x ", ur->ur_buffer[i]);
	printf("\n\n\n");
	*/


	struct controller_data_s c;
	unsigned char *b = ur->ur_buffer;
	
	if (uhid->is_wireless)
	{
		//FIXME: A polled, disconnected controller may cause uneeded spam of the controller status message
		if(uhid->index == -1)
		{
			//printf("Wireless controller %i has connected\n", uhid->wireless_index);
			int i;
			for (i = 0; controller_mask & (1<<i); ++i);
			//printf("attached controller %d\n", i);
			uhid->index = i;
			setcontroller(uhid, uhid->index);
			controller_mask |= 1<<i;
			
			usbctrl_set_leds(uhid, 0);
			
		}

		if (b[0] == 0x8 && b[1] == 0x0)
		{
			//printf("Wireless controller %i has disconnected\n", uhid->wireless_index);
			printf("detatched controller %d\n", uhid->index);
			setcontroller(NULL, uhid->index);
			controller_mask &= ~(1<<uhid->index);

			uhid->index = -1;
			goto ignore;

		}




		if (b[5] == 0x13)
		{
#if 0
			if (b[6] == 2) /* CHECKME: is this required for the Xbox racing wheel? */
				b++;
#endif				
			b += 4;
			
		} else
			goto ignore;
	}

	c.s1_x = (b[7] << 8) | b[6];
	c.s1_y = (b[9] << 8) | b[8];
	c.s2_x = (b[11] << 8) | b[10];
	c.s2_y = (b[13] << 8) | b[12];
	c.s1_z = !!(b[2] & 0x40);
	c.s2_z = !!(b[2] & 0x80);
	c.lt = b[4];
	c.rt = b[5];
	c.lb = !!(b[3] & 1);
	c.rb = !!(b[3] & 2);
	
	c.a = !!(b[3] & 0x10);
	c.b = !!(b[3] & 0x20);
	c.x = !!(b[3] & 0x40);
	c.y = !!(b[3] & 0x80);
	
	c.start = !!(b[2] & 0x10);
	c.back  = !!(b[2] & 0x20);
	
	c.up = !!(b[2] & 1);
	c.down = !!(b[2] & 2);
	c.left = !!(b[2] & 4);
	c.right = !!(b[2] & 8);
	
	c.logo = !!(b[3] & 0x4);
	
	set_controller_data(uhid->index, &c);

ignore:
	usb_queue_request(ur);

	return 0;
}