Commit dd886d58e7c21dfdf32a5a298fbd377b7a107874

Authored by achemin1
1 parent a6e19c45

refactor du code avec clang-format + enlever la boucle infinie

Showing 3 changed files with 372 additions and 350 deletions   Show diff stats
include/libusb_wrapper.h
... ... @@ -2,34 +2,34 @@
2 2 #define LIBUSB_WRAPPER_H_
3 3  
4 4 #include <libusb-1.0/libusb.h>
5   -#include <stdlib.h>
6   -#include <stdio.h>
7 5 #include <stdbool.h>
  6 +#include <stdio.h>
  7 +#include <stdlib.h>
8 8  
9   -void usbinit(libusb_context** context_ptr);
10   -void usbclose(libusb_context* context);
  9 +void usbinit(libusb_context **context_ptr);
  10 +void usbclose(libusb_context *context);
11 11  
12   -void interfaceclaim(libusb_device_handle *handle, struct libusb_interface *interface);
13   -void interfaceclose(libusb_device_handle *handle, struct libusb_interface *interface);
  12 +void interfaceclaim(libusb_device_handle *handle,
  13 + struct libusb_interface *interface);
  14 +void interfaceclose(libusb_device_handle *handle,
  15 + struct libusb_interface *interface);
14 16  
15   -ssize_t getListDevices(libusb_context* context, libusb_device***list_ptr);
  17 +ssize_t getListDevices(libusb_context *context, libusb_device ***list_ptr);
16 18 void getFromKernel(libusb_device_handle *handle, int interface);
17 19  
18   -
19 20 void displayDevices(libusb_context *context);
20 21 void displayDevicesMore(libusb_context *context);
21 22  
22   -void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device);
  23 +void getFirstDeviceFromID(libusb_context *context, int vid, int pid,
  24 + libusb_device **device);
23 25  
24 26 void getOurInterfaces(libusb_device *device,
25 27 struct libusb_interface **int_hidjoy,
26 28 struct libusb_interface **int_leds,
27   - struct libusb_interface **int_vibrators
28   -);
  29 + struct libusb_interface **int_vibrators);
29 30  
30   -void displayDeviceEndpoints ();
  31 +void displayDeviceEndpoints();
31 32  
32   -char getOnlyEndpoint(struct libusb_interface * interface);
  33 +char getOnlyEndpoint(struct libusb_interface *interface);
33 34  
34 35 #endif
35   -
... ...
src/libusb_wrapper.c
1 1 #include "libusb_wrapper.h"
2 2  
3   -
4   -
5 3 void usbinit(libusb_context **context_ptr) {
6   - //libusb_context *context;
7   - int statusInit = libusb_init(context_ptr);
8   - if (statusInit != LIBUSB_SUCCESS) {
9   - perror("libusb_init");
10   - exit(-1);
11   - }
  4 + // libusb_context *context;
  5 + int statusInit = libusb_init(context_ptr);
  6 + if (statusInit != LIBUSB_SUCCESS) {
  7 + perror("libusb_init");
  8 + exit(-1);
  9 + }
12 10 }
13 11  
14   -void usbclose(libusb_context *context) {
15   - libusb_exit(context);
16   -}
  12 +void usbclose(libusb_context *context) { libusb_exit(context); }
