ctlmissile.c.patch

Multi-USB::MissileLauncher for Win32 より

--- usblauncher-0.0.3/ctlmissile.c	2007-01-15 00:11:00.000000000 +0900
+++ ctlmissile.c	2007-05-01 21:34:26.625000000 +0900
@@ -16,6 +16,14 @@
 
 int debug = 0;
 
+#ifdef WIN32
+#include <windows.h>
+#define msec_sleep(msec) Sleep(msec)
+#else
+#include <unistd.h>
+#define msec_sleep(msec) usleep(msec * 1000)
+#endif
+
 /*
  * Command to control original M&S USB missile launcher.
  */
@@ -31,9 +39,11 @@
 		exit(EXIT_FAILURE);
 	}
 
+#ifdef LINUX
 	/* Detach kernel driver (usbhid) from device interface and claim */
 	usb_detach_kernel_driver_np(launcher, 0);
 	usb_detach_kernel_driver_np(launcher, 1);
+#endif
 
 	ret = usb_set_configuration(launcher, 1);
 	if (ret < 0) {
@@ -41,11 +51,13 @@
 		exit(EXIT_FAILURE);
 	}
 
+#ifdef LINUX
 	ret = usb_claim_interface(launcher, 1);
 	if (ret < 0) {
 		perror("Unable to claim interface");
 		exit(EXIT_FAILURE);
 	}
+#endif
 
 	ret = usb_set_altinterface(launcher, 0);
 	if (ret < 0) {
@@ -149,20 +161,25 @@
 		exit(EXIT_FAILURE);
 	}
 
+#ifdef LINUX
 	/* Detach kernel driver (usbhid) from device interface and claim */
 	usb_detach_kernel_driver_np(launcher, 0);
 	usb_detach_kernel_driver_np(launcher, 1);
+#endif
 
 	ret = usb_set_configuration(launcher, 1);
 	if (ret < 0) {
 		perror("Unable to set device configuration");
 		exit(EXIT_FAILURE);
 	}
+
+#ifdef LINUX
 	ret = usb_claim_interface(launcher, 0);
 	if (ret < 0) {
 		perror("Unable to claim interface");
 		exit(EXIT_FAILURE);
 	}
+#endif
 
 	memset(data, 0, 8);
 	if (!strcmp(cmd, "up")) {
@@ -201,11 +218,17 @@
 {
 	struct usb_bus *busses, *bus;
 	struct usb_device *dev = NULL;
+	int msec = 0;
+	int found_dev = 0;
 
-	if (argc != 2) {
-		printf("Usage: ctlmissile [ up | down | left | right | fire ]\n");
+	if (!(argc == 2 || argc == 3)) {
+		printf("Usage: ctlmissile [ up | down | left | right | fire | stop ] [ 3000 ]\n");
 		exit(EXIT_FAILURE);
 	}
+	if (argc == 3) {
+		msec = atol(argv[2]);
+		if (msec < 0) msec = 0;
+	}
 
 	usb_init();
 	usb_find_busses();
@@ -223,17 +246,25 @@
 			if (dev->descriptor.idVendor == 0x1130 &&
 				dev->descriptor.idProduct == 0x0202) {
 				send_command_ms(dev, argv[1]);
-				break;
+				if (msec > 0) {
+				    msec_sleep(msec);
+				    send_command_ms(dev, "stop");
+				}
+				found_dev++;
 			}
 			if (dev->descriptor.idVendor == 0x1941 &&
 				dev->descriptor.idProduct == 0x8021) {
 				send_command_cheeky(dev, argv[1]);
-				break;
+				if (msec > 0) {
+				    msec_sleep(msec);
+				    send_command_cheeky(dev, "stop");
+				}
+				found_dev++;
 			}
 		}
 	}
 
-	if (!dev) {
+	if (found_dev == 0) {
 		fprintf(stderr, "Unable to find device.\n");
 		exit(EXIT_FAILURE);
 	}