Hi,

I have reproduced the problem in a simple testcase based on libhid_test.c to make sure that it was not something unrelated in the rest of my read program.

The attached simple program sends the same command three times. The device acts on it three times, but the results do not come back the second and third time. The second and third attempts fail with different results.

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn
http://www.marian-aldenhoevel.de
"I ran some quick calculations on it. He's about 80% on the right
 track.  That leaves him only 20% dead when he crashes." Bob C
#include <hid.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h> /* for getopt() */

int main()
{
  HIDInterface* hid;
  int iface_num = 0;
  hid_return ret;

  unsigned short vendor_id  = 0x0590;
  unsigned short product_id = 0x0034;

  HIDInterfaceMatcher matcher = { vendor_id, product_id, NULL, NULL, 0 };

  /* see include/debug.h for possible values */
  hid_set_debug(HID_DEBUG_ALL);
  hid_set_debug_stream(stderr);

  /* passed directly to libusb */
  hid_set_usb_debug(1);

  ret = hid_init();
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_init failed with return code %d\n", ret);
    return 1;
  }

  hid = hid_new_HIDInterface();
  if (hid == 0) {
    fprintf(stderr, "hid_new_HIDInterface() failed, out of memory?\n");
    return 1;
  }

  ret = hid_force_open(hid, iface_num, &matcher, 3);
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_force_open failed with return code %d\n", ret);
    return 1;
  }

  ret = hid_write_identification(stdout, hid);
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_write_identification failed with return code %d\n", 
ret);
    return 1;
  }

  ret = hid_dump_tree(stdout, hid);
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_dump_tree failed with return code %d\n", ret);
    return 1;
  }

  int sendloop;
  for (sendloop = 0 ; sendloop < 3 ; sendloop++) {
        unsigned char const SEND_PACKET_LEN = 11;
        char const PACKET[11] = { 0x02, 0x00, 0x03, 0x43, 0x30, 0x30, 0x00, 
0x00, 0x00, 0x00, 0x00 };

        const int PATHLEN=3;
        const int PATH_IN[3] = { 0xff000001, 0xff000021, 0xff000121 };

        ret = hid_set_output_report(hid, PATH_IN, PATHLEN, PACKET, 
SEND_PACKET_LEN);
        if (ret != HID_RET_SUCCESS) {
                fprintf(stderr, "hid_set_output_report failed with return code 
%d\n", ret);
        }

        const int size = 11;
        char buffer[11];
        ret = hid_interrupt_read(hid,0x81,buffer,size,1000);
        if (ret != HID_RET_SUCCESS) {
                  fprintf(stderr, "hid_get_input_report failed with return code 
%d\n", ret);
        }

        fprintf(stderr, "reply is [%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d]\n",
                buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],
                buffer[6],buffer[7],buffer[8],buffer[9],buffer[10]);

  }

  ret = hid_close(hid);
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_close failed with return code %d\n", ret);
    return 1;
  }

  hid_delete_HIDInterface(&hid);

  ret = hid_cleanup();
  if (ret != HID_RET_SUCCESS) {
    fprintf(stderr, "hid_cleanup failed with return code %d\n", ret);
    return 1;
  }

  return 0;
}
_______________________________________________
libhid-discuss mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/libhid-discuss

Reply via email to