| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | 
							- /*******************************************************
 
-  Windows HID simplification
 
-  Alan Ott
 
-  Signal 11 Software
 
-  8/22/2009
 
-  Copyright 2009, All Rights Reserved.
 
-  
 
-  This contents of this file may be used by anyone
 
-  for any reason without any conditions and may be
 
-  used as a starting point for your own applications
 
-  which use HIDAPI.
 
- ********************************************************/
 
- #include <stdio.h>
 
- #include <wchar.h>
 
- #include <string.h>
 
- #include <stdlib.h>
 
- #include "hidapi.h"
 
- // Headers needed for sleeping.
 
- #ifdef _WIN32
 
- 	#include <windows.h>
 
- #else
 
- 	#include <unistd.h>
 
- #endif
 
- int main(int argc, char* argv[])
 
- {
 
- 	int res;
 
- 	unsigned char buf[256];
 
- 	#define MAX_STR 255
 
- 	wchar_t wstr[MAX_STR];
 
- 	hid_device *handle;
 
- 	int i;
 
- #ifdef WIN32
 
- 	UNREFERENCED_PARAMETER(argc);
 
- 	UNREFERENCED_PARAMETER(argv);
 
- #endif
 
- 	struct hid_device_info *devs, *cur_dev;
 
- 	
 
- 	if (hid_init())
 
- 		return -1;
 
- 	devs = hid_enumerate(0x0, 0x0);
 
- 	cur_dev = devs;	
 
- 	while (cur_dev) {
 
- 		printf("Device Found\n  type: %04hx %04hx\n  path: %s\n  serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number);
 
- 		printf("\n");
 
- 		printf("  Manufacturer: %ls\n", cur_dev->manufacturer_string);
 
- 		printf("  Product:      %ls\n", cur_dev->product_string);
 
- 		printf("  Release:      %hx\n", cur_dev->release_number);
 
- 		printf("  Interface:    %d\n",  cur_dev->interface_number);
 
- 		printf("\n");
 
- 		cur_dev = cur_dev->next;
 
- 	}
 
- 	hid_free_enumeration(devs);
 
- 	// Set up the command buffer.
 
- 	memset(buf,0x00,sizeof(buf));
 
- 	buf[0] = 0x01;
 
- 	buf[1] = 0x81;
 
- 	
 
- 	// Open the device using the VID, PID,
 
- 	// and optionally the Serial number.
 
- 	////handle = hid_open(0x4d8, 0x3f, L"12345");
 
- 	handle = hid_open(0x4d8, 0x3f, NULL);
 
- 	if (!handle) {
 
- 		printf("unable to open device\n");
 
-  		return 1;
 
- 	}
 
- 	// Read the Manufacturer String
 
- 	wstr[0] = 0x0000;
 
- 	res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
 
- 	if (res < 0)
 
- 		printf("Unable to read manufacturer string\n");
 
- 	printf("Manufacturer String: %ls\n", wstr);
 
- 	// Read the Product String
 
- 	wstr[0] = 0x0000;
 
- 	res = hid_get_product_string(handle, wstr, MAX_STR);
 
- 	if (res < 0)
 
- 		printf("Unable to read product string\n");
 
- 	printf("Product String: %ls\n", wstr);
 
- 	// Read the Serial Number String
 
- 	wstr[0] = 0x0000;
 
- 	res = hid_get_serial_number_string(handle, wstr, MAX_STR);
 
- 	if (res < 0)
 
- 		printf("Unable to read serial number string\n");
 
- 	printf("Serial Number String: (%d) %ls", wstr[0], wstr);
 
- 	printf("\n");
 
- 	// Read Indexed String 1
 
- 	wstr[0] = 0x0000;
 
- 	res = hid_get_indexed_string(handle, 1, wstr, MAX_STR);
 
- 	if (res < 0)
 
- 		printf("Unable to read indexed string 1\n");
 
- 	printf("Indexed String 1: %ls\n", wstr);
 
- 	// Set the hid_read() function to be non-blocking.
 
- 	hid_set_nonblocking(handle, 1);
 
- 	
 
- 	// Try to read from the device. There shoud be no
 
- 	// data here, but execution should not block.
 
- 	res = hid_read(handle, buf, 17);
 
- 	// Send a Feature Report to the device
 
- 	buf[0] = 0x2;
 
- 	buf[1] = 0xa0;
 
- 	buf[2] = 0x0a;
 
- 	buf[3] = 0x00;
 
- 	buf[4] = 0x00;
 
- 	res = hid_send_feature_report(handle, buf, 17);
 
- 	if (res < 0) {
 
- 		printf("Unable to send a feature report.\n");
 
- 	}
 
- 	memset(buf,0,sizeof(buf));
 
- 	// Read a Feature Report from the device
 
- 	buf[0] = 0x2;
 
- 	res = hid_get_feature_report(handle, buf, sizeof(buf));
 
- 	if (res < 0) {
 
- 		printf("Unable to get a feature report.\n");
 
- 		printf("%ls", hid_error(handle));
 
- 	}
 
- 	else {
 
- 		// Print out the returned buffer.
 
- 		printf("Feature Report\n   ");
 
- 		for (i = 0; i < res; i++)
 
- 			printf("%02hhx ", buf[i]);
 
- 		printf("\n");
 
- 	}
 
- 	memset(buf,0,sizeof(buf));
 
- 	// Toggle LED (cmd 0x80). The first byte is the report number (0x1).
 
- 	buf[0] = 0x1;
 
- 	buf[1] = 0x80;
 
- 	res = hid_write(handle, buf, 17);
 
- 	if (res < 0) {
 
- 		printf("Unable to write()\n");
 
- 		printf("Error: %ls\n", hid_error(handle));
 
- 	}
 
- 	
 
- 	// Request state (cmd 0x81). The first byte is the report number (0x1).
 
- 	buf[0] = 0x1;
 
- 	buf[1] = 0x81;
 
- 	hid_write(handle, buf, 17);
 
- 	if (res < 0)
 
- 		printf("Unable to write() (2)\n");
 
- 	// Read requested state. hid_read() has been set to be
 
- 	// non-blocking by the call to hid_set_nonblocking() above.
 
- 	// This loop demonstrates the non-blocking nature of hid_read().
 
- 	res = 0;
 
- 	while (res == 0) {
 
- 		res = hid_read(handle, buf, sizeof(buf));
 
- 		if (res == 0)
 
- 			printf("waiting...\n");
 
- 		if (res < 0)
 
- 			printf("Unable to read()\n");
 
- 		#ifdef WIN32
 
- 		Sleep(500);
 
- 		#else
 
- 		usleep(500*1000);
 
- 		#endif
 
- 	}
 
- 	printf("Data read:\n   ");
 
- 	// Print out the returned buffer.
 
- 	for (i = 0; i < res; i++)
 
- 		printf("%02hhx ", buf[i]);
 
- 	printf("\n");
 
- 	hid_close(handle);
 
- 	/* Free static HIDAPI objects. */
 
- 	hid_exit();
 
- #ifdef WIN32
 
- 	system("pause");
 
- #endif
 
- 	return 0;
 
- }
 
 
  |