Blame view

src/main.c 3.86 KB
b24d2980   achemin1   Nettoyage du code...
1
  #include "libusb_wrapper.h"
d6e16d2e   achemin1   Tout propre
2
  #include <stdio.h>
4d621b43   achemin1   ajout interface d...
3
  #include <string.h>
b24d2980   achemin1   Nettoyage du code...
4
  
7d6f5a45   achemin1   add begin of main...
5
6
7
  #define VID 1003
  #define PID 8259
  
dd886d58   achemin1   refactor du code ...
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
  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);
f6896773   achemin1   Prise en charge d...
43
          }
dd886d58   achemin1   refactor du code ...
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
        } 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;
b24d2980   achemin1   Nettoyage du code...
132
  }