Blame view

Software/src/main.c 3.86 KB
56d9dc54   achemin1   homogénéisation a...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  #include "libusb_wrapper.h"
  #include <stdio.h>
  #include <string.h>
  
  #define VID 1003
  #define PID 8259
  
  int main(int argc, char *argv[]) {
    printf("Hello World :-|\n");
  
    libusb_context *context;
    usbinit(&context);
  #ifdef DEBUG
    libusb_set_option(context, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
  #endif
  
    if (argc > 1) {
      // command mode
      if (strcmp(argv[1], "demo4.1") == 0) { // if 4.1
        printf("\e[91mDemo 4.1\e[39m\n");
        displayDevices(context);
      } else if (strcmp(argv[1], "demo4.1plus") == 0) { // if 4.1 bonus
        printf("\e[91mDemo 4.1\e[39m\n");
        displayDevicesMore(context);
      } else if (strcmp(argv[1], "demo4.2") == 0) { // if 4.2
        printf("\e[91mDemo 4.2\e[39m\n");
  
        if (argc > 3) {
          uint16_t vendor_id;
          uint16_t product_id;
          sscanf(argv[2], "%hu", &vendor_id);
          sscanf(argv[3], "%hu", &product_id);
  
          libusb_device_handle *handle;
          handle =
              libusb_open_device_with_vid_pid(context, vendor_id, product_id);
          if (handle != NULL) {
            printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id);
            displayDeviceEndpoints(handle);
          } else {
            printf("Error while getting handle of VID:%hu;PID:%hu\n", vendor_id,
                   product_id);
          }
        } else {
          printf("Error, need VID and PID\n");
        }
      } else {
        printf("Wrong command\n");
      }
  
    } else {
      // interactive mode
      printf("Welcome to interactive mode\n");
      printf("Compiled for VID:PID => %d:%d\n", VID, PID);
  
      // Find the device
      printf("Iterate list of devices, and getting the right one\n");
      libusb_device *device = NULL;
      getFirstDeviceFromID(context, VID, PID, &device);
      // code
      if (device == NULL) {
        printf("Error : cannot find the device !\n");
        return 1;
      }
  
      // take the handle
      libusb_device_handle *device_handle = NULL;
      if (libusb_open(device, &device_handle) != 0) {
        printf("Error : cannot handle the device\n");
        return 1;
      }
  
      // Take the interfaces
      printf("\nSearch for interfaces\n");
      struct libusb_interface *int_hidjoy = NULL;
      struct libusb_interface *int_leds = NULL;
      struct libusb_interface *int_vibrators = NULL;
      getOurInterfaces(device, &int_hidjoy, &int_leds, &int_vibrators);
  
      // Claim interface
      printf("\nClaim interfaces ...\n");
      printf("-Leds\n");
      interfaceclaim(device_handle, int_leds);
      printf("-Vibrators\n");
      interfaceclaim(device_handle, int_vibrators);
  
      // récupération des endpoints
      printf("\nRécupération endpoints\n");
      printf("-Leds");
      int endpoint_leds =
          getOnlyEndpoint(int_leds); /* ID of endpoint (bit 8 is 0) */
      printf(" is %d\n", endpoint_leds);
      printf("-Vibrators");
      int endpoint_vibrators =
          getOnlyEndpoint(int_vibrators); /* ID of endpoint (bit 8 is 0) */
      printf(" is %d\n", endpoint_vibrators);
  
      /*LE CODE UTILE*/
      int i;
      for(i = 0 ; i<5 ; i++) {
        unsigned char data[2] = {0xff, 0xff}; // data to send or to receive
        int size = 2;       // size to send or maximum size to receive
        int timeout = 1000; // timeout in ms
  
        // OUT interrupt, from host to device
        int bytes_out;
        printf("%p %02X\n", device_handle, endpoint_leds);
        int status = libusb_interrupt_transfer(device_handle, endpoint_leds, data,
                                               size, &bytes_out, timeout);
        if (status != 0) {
          perror("libusb_interrupt_transfer");
          exit(-1);
        }
  
        //sleep(1); demande l'ajout de macro pour la portabilité
      }
      /*FIN DU CODE UTILE*/
  
      // Close
      printf("\nUnclaim interfaces ...\n");
      printf("-Leds\n");
      interfaceclose(device_handle, int_leds);
      printf("-Vibrators\n");
      interfaceclose(device_handle, int_vibrators);
  
      printf("Finished\n");
    }
  
    usbclose(context);
  
    return 0;
  }