17 13  
18   -void interfaceclaim(libusb_device_handle *handle, struct libusb_interface *interface){
19   - const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0]; //TODO enlever cette ligne, refactor
  14 +void interfaceclaim(libusb_device_handle *handle,
  15 + struct libusb_interface *interface) {
  16 + const struct libusb_interface_descriptor *interface_desc =
  17 + &interface->altsetting[0]; // TODO enlever cette ligne, refactor
20 18  
21   - if(interface_desc->bInterfaceClass == LIBUSB_CLASS_VENDOR_SPEC){//ON PEUT VERIFIER LA CLASS
22   - printf("> vendor specific class\n");
  19 + if (interface_desc->bInterfaceClass ==
  20 + LIBUSB_CLASS_VENDOR_SPEC) { // ON PEUT VERIFIER LA CLASS
  21 + printf("> vendor specific class\n");
23 22  
24   - int status=libusb_claim_interface(handle, interface_desc->bInterfaceNumber);
25   - if(status!=0){ perror("libusb_claim_interface"); exit(-1); }
26   - }
  23 + int status =
  24 + libusb_claim_interface(handle, interface_desc->bInterfaceNumber);
  25 + if (status != 0) {
  26 + perror("libusb_claim_interface");
  27 + exit(-1);
  28 + }
  29 + }
27 30 }
28 31  
29   -void interfaceclose(libusb_device_handle *handle, struct libusb_interface *interface){
30   - const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0];
31   - int status = libusb_release_interface(handle, interface_desc->bInterfaceNumber);
32   - if(status!=0){ perror("libusb_release_interface"); exit(-1); }
  32 +void interfaceclose(libusb_device_handle *handle,
  33 + struct libusb_interface *interface) {
  34 + const struct libusb_interface_descriptor *interface_desc =
  35 + &interface->altsetting[0];
  36 + int status =
  37 + libusb_release_interface(handle, interface_desc->bInterfaceNumber);
  38 + if (status != 0) {
  39 + perror("libusb_release_interface");
  40 + exit(-1);
  41 + }
33 42 }
34 43  
35 44 // Si le méchant noyau est passé avant vous :
36   -void getFromKernel(libusb_device_handle *handle, int interface) { //private method for now
37   - if (libusb_kernel_driver_active(handle, interface)) {
38   - int statusKDriver = libusb_detach_kernel_driver(handle, interface);
39   - if (statusKDriver != LIBUSB_SUCCESS) {
40   - perror("libusb_detach_kernel_driver");
41   - exit(-1);
42   - }
  45 +void getFromKernel(libusb_device_handle *handle,
  46 + int interface) { // private method for now
  47 + if (libusb_kernel_driver_active(handle, interface)) {
  48 + int statusKDriver = libusb_detach_kernel_driver(handle, interface);
  49 + if (statusKDriver != LIBUSB_SUCCESS) {
  50 + perror("libusb_detach_kernel_driver");
  51 + exit(-1);
43 52 }
  53 + }
44 54 }
45 55  
46 56 ssize_t getListDevices(libusb_context *context, libusb_device ***list_ptr) {
47   - ssize_t count = libusb_get_device_list(context, list_ptr);
48   - if (count < 0) {
49   - perror("libusb_get_device_list");
50   - exit(-1);
51   - }
52   - return count;
  57 + ssize_t count = libusb_get_device_list(context, list_ptr);
  58 + if (count < 0) {
  59 + perror("libusb_get_device_list");
  60 + exit(-1);
  61 + }
  62 + return count;
53 63 }
54 64  
55   -void* _enumerateDevices(libusb_context *context, void (*func)(libusb_device *device)){
56   - libusb_device **list;
57   - ssize_t count = getListDevices(context, &list);
  65 +void *_enumerateDevices(libusb_context *context,
  66 + void (*func)(libusb_device *device)) {
  67 + libusb_device **list;
  68 + ssize_t count = getListDevices(context, &list);
58 69  
59   - ssize_t i = 0;
60   - for (i = 0; i < count; i++) {
61   - libusb_device *device = list[i];
  70 + ssize_t i = 0;
  71 + for (i = 0; i < count; i++) {
  72 + libusb_device *device = list[i];
62 73  
63   - func(device);
64   - }
  74 + func(device);
  75 + }
65 76  
66   - libusb_free_device_list(list, 1);
  77 + libusb_free_device_list(list, 1);
67 78  
68   - return NULL; //DBGONLY TEMP
  79 + return NULL; // DBGONLY TEMP
69 80 }
70 81  
71   -//print readable string, not asked for tutoring
72   -void _printConfig(libusb_device *device) {//private method
73   - // Ouverture du périphérique
74   - libusb_device_handle *handle;
75   - int statusDevice = libusb_open(device, &handle);
76   - if (statusDevice != LIBUSB_SUCCESS) {
77   - perror("libusb_open");
78   - //return; //exit(-1);
79   - }
80   -
81   - int MAXLEN_DESCRIPTOR_STRING = 200;
82   - uint8_t desc_idx = 2;
83   - //uint16_t langid = 16;
84   - unsigned char data[200];
85   -
86   - // TEST 16
87   - for (desc_idx = 0; desc_idx < 16; desc_idx++) {
88   - int statusAscii = libusb_get_string_descriptor_ascii(
89   - handle, desc_idx, data, MAXLEN_DESCRIPTOR_STRING);
90   - if (statusAscii == -9) // TEST seems to be LIBUSB_ERROR
91   - break;
92   - printf(" - Descriptor string : %s ; %i\n", data, statusAscii);
93   - }
94   -
95   - libusb_close(handle);
  82 +// print readable string, not asked for tutoring
  83 +void _printConfig(libusb_device *device) { // private method
  84 + // Ouverture du périphérique
  85 + libusb_device_handle *handle;
  86 + int statusDevice = libusb_open(device, &handle);
  87 + if (statusDevice != LIBUSB_SUCCESS) {
  88 + perror("libusb_open");
  89 + // return; //exit(-1);
  90 + }
  91 +
  92 + int MAXLEN_DESCRIPTOR_STRING = 200;
  93 + uint8_t desc_idx = 2;
  94 + // uint16_t langid = 16;
  95 + unsigned char data[200];
  96 +
  97 + // TEST 16
  98 + for (desc_idx = 0; desc_idx < 16; desc_idx++) {
  99 + int statusAscii = libusb_get_string_descriptor_ascii(
  100 + handle, desc_idx, data, MAXLEN_DESCRIPTOR_STRING);
  101 + if (statusAscii == -9) // TEST seems to be LIBUSB_ERROR
  102 + break;
  103 + printf(" - Descriptor string : %s ; %i\n", data, statusAscii);
  104 + }
  105 +
  106 + libusb_close(handle);
96 107 }
97 108  
  109 +void _displayOneDevice(libusb_device *device) {
  110 + struct libusb_device_descriptor desc;
98 111  
99   -void _displayOneDevice(libusb_device *device){
100   - struct libusb_device_descriptor desc;
  112 + int status = libusb_get_device_descriptor(device, &desc);
  113 + if (status != LIBUSB_SUCCESS) {
  114 + printf("Cannot get device desc : %s\n",
  115 + libusb_error_name(status)); // DBGONLY
  116 + perror("libusb_open");
  117 + return;
  118 + }
101 119  
102   - int status = libusb_get_device_descriptor(device, &desc);
103   - if (status != LIBUSB_SUCCESS){
104   - printf("Cannot get device desc : %s\n", libusb_error_name(status)); //DBGONLY
105   - perror("libusb_open");
106   - return;
107   - }
108   -
109   - uint8_t bus = libusb_get_bus_number(device);
110   - uint8_t address = libusb_get_device_address(device);
  120 + uint8_t bus = libusb_get_bus_number(device);
  121 + uint8_t address = libusb_get_device_address(device);
111 122  
112   - printf("Device Found @ (Bus:Address) %d:%d\n", bus, address);
113   - printf("Vendor ID 0x0%x\n", desc.idVendor);
114   - printf("Product ID 0x0%x\n", desc.idProduct);
  123 + printf("Device Found @ (Bus:Address) %d:%d\n", bus, address);
  124 + printf("Vendor ID 0x0%x\n", desc.idVendor);
  125 + printf("Product ID 0x0%x\n", desc.idProduct);
115 126  
116   - //displayDeviceEndpoints(device); //Not really work on Axel@Alptop
  127 + // displayDeviceEndpoints(device); //Not really work on Axel@Alptop
117 128 }
118 129  
119 130 void displayDevices(libusb_context *context) {
120   - _enumerateDevices(context, _displayOneDevice);
  131 + _enumerateDevices(context, _displayOneDevice);
121 132 }
122 133  
123   -void _displayOneDeviceMore(libusb_device *device){
124   - _displayOneDevice(device);
125   - _printConfig(device);
  134 +void _displayOneDeviceMore(libusb_device *device) {
  135 + _displayOneDevice(device);
  136 + _printConfig(device);
126 137 }
127 138  
128 139 void displayDevicesMore(libusb_context *context) {
129   - _enumerateDevices(context, _displayOneDeviceMore);
  140 + _enumerateDevices(context, _displayOneDeviceMore);
130 141 }
131 142  
132   -//get device from iteration (and not from not recommanded function :
133   -//ugly using global vars ?? Cannot communicate between getFirstDeviceFromID and _getFirstDeviceFromID
  143 +// get device from iteration (and not from not recommanded function :
  144 +// ugly using global vars ?? Cannot communicate between getFirstDeviceFromID and
  145 +// _getFirstDeviceFromID
134 146 int g_vid;
135 147 int g_pid;
136 148 libusb_device *g_device = NULL;
137 149 void _getFirstDeviceFromID(libusb_device *device) {
138   - struct libusb_device_descriptor desc;
139   -
140   - int status = libusb_get_device_descriptor(device, &desc);
141   - if (status != LIBUSB_SUCCESS){
142   - printf("Cannot get device desc : %s\n", libusb_error_name(status)); //DBGONLY
143   - perror("libusb_open");
144   - return;
145   - }
146   -
147   -
148   - if(desc.idVendor == g_vid && desc.idProduct == g_pid){
149   - g_device = device;
150   - }
  150 + struct libusb_device_descriptor desc;
  151 +
  152 + int status = libusb_get_device_descriptor(device, &desc);
  153 + if (status != LIBUSB_SUCCESS) {
  154 + printf("Cannot get device desc : %s\n",
  155 + libusb_error_name(status)); // DBGONLY
  156 + perror("libusb_open");
  157 + return;
  158 + }
  159 +
  160 + if (desc.idVendor == g_vid && desc.idProduct == g_pid) {
  161 + g_device = device;
  162 + }
151 163 }
152 164  
153   -void getFirstDeviceFromID(libusb_context *context, int vid, int pid, libusb_device **device) {
154   - g_vid = vid; //pass parameters for enumeration
155   - g_pid = pid; //idem
156   - _enumerateDevices(context, _getFirstDeviceFromID);
157   - *device = g_device; //get return from enumeration
  165 +void getFirstDeviceFromID(libusb_context *context, int vid, int pid,
  166 + libusb_device **device) {
  167 + g_vid = vid; // pass parameters for enumeration
  168 + g_pid = pid; // idem
  169 + _enumerateDevices(context, _getFirstDeviceFromID);
  170 + *device = g_device; // get return from enumeration
158 171 }
159 172  
160   -//void getDevicesFromID(vid, pid) //return array
161   -
162   -
163   -void displayDeviceEndpoints(libusb_device_handle* handle) {
164   - //recover pointer from handle
165   - libusb_device *device;
166   - device = libusb_get_device(handle);
167   -
168   -
169   - // lectures des configs => on prend la première configuration pour l'instant
170   - /*int configuration = 0; // valueof("bConfigurationValue");
171   - int statusConfig = libusb_set_configuration(handle, configuration);
172   - if (statusConfig != LIBUSB_SUCCESS) {
173   - perror("libusb_set_configuration");
174   - return;
175   - }*/
176   -
177   - // 4.2 configuration du périph usb
178   - struct libusb_config_descriptor *config;
179   - int statusFetchConfig = libusb_get_active_config_descriptor(device, &config);
180   - if (statusFetchConfig != LIBUSB_SUCCESS) {
181   - perror("libusb_get_active_config_descriptor");
182   - return;
  173 +// void getDevicesFromID(vid, pid) //return array
  174 +
  175 +void displayDeviceEndpoints(libusb_device_handle *handle) {
  176 + // recover pointer from handle
  177 + libusb_device *device;
  178 + device = libusb_get_device(handle);
  179 +
  180 + // lectures des configs => on prend la première configuration pour l'instant
  181 + /*int configuration = 0; // valueof("bConfigurationValue");
  182 + int statusConfig = libusb_set_configuration(handle, configuration);
  183 + if (statusConfig != LIBUSB_SUCCESS) {
  184 + perror("libusb_set_configuration");
  185 + return;
  186 + }*/
  187 +
  188 + // 4.2 configuration du périph usb
  189 + struct libusb_config_descriptor *config;
  190 + int statusFetchConfig = libusb_get_active_config_descriptor(device, &config);
  191 + if (statusFetchConfig != LIBUSB_SUCCESS) {
  192 + perror("libusb_get_active_config_descriptor");
  193 + return;
  194 + }
  195 +
  196 + // caractéristiques globales
  197 + printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue);
  198 + printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n",
  199 + config->bLength, config->bDescriptorType, config->bNumInterfaces);
  200 +
  201 + // itération des interfaces
  202 + printf("Itération de l'interface\n");
  203 + for (int indexInterface = 0; indexInterface < config->bNumInterfaces;
  204 + indexInterface++) {
  205 + printf("-indexInterface=%d\n", indexInterface);
  206 + printf("-Altsetting=%d\n",
  207 + config->interface[indexInterface].num_altsetting);
  208 +
  209 + const struct libusb_interface *interface =
  210 + &config->interface[indexInterface];
  211 +
  212 + // if 1 setting (or more)
  213 + if (interface->num_altsetting != 0) {
  214 + const struct libusb_interface_descriptor *interface_desc =
  215 + &interface->altsetting[0];
  216 +
  217 + printf("--bNumEndpoints=%d\n", interface_desc->bNumEndpoints);
  218 + printf("--bDescriptorType=%d\n", interface_desc->bDescriptorType);
  219 +
  220 + for (int indexEndpoints = 0;
  221 + indexEndpoints < interface_desc->bNumEndpoints; indexEndpoints++) {
  222 + const struct libusb_endpoint_descriptor *endpoint_desc =
  223 + &interface_desc->endpoint[indexEndpoints];
  224 + printf("---bDescriptorType=%d\n", endpoint_desc->bDescriptorType);
  225 + printf("---bEndpointAddress=%d\n", endpoint_desc->bEndpointAddress);
  226 +
  227 + if (endpoint_desc->extra != NULL)
  228 + printf("---extra: %s\n", endpoint_desc->extra);
  229 + if (endpoint_desc->bmAttributes ==
  230 + LIBUSB_TRANSFER_TYPE_INTERRUPT) // TODO AJOUT MASQUE ? (voir doc)
  231 + printf("---is of type INTERRUPT\n");
  232 + }
183 233 }
184 234  
185   - //caractéristiques globales
186   - printf("Config.bConfigurationValue : %d\n", config->bConfigurationValue);
187   - printf("Config/ bLength:%d\nbDescriptorType:%d\nbNumInterfaces:%d\n",
188   - config->bLength, config->bDescriptorType, config->bNumInterfaces);
189   -
190   -
191   - //itération des interfaces
192   - printf("Itération de l'interface\n");
193   - for (int indexInterface = 0; indexInterface < config->bNumInterfaces; indexInterface++) {
194   - printf("-indexInterface=%d\n", indexInterface);
195   - printf("-Altsetting=%d\n", config->interface[indexInterface].num_altsetting);
196   -
197   - const struct libusb_interface * interface = &config->interface[indexInterface];
198   -
199   -
200   - //if 1 setting (or more)
201   - if(interface->num_altsetting != 0) {
202   - const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0];
203   -
204   - printf("--bNumEndpoints=%d\n", interface_desc->bNumEndpoints);
205   - printf("--bDescriptorType=%d\n", interface_desc->bDescriptorType);
206   -
207   - for(int indexEndpoints = 0; indexEndpoints < interface_desc->bNumEndpoints ; indexEndpoints++){
208   - const struct libusb_endpoint_descriptor * endpoint_desc = &interface_desc->endpoint[indexEndpoints];
209   - printf("---bDescriptorType=%d\n", endpoint_desc->bDescriptorType);
210   - printf("---bEndpointAddress=%d\n", endpoint_desc->bEndpointAddress);
211   -
212   - if(endpoint_desc->extra != NULL)
213   - printf("---extra: %s\n", endpoint_desc->extra);
214   - if(endpoint_desc->bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT)//TODO AJOUT MASQUE ? (voir doc)
215   - printf("---is of type INTERRUPT\n");
216   - }
217   - }
218   -
219   -
  235 + // Affichez l’indice et le numéro de chaque interface détectée et réclamée.
  236 + // Affichez aussi les points d’accès trouvés en précisant ceux sauvés.
220 237  
221   - //Affichez l’indice et le numéro de chaque interface détectée et réclamée. Affichez aussi les points d’accès trouvés en précisant ceux sauvés.
  238 + /*
  239 + //int interface=valueof("bInterfaceNumber");
  240 + int
  241 + status=libusb_claim_interface(handle,interface->bInterfaceNumber);
  242 + if(status!=0){ perror("libusb_claim_interface"); exit(-1); }
222 243  
223   -/*
224   - //int interface=valueof("bInterfaceNumber");
225   - int status=libusb_claim_interface(handle,interface->bInterfaceNumber);
226   - if(status!=0){ perror("libusb_claim_interface"); exit(-1); }
  244 + status=libusb_release_interface(handle,interface->bInterfaceNumber);
  245 + if(status!=0){ perror("libusb_release_interface"); exit(-1); }
227 246  
228   - status=libusb_release_interface(handle,interface->bInterfaceNumber);
229   - if(status!=0){ perror("libusb_release_interface"); exit(-1); }
  247 + //claim_interface(.., config interface altsetting bInterfaceNumber
  248 + //config interface altsetting endpoint bmAttributes ==
  249 + LIBUSB_TRANSFER_TYPE_INTERRUPT
  250 + //add des enpoint unint8_t*/
230 251  
231   - //claim_interface(.., config interface altsetting bInterfaceNumber
232   - //config interface altsetting endpoint bmAttributes == LIBUSB_TRANSFER_TYPE_INTERRUPT
233   - //add des enpoint unint8_t*/
  252 + // DESCRIPTOR.C /.H :décommenter
234 253  
  254 + // IL FAUT RELEASE UNIQUEMENT LES INTERFACES QUI NE SONT PAS DES HID
  255 + }
235 256  
236   - //DESCRIPTOR.C /.H :décommenter
237   -
238   -
239   - //IL FAUT RELEASE UNIQUEMENT LES INTERFACES QUI NE SONT PAS DES HID
240   - }
241   -
242   - printf("\n");
243   -
244   - libusb_close(handle);
  257 + printf("\n");
245 258  
  259 + libusb_close(handle);
246 260 }
247 261  
248 262 void getOurInterfaces(libusb_device *device,
249 263 struct libusb_interface **int_hidjoy,
250 264 struct libusb_interface **int_leds,
251   - struct libusb_interface **int_vibrators
252   -) {
253   - struct libusb_config_descriptor *config;
254   - int statusFetchConfig = libusb_get_active_config_descriptor(device, &config);
255   - if (statusFetchConfig != LIBUSB_SUCCESS) {
256   - perror("libusb_get_active_config_descriptor");
257   - return;
258   - }
259   -
260   - //itération des interfaces
261   - for (int indexInterface = 0; indexInterface < config->bNumInterfaces; indexInterface++) {
262   -
263   - const struct libusb_interface * interface = &config->interface[indexInterface];
264   -
265   - //todo use le descriptor pour avoir bInterfaceNumber?
266   - if(indexInterface==0){
267   - *int_hidjoy = (struct libusb_interface *)interface;
268   - }else if(indexInterface==1){
269   - *int_leds = (struct libusb_interface *)interface;
270   - }else if(indexInterface==2){
271   - *int_vibrators = (struct libusb_interface *)interface;
272   - }
273   -
274   - //#define pour les indices correspondants aux interfaces
275   - //variables globales
  265 + struct libusb_interface **int_vibrators) {
  266 + struct libusb_config_descriptor *config;
  267 + int statusFetchConfig = libusb_get_active_config_descriptor(device, &config);
  268 + if (statusFetchConfig != LIBUSB_SUCCESS) {
  269 + perror("libusb_get_active_config_descriptor");
  270 + return;
  271 + }
  272 +
  273 + // itération des interfaces
  274 + for (int indexInterface = 0; indexInterface < config->bNumInterfaces;
  275 + indexInterface++) {
  276 +
  277 + const struct libusb_interface *interface =
  278 + &config->interface[indexInterface];
  279 +
  280 + // todo use le descriptor pour avoir bInterfaceNumber?
  281 + if (indexInterface == 0) {
  282 + *int_hidjoy = (struct libusb_interface *)interface;
  283 + } else if (indexInterface == 1) {
  284 + *int_leds = (struct libusb_interface *)interface;
  285 + } else if (indexInterface == 2) {
  286 + *int_vibrators = (struct libusb_interface *)interface;
276 287 }
277 288  
  289 + //#define pour les indices correspondants aux interfaces
  290 + // variables globales
  291 + }
278 292 }
279 293  
280   -char getOnlyEndpoint(struct libusb_interface * interface){
  294 +char getOnlyEndpoint(struct libusb_interface *interface) {
281 295  
282   - const struct libusb_interface_descriptor * interface_desc = &interface->altsetting[0];
  296 + const struct libusb_interface_descriptor *interface_desc =
  297 + &interface->altsetting[0];
283 298  
284   - const struct libusb_endpoint_descriptor * endpoint_desc = &interface_desc->endpoint[0];
  299 + const struct libusb_endpoint_descriptor *endpoint_desc =
  300 + &interface_desc->endpoint[0];
285 301  
286   - if(endpoint_desc->bmAttributes != LIBUSB_TRANSFER_TYPE_INTERRUPT)//ON PEUT VERIFIER LE TRANSFER TYPE
287   - printf("> is NOT of type INTERRUPT\n");
  302 + if (endpoint_desc->bmAttributes !=
  303 + LIBUSB_TRANSFER_TYPE_INTERRUPT) // ON PEUT VERIFIER LE TRANSFER TYPE
  304 + printf("> is NOT of type INTERRUPT\n");
288 305  
289   - return (char)endpoint_desc->bEndpointAddress;
  306 + return (char)endpoint_desc->bEndpointAddress;
290 307 }
... ...
src/main.c
... ... @@ -5,123 +5,128 @@
5 5 #define VID 1003
6 6 #define PID 8259
7 7  
8   -int main(int argc, char *argv[]){
9   - printf("Hello World :-|\n");
10   -
11   - libusb_context *context;
12   - usbinit(&context);
13   - #ifdef DEBUG
14   - libusb_set_option(context, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
15   - #endif
16   -
17   - if(argc>1){
18   - //command mode
19   - if(strcmp(argv[1], "demo4.1") == 0) { //if 4.1
20   - printf("\e[91mDemo 4.1\e[39m\n");
21   - displayDevices(context);
  8 +int main(int argc, char *argv[]) {
  9 + printf("Hello World :-|\n");
  10 +
  11 + libusb_context *context;
  12 + usbinit(&context);
  13 +#ifdef DEBUG
  14 + libusb_set_option(context, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
  15 +#endif
  16 +
  17 + if (argc > 1) {
  18 + // command mode
  19 + if (strcmp(argv[1], "demo4.1") == 0) { // if 4.1
  20 + printf("\e[91mDemo 4.1\e[39m\n");
  21 + displayDevices(context);
  22 + } else if (strcmp(argv[1], "demo4.1plus") == 0) { // if 4.1 bonus
  23 + printf("\e[91mDemo 4.1\e[39m\n");
  24 + displayDevicesMore(context);
  25 + } else if (strcmp(argv[1], "demo4.2") == 0) { // if 4.2
  26 + printf("\e[91mDemo 4.2\e[39m\n");
  27 +
  28 + if (argc > 3) {
  29 + uint16_t vendor_id;
  30 + uint16_t product_id;
  31 + sscanf(argv[2], "%hu", &vendor_id);
  32 + sscanf(argv[3], "%hu", &product_id);
  33 +
  34 + libusb_device_handle *handle;
  35 + handle =
  36 + libusb_open_device_with_vid_pid(context, vendor_id, product_id);
  37 + if (handle != NULL) {
  38 + printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id);
  39 + displayDeviceEndpoints(handle);
  40 + } else {
  41 + printf("Error while getting handle of VID:%hu;PID:%hu\n", vendor_id,
  42 + product_id);
22 43 }
23   - else if(strcmp(argv[1], "demo4.1plus") == 0) { //if 4.1 bonus
24   - printf("\e[91mDemo 4.1\e[39m\n");
25   - displayDevicesMore(context);
26   - }
27   - else if(strcmp(argv[1], "demo4.2") == 0){//if 4.2
28   - printf("\e[91mDemo 4.2\e[39m\n");
29   -
30   - if(argc > 3){
31   - uint16_t vendor_id;
32   - uint16_t product_id;
33   - sscanf(argv[2], "%hu", &vendor_id);
34   - sscanf(argv[3], "%hu", &product_id);
35   -
36   - libusb_device_handle* handle;
37   - handle = libusb_open_device_with_vid_pid(context, vendor_id, product_id);
38   - if(handle != NULL){
39   - printf("Show endpoints of VID:%hu;PID:%hu\n", vendor_id, product_id);
40   - displayDeviceEndpoints(handle);
41   - }
42   - else{
43   - printf("Error while getting handle of VID:%hu;PID:%hu\n", vendor_id, product_id);
44   - }
45   - }else{
46   - printf("Error, need VID and PID\n");
47   - }
48   - }else{
49   - printf("Wrong command\n");
50   - }
51   -
52   - }else{
53   - //interactive mode
54   - printf("Welcome to interactive mode\n");
55   - printf("Compiled for VID:PID => %d:%d\n", VID, PID);
56   -
57   - //Find the device
58   - printf("Iterate list of devices, and getting the right one\n");
59   - libusb_device *device = NULL;
60   - getFirstDeviceFromID(context, VID, PID, &device);
61   - //code
62   - if(device==NULL){
63   - printf("Error : cannot find the device !\n");
64   - return 1;
65   - }
66   -
67   - //take the handle
68   - libusb_device_handle *device_handle = NULL;
69   - if(libusb_open(device, &device_handle) != 0){
70   - printf("Error : cannot handle the device\n");
71   - return 1;
72   - }
73   -
74   - //Take the interfaces
75   - printf("\nSearch for interfaces\n");
76   - struct libusb_interface * int_hidjoy = NULL;
77   - struct libusb_interface * int_leds = NULL;
78   - struct libusb_interface * int_vibrators = NULL;
79   - getOurInterfaces(device, &int_hidjoy, &int_leds, &int_vibrators);
80   -
81   - //Claim interface
82   - printf("\nClaim interfaces ...\n");
83   - printf("-Leds\n");
84   - interfaceclaim(device_handle, int_leds);
85   - printf("-Vibrators\n");
86   - interfaceclaim(device_handle, int_vibrators);
87   -
88   - //récupération des endpoints
89   - printf("\nRécupération endpoints\n");
90   - printf("-Leds");
91   - int endpoint_leds=getOnlyEndpoint(int_leds); /* ID of endpoint (bit 8 is 0) */
92   - printf(" is %d\n", endpoint_leds);
93   - printf("-Vibrators");
94   - int endpoint_vibrators=getOnlyEndpoint(int_vibrators); /* ID of endpoint (bit 8 is 0) */
95   - printf(" is %d\n", endpoint_vibrators);
96   -
97   -
98   - /*LE CODE UTILE*/
99   -while(1){
100   - unsigned char data[2] = {0xff,0xff}; // data to send or to receive
101   - int size=2; // size to send or maximum size to receive
102   - int timeout=1000; // timeout in ms
103   -
104   - //OUT interrupt, from host to device
105   - int bytes_out;
106   - printf("%p %02X\n",device_handle,endpoint_leds);
107   - int status=libusb_interrupt_transfer(device_handle,endpoint_leds,data,size,&bytes_out,timeout);
108   - if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); }
109   -}
110   - /*FIN DU CODE UTILE*/
111   -
112   - //Close
113   - printf("\nUnclaim interfaces ...\n");
114   - printf("-Leds\n");
115   - interfaceclose(device_handle, int_leds);
116   - printf("-Vibrators\n");
117   - interfaceclose(device_handle, int_vibrators);
118   -
119   -
120   - printf("Finished\n");
121   - }
122   -
123   -
124   - usbclose(context);
125   -
126   - return 0;
  44 + } else {
  45 + printf("Error, need VID and PID\n");
  46 + }
  47 + } else {
  48 + printf("Wrong command\n");
  49 + }
  50 +
  51 + } else {
  52 + // interactive mode
  53 + printf("Welcome to interactive mode\n");
  54 + printf("Compiled for VID:PID => %d:%d\n", VID, PID);
  55 +
  56 + // Find the device
  57 + printf("Iterate list of devices, and getting the right one\n");
  58 + libusb_device *device = NULL;
  59 + getFirstDeviceFromID(context, VID, PID, &device);
  60 + // code
  61 + if (device == NULL) {
  62 + printf("Error : cannot find the device !\n");
  63 + return 1;
  64 + }
  65 +
  66 + // take the handle
  67 + libusb_device_handle *device_handle = NULL;
  68 + if (libusb_open(device, &device_handle) != 0) {
  69 + printf("Error : cannot handle the device\n");
  70 + return 1;
  71 + }
  72 +
  73 + // Take the interfaces
  74 + printf("\nSearch for interfaces\n");
  75 + struct libusb_interface *int_hidjoy = NULL;
  76 + struct libusb_interface *int_leds = NULL;
  77 + struct libusb_interface *int_vibrators = NULL;
  78 + getOurInterfaces(device, &int_hidjoy, &int_leds, &int_vibrators);
  79 +
  80 + // Claim interface
  81 + printf("\nClaim interfaces ...\n");
  82 + printf("-Leds\n");
  83 + interfaceclaim(device_handle, int_leds);
  84 + printf("-Vibrators\n");
  85 + interfaceclaim(device_handle, int_vibrators);
  86 +
  87 + // récupération des endpoints
  88 + printf("\nRécupération endpoints\n");
  89 + printf("-Leds");
  90 + int endpoint_leds =
  91 + getOnlyEndpoint(int_leds); /* ID of endpoint (bit 8 is 0) */
  92 + printf(" is %d\n", endpoint_leds);
  93 + printf("-Vibrators");
  94 + int endpoint_vibrators =
  95 + getOnlyEndpoint(int_vibrators); /* ID of endpoint (bit 8 is 0) */
  96 + printf(" is %d\n", endpoint_vibrators);
  97 +
  98 + /*LE CODE UTILE*/
  99 + int i;
  100 + for(i = 0 ; i<5 ; i++) {
  101 + unsigned char data[2] = {0xff, 0xff}; // data to send or to receive
  102 + int size = 2; // size to send or maximum size to receive
  103 + int timeout = 1000; // timeout in ms
  104 +
  105 + // OUT interrupt, from host to device
  106 + int bytes_out;
  107 + printf("%p %02X\n", device_handle, endpoint_leds);
  108 + int status = libusb_interrupt_transfer(device_handle, endpoint_leds, data,
  109 + size, &bytes_out, timeout);
  110 + if (status != 0) {
  111 + perror("libusb_interrupt_transfer");
  112 + exit(-1);
  113 + }
  114 +
  115 + //sleep(1); demande l'ajout de macro pour la portabilité
  116 + }
  117 + /*FIN DU CODE UTILE*/
  118 +
  119 + // Close
  120 + printf("\nUnclaim interfaces ...\n");
  121 + printf("-Leds\n");
  122 + interfaceclose(device_handle, int_leds);
  123 + printf("-Vibrators\n");
  124 + interfaceclose(device_handle, int_vibrators);
  125 +
  126 + printf("Finished\n");
  127 + }
  128 +
  129 + usbclose(context);
  130 +
  131 + return 0;
127 132 }
... ...