bcd81fea
dmohamed
UPDATE-AJout des ...
|
1
2
3
4
5
6
7
8
9
|
#include <libusb-1.0/libusb.h> //bibliothèque USB
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#include <strings.h>
#include <unistd.h>
|
28da8e7b
dmohamed
UPDATE
|
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#define LED_ON 0x21
#define LED_OFF 0x22
#define MOVE_RIGHT 0x04
#define MOVE_LEFT 0x08
#define MOVE_STOP 0x10
#define ACM_CTRL_DTR 0x01
#define ACM_CTRL_RTS 0x02
static int ep_in_addr = 0x83;
static int ep_out_addr = 0x04;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
23
24
25
|
libusb_device **list;
libusb_device_handle *handle = NULL;
libusb_device *device;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
26
27
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
28
29
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
30
31
32
33
34
35
36
37
38
|
void configuration_periph(libusb_device *device) //Configuration de la tourelle
{
//Ouverture du pepherique
int status=libusb_open(device,&handle);
if(status!=0)
{
perror("libusb_open"); exit(-1);
}
|
28da8e7b
dmohamed
UPDATE
|
39
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//Recuperation de la configuration d'indice 0 du périphérique
struct libusb_config_descriptor *config;
status=libusb_get_active_config_descriptor(device,&config);
if(status!=0)
{
perror("libusb_get_active_config_descriptor"); exit(-1);
}
//Interfaces
int i;
int interface;
|
28da8e7b
dmohamed
UPDATE
|
53
|
//On détache le noyau de notre périphérique
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
54
55
|
for(i=0;i<(config->bNumInterfaces);i++)
{
|
28da8e7b
dmohamed
UPDATE
|
56
|
interface=config->interface[i].altsetting[0].bInterfaceNumber;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
57
|
if(libusb_kernel_driver_active(handle,interface))
|
28da8e7b
dmohamed
UPDATE
|
58
59
60
61
62
63
64
|
{
status=libusb_detach_kernel_driver(handle,interface);
if(status!=0)
{
perror("libusb_detach_kernel_driver"); exit(-1);
}
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
65
66
|
}
|
28da8e7b
dmohamed
UPDATE
|
67
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
68
69
|
//Utilisation d'une configuration du périphérique
int configuration=config->bConfigurationValue;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
70
|
|
28da8e7b
dmohamed
UPDATE
|
71
|
status=libusb_set_configuration(handle,configuration);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
72
73
74
75
|
if(status!=0)
{
perror("libusb_set_configuration"); exit(-1);
}
|
28da8e7b
dmohamed
UPDATE
|
76
77
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
78
79
80
81
82
83
84
|
//Claim interfaces
for(i=0;i<(config->bNumInterfaces);i++)
{
interface=config->interface[i].altsetting[0].bInterfaceNumber;
printf("Numero d'interface : %d\n", interface);
status=libusb_claim_interface(handle,interface);
if(status!=0)
|
28da8e7b
dmohamed
UPDATE
|
85
86
87
88
|
{
perror("libusb_claim_interface"); exit(-1);
}
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
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
|
}
void fermeture(libusb_device_handle *handle) //Fermeture du périphérique
{
int i, interface, status;
libusb_device *device = libusb_get_device(handle);
struct libusb_config_descriptor *config;
status = libusb_get_active_config_descriptor(device, &config);
if(status != 0)
{
perror("libusb_get_active_config_descriptor");exit(-1);
}
for(i=0;i<(config->bNumInterfaces);i++)
{
interface=config->interface[i].altsetting[0].bInterfaceNumber;
status=libusb_release_interface(handle,interface); //On libère l'interface
if(status!=0)
{
perror("libusb_release_interface");
exit(-1);
}
printf("Interface liberee : %d\n",interface);
}
libusb_close(handle);
}
void enumeration(libusb_context *context) //Enumération des périphériques USB
{
int t=0;
libusb_device **list;
ssize_t count=libusb_get_device_list(context,&list);
if(count<0)
{
perror("libusb_get_device_list"); exit(-1);
}
|
28da8e7b
dmohamed
UPDATE
|
128
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
129
130
131
132
133
134
135
136
137
|
ssize_t i=0;
for(i=0;i<count;i++)
{
libusb_device *device=list[i];
struct libusb_device_descriptor desc;
int status=libusb_get_device_descriptor(device,&desc);
if(status!=0) continue;
uint8_t bus=libusb_get_bus_number(device);
uint8_t address=libusb_get_device_address(device);
|
28da8e7b
dmohamed
UPDATE
|
138
139
140
|
//Lorsque l'on retrouves notre périphérique nous passons à la configuration.
if ((desc.idVendor==0x0010) && (desc.idProduct==0x1010))
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
141
|
{
|
28da8e7b
dmohamed
UPDATE
|
142
|
printf("périphérique trouvée !\n");
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
143
144
145
146
|
t=1;
configuration_periph(device);
}
}
|
28da8e7b
dmohamed
UPDATE
|
147
|
if(t==0) printf("périphérique non connectée !\n");
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
148
|
}
|
28da8e7b
dmohamed
UPDATE
|
149
150
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
151
152
|
|
28da8e7b
dmohamed
UPDATE
|
153
|
void envoie(unsigned char c)
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
154
|
{
|
28da8e7b
dmohamed
UPDATE
|
155
156
157
158
159
160
161
162
|
/* To send a char to the device simply initiate a bulk_transfer to the
* Endpoint with address ep_out_addr.
*/
int actual_length;
if (libusb_bulk_transfer(handle, ep_out_addr, &c, 1,
&actual_length, 0) < 0) {
fprintf(stderr, "Error while sending char\n");
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
163
164
|
}
|
28da8e7b
dmohamed
UPDATE
|
165
|
int reception(unsigned char * data, int size)
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
166
|
{
|
28da8e7b
dmohamed
UPDATE
|
167
168
169
170
171
172
173
174
175
176
177
178
|
/* To receive characters from the device initiate a bulk_transfer to the
* Endpoint with address ep_in_addr.
*/
int actual_length;
int status = libusb_bulk_transfer(handle, ep_in_addr, data, size, &actual_length,
1000);
if (status == LIBUSB_ERROR_TIMEOUT) {
printf("timeout (%d)\n", actual_length);
return -1;
} else if (status < 0) {
fprintf(stderr, "Error while waiting for char\n");
return -1;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
179
180
|
}
|
28da8e7b
dmohamed
UPDATE
|
181
|
return actual_length;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
182
|
}
|
28da8e7b
dmohamed
UPDATE
|
183
184
185
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
186
187
188
189
|
int main()
{
//Initialisation de la bibliotheque libusb
libusb_context *context;
|
28da8e7b
dmohamed
UPDATE
|
190
191
|
unsigned char * buf;
int len;
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
192
193
194
195
196
197
198
|
int status=libusb_init(&context);
if(status!=0)
{
perror("libusb_init"); exit(-1);
}
|
28da8e7b
dmohamed
UPDATE
|
199
200
|
//Enumération des périphériques USB. Si le périphérique est trouvé, cette fonction fait appel à la fonction configuration_perip.
enumeration(context);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
201
|
|
28da8e7b
dmohamed
UPDATE
|
202
203
204
205
206
207
208
|
//configuration du périphérique
status = libusb_control_transfer(handle, 0x21, 0x22, ACM_CTRL_DTR | ACM_CTRL_RTS,
0, NULL, 0, 0);
if (status < 0) {
fprintf(stderr, "Error during control transfer: %s\n",
libusb_error_name(status));
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
209
210
|
|
28da8e7b
dmohamed
UPDATE
|
211
212
213
214
215
216
217
218
219
220
221
|
/* - set line encoding: here 9600 8N1
* 9600 = 0x2580 ~> 0x80, 0x25 in little endian
*/
//Configuration du port série.
unsigned char encoding[] = { 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08 };
status = libusb_control_transfer(handle, 0x21, 0x20, 0, 0, encoding,
sizeof(encoding), 0);
if (status < 0) {
fprintf(stderr, "Error during control transfer: %s\n",
libusb_error_name(status));
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
222
|
|
28da8e7b
dmohamed
UPDATE
|
223
|
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
224
|
|
28da8e7b
dmohamed
UPDATE
|
225
226
227
|
//Menu de commande
char action;
for(;;)
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
228
|
{
|
28da8e7b
dmohamed
UPDATE
|
229
230
231
232
233
|
printf("s=fermer / d=allumer led / g=eteindre led / h=moteur gauche / b=moteur droit / t=moteur éteint \n");
scanf("%c",&action);
switch (action)
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
234
235
236
|
{
case 's':
fermeture(handle);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
237
238
239
240
241
|
libusb_free_device_list(list,1);
libusb_exit(context);
return 0;
break;
case 'd':
|
28da8e7b
dmohamed
UPDATE
|
242
|
envoie(LED_ON);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
243
|
sleep(1);
|
28da8e7b
dmohamed
UPDATE
|
244
245
|
//len = read_chars(buf, 1);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
246
247
|
break;
case 'g':
|
28da8e7b
dmohamed
UPDATE
|
248
|
envoie(LED_OFF);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
249
|
sleep(1);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
250
251
|
break;
case 'h':
|
28da8e7b
dmohamed
UPDATE
|
252
253
|
envoie(MOVE_LEFT);
sleep(1);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
254
255
|
break;
case 'b':
|
28da8e7b
dmohamed
UPDATE
|
256
257
|
envoie(MOVE_RIGHT);
sleep(1);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
258
259
|
break;
case 't' :
|
28da8e7b
dmohamed
UPDATE
|
260
261
|
envoie(MOVE_STOP);
sleep(1);
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
262
263
264
265
266
267
268
|
break;
default :
printf("Commande invalide ! Retaper :\n");
break;
}
}
|
bcd81fea
dmohamed
UPDATE-AJout des ...
|
269
270
271
|
return 0;
}
|