ca6bb997
rguillom
Ajout Pgm/init.c ...
|
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
|
#include <libusb-1.0/libusb.h>
#include <stdio.h>
#include <stdlib.h>
/* Caractéristiques du périphérique */
#define VENDOR_ID 0x2341
#define PRODUCT_ID 0x0001
#define TAB_PA_SIZE 10
libusb_device_handle *handle=NULL;
libusb_device *device=NULL;
libusb_device *found=NULL; //notre périphérique
libusb_context *context;
/*
struct TABLEAU{
struct EP *tableau[3]; //tableau des points d'accès en interruption
int dernier;
};
struct EP {
uint8_t ep; //adresse d'accès de l'endpoint
unsigned char io; //décrit si c'est une entrée ou une sortie
};
//init structure tableau
struct TABLEAU tab_pa;
void init_tableau(){
for (int i=0;i<3;i++){
tab_pa.tableau[i]=NULL;
}
tab_pa.dernier=0;
}
*/
/*énumération des périphériques USB*/
void enum_periph(){
libusb_device **list;
/* On compte le nombre de périphérique connectés... */
ssize_t count=libusb_get_device_list(context,&list);
if(count<0) {perror("libusb_get_device_list"); exit(-1);}
ssize_t i=0;
/* et on en établit la liste complète */
for(i=0;i<count;i++){
libusb_device *device=list[i]; //enregistre l'appareil i dans la liste list
struct libusb_device_descriptor desc;
int status=libusb_get_device_descriptor(device,&desc); //enregistre le descripteur d'appareil
if(status!=0) continue;
/* On capture et affiche les numéros de bus et d'addresse */
uint8_t bus=libusb_get_bus_number(device);
uint8_t address=libusb_get_device_address(device);
printf("Device Found @ (Bus:Address) %d:%d\n",bus,address);
printf("Vendor ID 0x0%x\n",desc.idVendor);
|
01b3f0af
rguillom
PAD.c modif fonct...
|
58
|
printf("Product ID 0x0%x\n\n",desc.idProduct);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/* Recherche de notre périphérique et sauvegarde dans 'found' */
if(desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID){
found = device;
printf("\nPériphérique trouvé @ (Bus:Adresse) %d:%d\n", bus, address); //test si le "found" reste le meme
break;
}
}
if (found == NULL) printf("Périphérique non trouvé\n");
libusb_free_device_list(list,1);
}
|
3966cf83
rguillom
modifs diverses :...
|
72
|
void config_periph(unsigned char tab_PA[TAB_PA_SIZE]){
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
73
74
75
76
|
/* Récupération de la 1ère configuration du périphérique (indice 0) */
struct libusb_config_descriptor *config_desc=NULL;
int status = libusb_get_config_descriptor(found,0,&config_desc); //config d'indice 0
|
01b3f0af
rguillom
PAD.c modif fonct...
|
77
|
printf("La valeur de la configuration d'indice 0 est %d\n",config_desc->bConfigurationValue);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
int interface;
/* Si le noyau est passé avant nous,
On le détache pour chaque alternative d'interface numéro 0 */
for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){
interface=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
if(libusb_kernel_driver_active(handle,interface)){
int status=libusb_detach_kernel_driver(handle,interface);
if(status!=0){ perror("libusb_detach_kernel_driver"); exit(-1); } //erreur si status!=0
}
//printf("indice intf trouvée %d\n",interface);
}
/* Utilisation de la configuration */
|
3966cf83
rguillom
modifs diverses :...
|
96
97
|
int dernier_PA=-1;
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
98
99
|
int configuration=config_desc->bConfigurationValue;
|
01b3f0af
rguillom
PAD.c modif fonct...
|
100
|
//printf("valeur config %d\n", configuration); // Affichage valeur de la configuration
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
101
102
103
104
105
106
107
108
109
110
111
|
status=libusb_set_configuration(handle,configuration);
if(status!=0){ perror("libusb_set_configuration"); exit(-1); }
/* Appropriation de toutes les interfaces */
int num_intf;
for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){
num_intf = config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
status=libusb_claim_interface(handle,indice_intf);
if(status!=0){ perror("libusb_claim_interface"); exit(-1); }
|
01b3f0af
rguillom
PAD.c modif fonct...
|
112
|
printf("\tInterface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
113
114
115
116
|
/* Parcours des points d'accès (Endpoint) pour chaque interface*/
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
117
|
|
3966cf83
rguillom
modifs diverses :...
|
118
119
|
for(int num_PA=0;num_PA<config_desc->interface[indice_intf].altsetting[0].bNumEndpoints ;num_PA++){
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
120
121
|
int type_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bmAttributes;
uint8_t adresse_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bEndpointAddress;
|
01b3f0af
rguillom
PAD.c modif fonct...
|
122
|
printf("\t\tPoint d'accès trouvé. Adresse : %d\n",adresse_PA);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
123
124
125
|
/* Regarde si le point d'accès est de type interruption.
Si oui, on le sauvegarde. */
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
126
127
128
129
|
if((type_PA & 0b11)==LIBUSB_TRANSFER_TYPE_INTERRUPT){
//struct EP ep1;
dernier_PA++;
tab_PA[dernier_PA] = adresse_PA;
|
01b3f0af
rguillom
PAD.c modif fonct...
|
130
|
printf("\t\tPoint d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
/*
ep1.ep=config_desc->interface[indice_intf].altsetting[0].endpoint->bEndpointAddress;
if (indice_intf==0){
tab_pa.tableau[indice_intf]->ep=ep1.ep;
tab_pa.tableau[indice_intf]->io=1;
tab_pa.dernier++;
}
else{
tab_pa.tableau[indice_intf]->ep=ep1.ep;
tab_pa.tableau[indice_intf]->io=0;
tab_pa.dernier++;
if (num_ep >2)break; //entrée => io=0
// Le if et else ci-dessus doivent pouvoir être simplifiés.
*/
}
|
3966cf83
rguillom
modifs diverses :...
|
148
149
|
}
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
150
|
}
|
3966cf83
rguillom
modifs diverses :...
|
151
|
//printf("dernier indice tab_PA : %d\n", dernier_PA);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
}
/* Libération des interfaces de la configuration active */
void liberer_interfaces(){
/* Récupération de la configuration active */
struct libusb_config_descriptor* config_desc;
int status =libusb_get_active_config_descriptor(found,&config_desc);
if(status!=0){perror("libusb_get_active_config_descriptor");exit(-1);}
/* On parcourt toutes les interfaces*/
int num_intf;
for(int indice_intf=0;indice_intf < config_desc->bNumInterfaces ;indice_intf++){
num_intf=config_desc->interface[indice_intf].altsetting[0].bInterfaceNumber;
/* Libération de l'interface num_intf*/
status=libusb_release_interface(handle,num_intf);
if(status!=0){ perror("libusb_release_interface"); exit(-1); }
|
01b3f0af
rguillom
PAD.c modif fonct...
|
173
|
printf("\tL'interface numéro %d, d'indice %d a été libérée.\n", num_intf,indice_intf);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
174
175
176
177
178
179
180
181
|
}
}
/* Envoie un caractère (de commande de LED) sur le port USB */
void send_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char data){
unsigned char PA = tab_PA[0]; //LEDs sur le premier point d'accès
|
3966cf83
rguillom
modifs diverses :...
|
182
|
printf("adresse PA %d\n", tab_PA[0]);
|
01b3f0af
rguillom
PAD.c modif fonct...
|
183
|
int transferred = 1; //nombre d'octets transférés
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
184
|
unsigned int timeout = 1000; //temps avant un timeout
|
01b3f0af
rguillom
PAD.c modif fonct...
|
185
|
int status = libusb_interrupt_transfer(handle, PA, &data, sizeof(data), &transferred, timeout);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
186
187
188
189
190
191
192
193
194
|
if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
}
/* Lis le contenu des points d'accès de l'interface IN (boutons et joystick) */
void receive_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char *boutons, unsigned char *joystick_x, unsigned char *joystick_y){
/* Lecture du point d'accès des boutons */
unsigned char PA = tab_PA[1]; //LEDs sur le premier point d'accès
|
3966cf83
rguillom
modifs diverses :...
|
195
|
printf("adresse PA %d\n", tab_PA[1]);
|
01b3f0af
rguillom
PAD.c modif fonct...
|
196
|
int transferred = 1; //nombre d'octets transférés
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
197
198
|
unsigned int timeout = 1000; //temps avant un timeout
|
01b3f0af
rguillom
PAD.c modif fonct...
|
199
|
int status = libusb_interrupt_transfer(handle, PA, boutons, sizeof(boutons), &transferred, timeout);
|
3966cf83
rguillom
modifs diverses :...
|
200
|
if(status!=0){perror("libusb_interrupt_transfer");printf("erreur lecture boutons, adresse PA %d\n",tab_PA[1]);exit(-1);}
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
201
202
|
/* Lecture du point d'accès du joystick */
|
01b3f0af
rguillom
PAD.c modif fonct...
|
203
|
unsigned char *joystick_xy=NULL; //stocke la donnée du point d'accès (1 octet pour chaque axe)
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
204
205
|
PA = tab_PA[2]; //LEDs sur le premier point d'accès
|
3966cf83
rguillom
modifs diverses :...
|
206
|
printf("adresse PA %d\n", tab_PA[2]);
|
01b3f0af
rguillom
PAD.c modif fonct...
|
207
|
transferred = 2; //nombre d'octets transférés
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
208
209
|
timeout = 1000; //temps avant un timeout
|
01b3f0af
rguillom
PAD.c modif fonct...
|
210
|
status = libusb_interrupt_transfer(handle, PA, joystick_xy, sizeof(joystick_xy), &transferred, timeout);
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
211
212
213
|
if(status!=0){perror("libusb_interrupt_transfer");exit(-1);}
//TODO Pas sûr !!!
|
01b3f0af
rguillom
PAD.c modif fonct...
|
214
215
216
217
|
if (joystick_xy !=NULL){
*joystick_x = joystick_xy[0]; //On sépare la data de chaque axe
*joystick_y = joystick_xy[1];
}
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
}
int main(){
//init_tableau(); // initialisation tableau point d'accès endpoint
/* Initialisation de la bibliothèque libusb-1.0 */
int status=libusb_init(&context);
if(status!=0) {perror("libusb_init"); exit(-1);}
//fin inititialisation
/* Enumération des périphériques USB */
enum_periph();
/* Ouverture de notre périphérique 'found' */
int status_ouv=libusb_open(found,&handle);
if(status_ouv!=0){ perror("libusb_open"); exit(-1); }
/* Configuration du périphérique et sauvegarde des points d'accès */
|
3966cf83
rguillom
modifs diverses :...
|
239
|
unsigned char tab_PA[TAB_PA_SIZE];
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
240
241
|
config_periph(tab_PA);
|
3966cf83
rguillom
modifs diverses :...
|
242
243
244
|
unsigned char *boutons = NULL, *boutons_anc = NULL;
unsigned char *joystick_x = NULL, *joystick_x_anc = NULL;
unsigned char *joystick_y = NULL, *joystick_y_anc = NULL;
|
01b3f0af
rguillom
PAD.c modif fonct...
|
245
|
unsigned char caractere;
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
246
|
|
3966cf83
rguillom
modifs diverses :...
|
247
248
249
250
251
252
|
//TODO boucle while(pas d'arrêt), envoi et rcpt
//TODO "pas d'arrêt" = appui sur 's' par exemple
while(1){
/*if (appui sur une touche){
|
01b3f0af
rguillom
PAD.c modif fonct...
|
253
254
255
256
|
//récupération caractère
send_data(tab_PA, caractere); //Envoi de la commande des leds
}
else {
|
3966cf83
rguillom
modifs diverses :...
|
257
258
|
*/
printf("début rcpt\n");
|
01b3f0af
rguillom
PAD.c modif fonct...
|
259
|
receive_data(tab_PA, boutons, joystick_x, joystick_y); //Réception des boutons et joystick
|
3966cf83
rguillom
modifs diverses :...
|
260
261
|
printf("fin rcpt\n");
if ((boutons == NULL) || (joystick_x == NULL) || (joystick_y == NULL)) printf("Erreur réception : pointeurs boutons ou joystick nul\n");
|
01b3f0af
rguillom
PAD.c modif fonct...
|
262
263
264
265
266
|
if ((*boutons != *boutons_anc) || (joystick_x != joystick_x_anc) || (joystick_y != joystick_y_anc)) printf("Boutons : %c, Joystick_x : %c, Joystick_y :%c\n", *boutons, *joystick_x, *joystick_y); //Affichage si changement
*boutons_anc = *boutons;
*joystick_x_anc = *joystick_x;
*joystick_y_anc = *joystick_y;
|
3966cf83
rguillom
modifs diverses :...
|
267
|
//}
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
268
|
|
3966cf83
rguillom
modifs diverses :...
|
269
270
|
}
//*/
|
ca6bb997
rguillom
Ajout Pgm/init.c ...
|
271
272
273
274
275
276
277
278
279
280
281
282
283
|
/* Libération des interfaces*/
liberer_interfaces();
/* Fermeture du périphérique */
libusb_close(handle);
libusb_exit(context); //fermeture de la bibliothèque
return 0;
}
|