Commit 01b3f0af826369ec8732e353e824a0da70dc76c8
1 parent
ca6bb997
PAD.c modif fonctions Send_EP_IN_Report + Receive_EP_OUT_Report + ajout Reception_Serie et PAD_Task
Débugage (non terminé) Quelques fix supplémentaires
Showing
6 changed files
with
197 additions
and
132 deletions
Show diff stats
Pgm PC/init_USB.c
... | ... | @@ -55,7 +55,7 @@ void enum_periph(){ |
55 | 55 | uint8_t address=libusb_get_device_address(device); |
56 | 56 | printf("Device Found @ (Bus:Address) %d:%d\n",bus,address); |
57 | 57 | printf("Vendor ID 0x0%x\n",desc.idVendor); |
58 | - printf("Product ID 0x0%x\n",desc.idProduct); | |
58 | + printf("Product ID 0x0%x\n\n",desc.idProduct); | |
59 | 59 | |
60 | 60 | /* Recherche de notre périphérique et sauvegarde dans 'found' */ |
61 | 61 | if(desc.idVendor == VENDOR_ID && desc.idProduct == PRODUCT_ID){ |
... | ... | @@ -74,7 +74,7 @@ void config_periph(char tab_PA[TAB_PA_SIZE]){ |
74 | 74 | /* Récupération de la 1ère configuration du périphérique (indice 0) */ |
75 | 75 | struct libusb_config_descriptor *config_desc=NULL; |
76 | 76 | int status = libusb_get_config_descriptor(found,0,&config_desc); //config d'indice 0 |
77 | - printf("ID de la configuration d'indice 0 : %d\n",config_desc->bConfigurationValue); | |
77 | + printf("La valeur de la configuration d'indice 0 est %d\n",config_desc->bConfigurationValue); | |
78 | 78 | |
79 | 79 | int interface; |
80 | 80 | |
... | ... | @@ -95,7 +95,7 @@ void config_periph(char tab_PA[TAB_PA_SIZE]){ |
95 | 95 | /* Utilisation de la configuration */ |
96 | 96 | int configuration=config_desc->bConfigurationValue; |
97 | 97 | |
98 | - printf("valeur config %d\n", configuration); // Affichage valeur de la configuration | |
98 | + //printf("valeur config %d\n", configuration); // Affichage valeur de la configuration | |
99 | 99 | status=libusb_set_configuration(handle,configuration); |
100 | 100 | if(status!=0){ perror("libusb_set_configuration"); exit(-1); } |
101 | 101 | |
... | ... | @@ -107,7 +107,7 @@ void config_periph(char tab_PA[TAB_PA_SIZE]){ |
107 | 107 | |
108 | 108 | status=libusb_claim_interface(handle,indice_intf); |
109 | 109 | if(status!=0){ perror("libusb_claim_interface"); exit(-1); } |
110 | - printf("Interface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf); | |
110 | + printf("\tInterface d'indice %d et de numéro %d réclamée\n",indice_intf,num_intf); | |
111 | 111 | |
112 | 112 | |
113 | 113 | |
... | ... | @@ -116,7 +116,7 @@ void config_periph(char tab_PA[TAB_PA_SIZE]){ |
116 | 116 | |
117 | 117 | int type_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bmAttributes; |
118 | 118 | uint8_t adresse_PA = config_desc->interface[indice_intf].altsetting[0].endpoint[num_PA].bEndpointAddress; |
119 | - printf("Point d'accès trouvé. Adresse :%d\n",adresse_PA); | |
119 | + printf("\t\tPoint d'accès trouvé. Adresse : %d\n",adresse_PA); | |
120 | 120 | |
121 | 121 | /* Regarde si le point d'accès est de type interruption. |
122 | 122 | Si oui, on le sauvegarde. */ |
... | ... | @@ -125,7 +125,7 @@ void config_periph(char tab_PA[TAB_PA_SIZE]){ |
125 | 125 | //struct EP ep1; |
126 | 126 | dernier_PA++; |
127 | 127 | tab_PA[dernier_PA] = adresse_PA; |
128 | - printf("Point d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA); | |
128 | + printf("\t\tPoint d'accès numéro %d sauvegardé. Adresse : %d\n", dernier_PA, adresse_PA); | |
129 | 129 | |
130 | 130 | /* |
131 | 131 | ep1.ep=config_desc->interface[indice_intf].altsetting[0].endpoint->bEndpointAddress; |
... | ... | @@ -166,7 +166,7 @@ void liberer_interfaces(){ |
166 | 166 | status=libusb_release_interface(handle,num_intf); |
167 | 167 | if(status!=0){ perror("libusb_release_interface"); exit(-1); } |
168 | 168 | |
169 | - printf("L'interface numéro %d , d'indice %d a été libérée.\n", num_intf,indice_intf); | |
169 | + printf("\tL'interface numéro %d, d'indice %d a été libérée.\n", num_intf,indice_intf); | |
170 | 170 | } |
171 | 171 | } |
172 | 172 | |
... | ... | @@ -175,9 +175,9 @@ void liberer_interfaces(){ |
175 | 175 | void send_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char data){ |
176 | 176 | |
177 | 177 | unsigned char PA = tab_PA[0]; //LEDs sur le premier point d'accès |
178 | - int *transferred = 1; //nombre d'octets transférés | |
178 | + int transferred = 1; //nombre d'octets transférés | |
179 | 179 | unsigned int timeout = 1000; //temps avant un timeout |
180 | - int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &data, sizeof(data), &transferred, timeout) | |
180 | + int status = libusb_interrupt_transfer(handle, PA, &data, sizeof(data), &transferred, timeout); | |
181 | 181 | if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} |
182 | 182 | } |
183 | 183 | |
... | ... | @@ -187,25 +187,27 @@ void receive_data(unsigned char tab_PA[TAB_PA_SIZE], unsigned char *boutons, uns |
187 | 187 | |
188 | 188 | /* Lecture du point d'accès des boutons */ |
189 | 189 | unsigned char PA = tab_PA[1]; //LEDs sur le premier point d'accès |
190 | - int *transferred = 1; //nombre d'octets transférés | |
190 | + int transferred = 1; //nombre d'octets transférés | |
191 | 191 | unsigned int timeout = 1000; //temps avant un timeout |
192 | 192 | |
193 | - int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &boutons, sizeof(boutons), &transferred, timeout) | |
193 | + int status = libusb_interrupt_transfer(handle, PA, boutons, sizeof(boutons), &transferred, timeout); | |
194 | 194 | if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} |
195 | 195 | |
196 | 196 | /* Lecture du point d'accès du joystick */ |
197 | - unsigned char *joystick_xy; //stocke la donnée du point d'accès (1 octet pour chaque axe) | |
197 | + unsigned char *joystick_xy=NULL; //stocke la donnée du point d'accès (1 octet pour chaque axe) | |
198 | 198 | |
199 | 199 | PA = tab_PA[2]; //LEDs sur le premier point d'accès |
200 | - *transferred = 2; //nombre d'octets transférés | |
200 | + transferred = 2; //nombre d'octets transférés | |
201 | 201 | timeout = 1000; //temps avant un timeout |
202 | 202 | |
203 | - int status = libusb_interrupt_transfer(struct libusb_device_handle *handle, PA, &joystick_xy, sizeof(joystick_xy), &transferred, timeout) | |
203 | + status = libusb_interrupt_transfer(handle, PA, joystick_xy, sizeof(joystick_xy), &transferred, timeout); | |
204 | 204 | if(status!=0){perror("libusb_interrupt_transfer");exit(-1);} |
205 | 205 | |
206 | 206 | //TODO Pas sûr !!! |
207 | - *joystick_x = joystick_xy[0]; //On sépare la data de chaque axe | |
208 | - *joystick_y = joystick_xy[1]; | |
207 | + if (joystick_xy !=NULL){ | |
208 | + *joystick_x = joystick_xy[0]; //On sépare la data de chaque axe | |
209 | + *joystick_y = joystick_xy[1]; | |
210 | + } | |
209 | 211 | } |
210 | 212 | |
211 | 213 | |
... | ... | @@ -230,13 +232,30 @@ int main(){ |
230 | 232 | char tab_PA[TAB_PA_SIZE]; |
231 | 233 | config_periph(tab_PA); |
232 | 234 | |
233 | - unsigned char *boutons; | |
234 | - unsigned char *joystick_x; | |
235 | - unsigned char *joystick_x; | |
235 | + unsigned char *boutons, *boutons_anc = NULL; | |
236 | + unsigned char *joystick_x, *joystick_x_anc = NULL; | |
237 | + unsigned char *joystick_y, *joystick_y_anc = NULL; | |
238 | + unsigned char caractere; | |
236 | 239 | |
240 | + /* | |
237 | 241 | //boucle while(pas d'arrêt), envoi et rcpt |
238 | 242 | // "pas d'arrêt" = appui sur 's' par exemple |
243 | + | |
244 | + if (appui sur une touche){ | |
245 | + //récupération caractère | |
246 | + send_data(tab_PA, caractere); //Envoi de la commande des leds | |
247 | + } | |
248 | + else { | |
249 | + receive_data(tab_PA, boutons, joystick_x, joystick_y); //Réception des boutons et joystick | |
250 | + 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 | |
251 | + | |
252 | + *boutons_anc = *boutons; | |
253 | + *joystick_x_anc = *joystick_x; | |
254 | + *joystick_y_anc = *joystick_y; | |
255 | + } | |
256 | + | |
239 | 257 | |
258 | + */ | |
240 | 259 | |
241 | 260 | /* Libération des interfaces*/ |
242 | 261 | liberer_interfaces(); | ... | ... |
lufa-master/PolytechLille/PAD/Descriptors.c
... | ... | @@ -38,6 +38,9 @@ |
38 | 38 | |
39 | 39 | #include "Descriptors.h" |
40 | 40 | |
41 | +#define VENDOR_ID 0x2341 | |
42 | +#define PRODUCT_ID 0x0001 | |
43 | + | |
41 | 44 | /** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall |
42 | 45 | * device characteristics, including the supported USB version, control endpoint size and the |
43 | 46 | * number of device configurations. The descriptor is read out by the USB host when the enumeration |
... | ... | @@ -54,8 +57,8 @@ const USB_Descriptor_Device_t PROGMEM RelayBoard_DeviceDescriptor = |
54 | 57 | |
55 | 58 | .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, |
56 | 59 | |
57 | - .VendorID = 0x04B4, //A MODIFIER avec VendorID Carte | |
58 | - .ProductID = 0xFD11, //A MODIFIER | |
60 | + .VendorID = VENDOR_ID, | |
61 | + .ProductID = PRODUCT_ID, | |
59 | 62 | .ReleaseNumber = VERSION_BCD(2,0,0), |
60 | 63 | |
61 | 64 | .ManufacturerStrIndex = STRING_ID_Manufacturer, |
... | ... | @@ -88,12 +91,12 @@ const USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor |
88 | 91 | }, |
89 | 92 | |
90 | 93 | /* Description Interface SORTIE (LED)*/ |
91 | - .InferfaceOUT = | |
94 | + .InterfaceOUT = | |
92 | 95 | { |
93 | 96 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
94 | 97 | |
95 | 98 | .InterfaceNumber = INTERFACE_ID_InterfaceOUT, |
96 | - .AlternateSetting = 0, | |
99 | + .AlternateSetting = 0x00, | |
97 | 100 | |
98 | 101 | .TotalEndpoints = 1, |
99 | 102 | |
... | ... | @@ -104,19 +107,6 @@ const USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor |
104 | 107 | .InterfaceStrIndex = NO_DESCRIPTOR |
105 | 108 | }, |
106 | 109 | |
107 | - /* | |
108 | - .HID_KeyboardHID = | |
109 | - { | |
110 | - .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |
111 | - | |
112 | - .HIDSpec = VERSION_BCD(1,1,1), | |
113 | - .CountryCode = 0x00, | |
114 | - .TotalReportDescriptors = 1, | |
115 | - .HIDReportType = HID_DTYPE_Report, | |
116 | - .HIDReportLength = sizeof(KeyboardReport) | |
117 | - }, | |
118 | - */ | |
119 | - | |
120 | 110 | .ReportOUTEndpoint = |
121 | 111 | { |
122 | 112 | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, |
... | ... | @@ -133,7 +123,7 @@ const USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor |
133 | 123 | { |
134 | 124 | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, |
135 | 125 | |
136 | - .InterfaceNumber = INTERFACE_ID_InterfaceIN | |
126 | + .InterfaceNumber = INTERFACE_ID_InterfaceIN, | |
137 | 127 | .AlternateSetting = 0x00, |
138 | 128 | |
139 | 129 | .TotalEndpoints = 2, |
... | ... | @@ -163,7 +153,7 @@ const USB_Descriptor_Configuration_t PROGMEM RelayBoard_ConfigurationDescriptor |
163 | 153 | .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), |
164 | 154 | .EndpointSize = JOYSTICK_EPSIZE, |
165 | 155 | .PollingIntervalMS = 0x05 |
166 | - } | |
156 | + }, | |
167 | 157 | }; |
168 | 158 | |
169 | 159 | /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ... | ... |
lufa-master/PolytechLille/PAD/Descriptors.h
... | ... | @@ -52,7 +52,6 @@ |
52 | 52 | |
53 | 53 | // Relay Board Interface |
54 | 54 | USB_Descriptor_Interface_t InterfaceOUT; |
55 | - //USB_HID_Descriptor_HID_t HID_KeyboardHID; //UTILE ? | |
56 | 55 | USB_Descriptor_Endpoint_t ReportOUTEndpoint; |
57 | 56 | |
58 | 57 | USB_Descriptor_Interface_t InterfaceIN; |
... | ... | @@ -84,15 +83,17 @@ |
84 | 83 | |
85 | 84 | /* Macros: */ |
86 | 85 | |
87 | - | |
86 | + /** Endpoint address of the Keyboard HID reporting OUT endpoint. */ | |
87 | + #define KEYBOARD_OUT_EPADDR (ENDPOINT_DIR_OUT | 1) | |
88 | + | |
89 | + | |
88 | 90 | /** Endpoint address of the Keyboard HID reporting IN endpoint. */ |
89 | - #define KEYBOARD_IN_Bout_EPADDR (ENDPOINT_DIR_IN | 1) //Adr. EP Boutons | |
90 | - #define KEYBOARD_IN_Joy_EPADDR (ENDPOINT_DIR_IN | 1) //Adr. EP Joystick | |
91 | + #define KEYBOARD_IN_Bout_EPADDR (ENDPOINT_DIR_IN | 2) //Adr. EP Boutons (direction | numéro du point d'accès) | |
92 | + #define KEYBOARD_IN_Joy_EPADDR (ENDPOINT_DIR_IN | 3) //Adr. EP Joystick | |
91 | 93 | |
92 | - /** Endpoint address of the Keyboard HID reporting OUT endpoint. */ | |
93 | - #define KEYBOARD_OUT_EPADDR (ENDPOINT_DIR_OUT | 2) | |
94 | 94 | |
95 | - /** Size in bytes of the Keyboard HID reporting IN and OUT endpoints. */ | |
95 | + | |
96 | + /** Size in bytes of the PAD HID reporting IN and OUT endpoints. */ | |
96 | 97 | #define LED_EPSIZE 1 |
97 | 98 | #define BOUTONS_EPSIZE 1 |
98 | 99 | #define JOYSTICK_EPSIZE 2 | ... | ... |
lufa-master/PolytechLille/PAD/PAD.c
... | ... | @@ -38,6 +38,13 @@ |
38 | 38 | #include "PAD.h" |
39 | 39 | |
40 | 40 | |
41 | +#define debut_rcpt 0xff //valeur arbitraire pour détecter un début de trame | |
42 | + | |
43 | +uint8_t boutons; | |
44 | +uint8_t joystick_x; | |
45 | +uint8_t joystick_y; | |
46 | + | |
47 | + | |
41 | 48 | /** Main program entry point. This routine contains the overall program flow, including initial |
42 | 49 | * setup of all components and the main program loop. |
43 | 50 | */ |
... | ... | @@ -58,23 +65,23 @@ int main(void) |
58 | 65 | /** Configures the board hardware and chip peripherals for the project's functionality. */ |
59 | 66 | void SetupHardware(void) |
60 | 67 | { |
61 | -#if (ARCH == ARCH_AVR8) | |
68 | + #if (ARCH == ARCH_AVR8) | |
62 | 69 | /* Disable watchdog if enabled by bootloader/fuses */ |
63 | 70 | MCUSR &= ~(1 << WDRF); |
64 | 71 | wdt_disable(); |
65 | 72 | |
66 | 73 | /* Disable clock division */ |
67 | 74 | clock_prescale_set(clock_div_1); |
68 | - | |
75 | + #endif | |
69 | 76 | |
70 | -/**INITIALISATIONS*/ | |
77 | + /**INITIALISATIONS*/ | |
71 | 78 | /* Hardware Initialization */ |
72 | 79 | USB_Init(); |
73 | - Serial_init(9600,0); //9600 Bauds, configuration | |
80 | + Serial_Init(9600,0); //9600 Bauds, configuration | |
74 | 81 | |
75 | 82 | /* Initialize Relays */ |
76 | - DDRD |= ALL_RELAYS; // Port pour la liaison série | |
77 | - PORTD &= ~ALL_RELAYS; | |
83 | + //DDRD |= ALL_RELAYS; // Port pour la liaison série | |
84 | + //PORTD &= ~ALL_RELAYS; | |
78 | 85 | } |
79 | 86 | |
80 | 87 | |
... | ... | @@ -85,10 +92,11 @@ void EVENT_USB_Device_ConfigurationChanged(void) |
85 | 92 | { |
86 | 93 | bool ConfigSuccess = true; |
87 | 94 | |
88 | - /* Setup HID Report Endpoints */ //MODIFS ICI | |
89 | - ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_Bout_EPADDR, EP_TYPE_INTERRUPT, BOUTONS_EPSIZE, 1); | |
95 | + /* Setup HID Report Endpoints */ | |
96 | + ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_OUT_EPADDR, EP_TYPE_INTERRUPT, LED_EPSIZE, 1); | |
97 | + ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_Bout_EPADDR, EP_TYPE_INTERRUPT, BOUTONS_EPSIZE, 1); | |
90 | 98 | ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_Joy_EPADDR, EP_TYPE_INTERRUPT, JOYSTICK_EPSIZE, 1); |
91 | - ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_OUT_EPADDR, EP_TYPE_INTERRUPT, KEYBOARD_EPSIZE, 1); | |
99 | + | |
92 | 100 | |
93 | 101 | /* Turn on Start-of-Frame events for tracking HID report period expiry */ |
94 | 102 | USB_Device_EnableSOFEvents(); |
... | ... | @@ -98,70 +106,77 @@ void EVENT_USB_Device_ConfigurationChanged(void) |
98 | 106 | } |
99 | 107 | |
100 | 108 | |
101 | -/** Sends the next HID report to the host, via the keyboard data endpoint. */ | |
102 | -void SendNextReport(void) //Envoi liaison Série | |
109 | + | |
110 | +/** Sends the next PAD report to the host, via the buttons and joystick endpoint. */ | |
111 | +void Send_EP_IN_Report(void) | |
103 | 112 | { |
104 | - static USB_KeyboardReport_Data_t PrevKeyboardReportData; | |
105 | - USB_KeyboardReport_Data_t KeyboardReportData; | |
106 | - bool SendReport = false; | |
113 | + //static USB_KeyboardReport_Data_t PrevKeyboardReportData; | |
114 | + //USB_KeyboardReport_Data_t KeyboardReportData; | |
115 | + //bool SendReport = false; | |
107 | 116 | |
108 | 117 | /* Create the next keyboard report for transmission to the host */ |
109 | - CreateKeyboardReport(&KeyboardReportData); | |
118 | + //CreateKeyboardReport(&KeyboardReportData); | |
110 | 119 | |
111 | 120 | /* Check if the idle period is set and has elapsed */ |
112 | - if (IdleCount && (!(IdleMSRemaining))) | |
113 | - { | |
121 | + //if (IdleCount && (!(IdleMSRemaining))) | |
122 | + //{ | |
114 | 123 | /* Reset the idle time remaining counter */ |
115 | - IdleMSRemaining = IdleCount; | |
124 | + // IdleMSRemaining = IdleCount; | |
116 | 125 | |
117 | 126 | /* Idle period is set and has elapsed, must send a report to the host */ |
118 | - SendReport = true; | |
119 | - } | |
120 | - else | |
121 | - { | |
127 | + //SendReport = true; | |
128 | + //} | |
129 | + //else | |
130 | + //{ | |
122 | 131 | /* Check to see if the report data has changed - if so a report MUST be sent */ |
123 | - SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0); | |
124 | - } | |
132 | + //SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0); | |
133 | + //} | |
125 | 134 | |
126 | 135 | |
127 | 136 | /** Envoi sur INTERFACE BOUTONS**/ |
128 | - /* Select the Keyboard Report Endpoint */ | |
137 | + /* Select the Buttons Report Endpoint */ | |
129 | 138 | Endpoint_SelectEndpoint(KEYBOARD_IN_Bout_EPADDR); |
130 | 139 | |
131 | 140 | /* Check if Keyboard Endpoint Ready for Read/Write and if we should send a new report */ |
132 | - if (Endpoint_IsReadWriteAllowed() && SendReport) | |
141 | + if (Endpoint_IsReadWriteAllowed() && Endpoint_IsINReady) | |
133 | 142 | { |
134 | 143 | /* Save the current report data for later comparison to check for changes */ |
135 | - PrevKeyboardReportData = KeyboardReportData; | |
144 | + //PrevKeyboardReportData = KeyboardReportData; | |
136 | 145 | |
137 | 146 | /* Write Keyboard Report Data */ |
138 | - Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData), NULL); | |
147 | + //Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData), NULL); | |
148 | + Endpoint_Write_8(boutons); | |
139 | 149 | |
140 | 150 | /* Finalize the stream transfer to send the last packet */ |
141 | 151 | Endpoint_ClearIN(); |
142 | 152 | } |
153 | + else printf("Buttons endpoint not ready to send\n"); | |
143 | 154 | |
144 | 155 | /** Envoi sur INTERFACE Joystick**/ |
145 | 156 | /* Select the Keyboard Report Endpoint */ |
146 | 157 | Endpoint_SelectEndpoint(KEYBOARD_IN_Joy_EPADDR); |
147 | 158 | |
148 | 159 | /* Check if Keyboard Endpoint Ready for Read/Write and if we should send a new report */ |
149 | - if (Endpoint_IsReadWriteAllowed() && SendReport) | |
160 | + if (Endpoint_IsReadWriteAllowed() && Endpoint_IsINReady) | |
150 | 161 | { |
151 | 162 | /* Save the current report data for later comparison to check for changes */ |
152 | - PrevKeyboardReportData = KeyboardReportData; | |
163 | + //PrevKeyboardReportData = KeyboardReportData; | |
153 | 164 | |
154 | 165 | /* Write Keyboard Report Data */ |
155 | - Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData), NULL); | |
166 | + //Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData), NULL); | |
167 | + Endpoint_Write_8(joystick_x); | |
168 | + Endpoint_Write_8(joystick_y); | |
156 | 169 | |
157 | 170 | /* Finalize the stream transfer to send the last packet */ |
158 | 171 | Endpoint_ClearIN(); |
159 | 172 | } |
173 | + else printf("Joystick endpoint not ready to send\n"); | |
160 | 174 | } |
161 | 175 | |
162 | 176 | |
177 | + | |
163 | 178 | /** Reads the next LED status report from the host from the LED data endpoint, if one has been sent. */ |
164 | -void ReceiveNextReport(void) //Réception Liaison Série | |
179 | +void Receive_EP_OUT_Report(void) //Réception Liaison Série | |
165 | 180 | { |
166 | 181 | /* Select the Keyboard LED Report Endpoint */ |
167 | 182 | Endpoint_SelectEndpoint(KEYBOARD_OUT_EPADDR); |
... | ... | @@ -175,11 +190,47 @@ void ReceiveNextReport(void) //Réception Liaison Série |
175 | 190 | /* Read in the LED report from the host */ |
176 | 191 | uint8_t LEDReport = Endpoint_Read_8(); |
177 | 192 | |
178 | - /* Process the read LED report from the host */ | |
179 | - ProcessLEDReport(LEDReport); | |
193 | + /* On envoie l'octet de commande de led sur la liaison série */ | |
194 | + Serial_SendByte(LEDReport); | |
180 | 195 | } |
196 | + else printf("LED endpoint not ready to receive\n"); | |
181 | 197 | |
182 | 198 | /* Handshake the OUT Endpoint - clear endpoint and ready for next report */ |
183 | 199 | Endpoint_ClearOUT(); |
184 | 200 | } |
185 | 201 | } |
202 | + | |
203 | + | |
204 | + | |
205 | +void Reception_Serie(void){ | |
206 | + if(Serial_IsCharReceived()){ // A la réception d'un caractère... | |
207 | + /* on vérifie qu'on a bien un début de trame*/ | |
208 | + unsigned char caractere = Serial_ReceiveByte(); | |
209 | + | |
210 | + /* si oui, on récupère les trois octets suivants*/ | |
211 | + if (caractere==debut_rcpt){ | |
212 | + boutons = Serial_ReceiveByte(); | |
213 | + joystick_x = Serial_ReceiveByte(); | |
214 | + joystick_y = Serial_ReceiveByte(); | |
215 | + } | |
216 | + } | |
217 | +} | |
218 | + | |
219 | + | |
220 | +/** Function to manage PAD report generation and transmission to the host, when in report mode. */ | |
221 | +void PAD_Task(void) | |
222 | +{ | |
223 | + /* Device must be connected and configured for the task to run */ | |
224 | + if (USB_DeviceState != DEVICE_STATE_Configured) | |
225 | + return; | |
226 | + | |
227 | + Reception_Serie(); //Réception des données de la liaison série | |
228 | + | |
229 | + /* Send the next button/joystick report to the host */ | |
230 | + Send_EP_IN_Report(); | |
231 | + | |
232 | + /* Process the LED report sent from the host */ | |
233 | + Receive_EP_OUT_Report(); | |
234 | +} | |
235 | + | |
236 | + | ... | ... |
lufa-master/PolytechLille/PAD/PAD.h
... | ... | @@ -46,9 +46,9 @@ |
46 | 46 | #include "Descriptors.h" |
47 | 47 | |
48 | 48 | //#include <LUFA/Drivers/Board/LEDs.h> |
49 | - //#include <LUFA/Drivers/PeripheralSerial.h> //inventé? | |
50 | 49 | #include <LUFA/Drivers/USB/USB.h> |
51 | 50 | #include <LUFA/Platform/Platform.h> |
51 | + #include "LUFA/Drivers/Peripheral/Serial.h" | |
52 | 52 | |
53 | 53 | /* Macros: */ |
54 | 54 | |
... | ... | @@ -56,9 +56,10 @@ |
56 | 56 | /* Function Prototypes: */ |
57 | 57 | void SetupHardware(void); |
58 | 58 | void EVENT_USB_Device_ConfigurationChanged(void); |
59 | - void SendNextReport(void); | |
60 | - void ReceiveNextReport(void); | |
61 | - //void EVENT_USB_Device_ControlRequest(void); | |
59 | + void Send_EP_IN_Report(void); | |
60 | + void Receive_EP_OUT_Report(void); | |
61 | + void Reception_Serie(void); | |
62 | + void PAD_Task(void); | |
62 | 63 | |
63 | 64 | #endif |
64 | 65 | ... | ... |
... | ... | @@ -3,9 +3,10 @@ |
3 | 3 | |
4 | 4 | // For the serial port |
5 | 5 | |
6 | -#define CPU_FREQ 16000000L // Assume a CPU frequency of 16Mhz | |
7 | -#define tempo 25 | |
8 | -#define debit 9600 //débit liaison série en bauds | |
6 | +#define CPU_FREQ 16000000L // Assume a CPU frequency of 16Mhz | |
7 | +#define tempo 25 | |
8 | +#define debit 9600 //débit liaison série en bauds | |
9 | +#define debut_serial_tx 0xff //pour détecter la transmission d'une trame pour le 16u2 | |
9 | 10 | |
10 | 11 | void init_serial(int speed) |
11 | 12 | { |
... | ... | @@ -24,40 +25,40 @@ UCSR0A &= ~(1 << U2X0); |
24 | 25 | |
25 | 26 | void send_serial(unsigned char c) |
26 | 27 | { |
27 | -loop_until_bit_is_set(UCSR0A, UDRE0); | |
28 | -UDR0 = c; | |
28 | + loop_until_bit_is_set(UCSR0A, UDRE0); | |
29 | + UDR0 = c; | |
29 | 30 | } |
30 | 31 | |
31 | 32 | unsigned char get_serial(void) { |
32 | -loop_until_bit_is_set(UCSR0A, RXC0); | |
33 | -return UDR0; | |
33 | + loop_until_bit_is_set(UCSR0A, RXC0); | |
34 | + return UDR0; | |
34 | 35 | } |
35 | 36 | |
36 | 37 | // For the AD converter |
37 | 38 | |
38 | 39 | void ad_init(unsigned char channel) |
39 | 40 | { |
40 | -ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); | |
41 | -ADMUX|=(1<<REFS0)|(1<<ADLAR); | |
42 | -ADMUX=(ADMUX&0xf0)|channel; | |
43 | -ADCSRA|=(1<<ADEN); | |
41 | + ADCSRA|=(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); | |
42 | + ADMUX|=(1<<REFS0)|(1<<ADLAR); | |
43 | + ADMUX=(ADMUX&0xf0)|channel; | |
44 | + ADCSRA|=(1<<ADEN); | |
44 | 45 | } |
45 | 46 | |
46 | 47 | //récupère la valeur de l'ADCH |
47 | 48 | unsigned int ad_sample(void){ |
48 | -ADCSRA|=(1<<ADSC); | |
49 | -while(bit_is_set(ADCSRA, ADSC)); | |
50 | -return ADCH; | |
49 | + ADCSRA|=(1<<ADSC); | |
50 | + while(bit_is_set(ADCSRA, ADSC)); | |
51 | + return ADCH; | |
51 | 52 | } |
52 | 53 | |
53 | 54 | // For the I/O |
54 | 55 | void output_init(void){ |
55 | -DDRB |= 0b00111111; // PIN 8-13 as output (LED) | |
56 | + DDRB |= 0b00111111; // PIN 8-13 as output (LED) | |
56 | 57 | } |
57 | 58 | |
58 | 59 | /* |
59 | 60 | void output_set(unsigned char value){ |
60 | -if(value==0) PORTB &= 0xfe; else PORTB |= 0x01; | |
61 | + if(value==0) PORTB &= 0xfe; else PORTB |= 0x01; | |
61 | 62 | } |
62 | 63 | */ |
63 | 64 | |
... | ... | @@ -68,7 +69,7 @@ void input_init(void){ |
68 | 69 | |
69 | 70 | /* |
70 | 71 | unsigned char input_get(void){ |
71 | -return ((PIND&0x04)!=0)?1:0; | |
72 | + return ((PIND&0x04)!=0)?1:0; | |
72 | 73 | } |
73 | 74 | */ |
74 | 75 | |
... | ... | @@ -116,59 +117,61 @@ unsigned char shape_joy(unsigned char pos){ |
116 | 117 | |
117 | 118 | /* Récupération de la valeur de l'axe du joystick sur la chaîne channel du CAN */ |
118 | 119 | unsigned char get_joystick(int channel){ |
119 | - unsigned char axis; | |
120 | - ad_init(channel); | |
121 | - axis = ad_sample(); | |
122 | - axis = shape_joy(axis); | |
123 | - return axis; | |
120 | + unsigned char axis; | |
121 | + ad_init(channel); | |
122 | + axis = ad_sample(); | |
123 | + axis = shape_joy(axis); | |
124 | + return axis; | |
124 | 125 | } |
125 | 126 | |
126 | 127 | /* Dummy main */ |
127 | 128 | int main(void){ |
128 | 129 | |
129 | 130 | //INITIALISATIONS |
130 | - unsigned char boutons, boutons_anc; | |
131 | - unsigned char joystick_x=0x10, joystick_x_anc=0x10; | |
132 | - unsigned char joystick_y=0x10, joystick_y_anc=0x10; | |
131 | + unsigned char boutons, boutons_anc; | |
132 | + unsigned char joystick_x=0x10, joystick_x_anc=0x10; | |
133 | + unsigned char joystick_y=0x10, joystick_y_anc=0x10; | |
133 | 134 | |
134 | - init_serial(debit); | |
135 | - output_init(); | |
136 | - input_init(); | |
135 | + init_serial(debit); | |
136 | + output_init(); | |
137 | + input_init(); | |
137 | 138 | |
138 | 139 | //Récupération des valeurs des boutons et joystick, et mise en forme |
139 | - boutons = get_buttons(); | |
140 | - joystick_x = get_joystick(0); | |
141 | - joystick_y = get_joystick(1); | |
140 | + boutons = get_buttons(); | |
141 | + joystick_x = get_joystick(0); | |
142 | + joystick_y = get_joystick(1); | |
142 | 143 | |
143 | - while(1){ | |
144 | + while(1){ | |
144 | 145 | boutons_anc = boutons; |
145 | 146 | joystick_x_anc = joystick_x; |
146 | 147 | joystick_y_anc = joystick_y; |
147 | 148 | |
148 | - //Récupération des valeurs des boutons et joystick, et mise en forme | |
149 | - boutons = get_buttons(); | |
150 | - joystick_x = get_joystick(0); | |
151 | - _delay_ms(tempo); | |
152 | - joystick_y = get_joystick(1); | |
149 | + //Récupération des valeurs des boutons et joystick, et mise en forme | |
150 | + boutons = get_buttons(); | |
151 | + joystick_x = get_joystick(0); | |
152 | + _delay_ms(tempo); | |
153 | + joystick_y = get_joystick(1); | |
153 | 154 | |
154 | - //Port série libre | |
155 | - if ((UCSR0A & (1<<RXC0)) == 0){ | |
156 | - // Si une des grandeurs a changé | |
157 | - if ((boutons_anc != boutons) || (joystick_x_anc != joystick_x) || (joystick_y_anc != joystick_y)){ | |
158 | - send_serial(boutons); //on envoie l'état global des grandeurs | |
159 | - send_serial(joystick_x); | |
160 | - send_serial(joystick_y); | |
161 | - //retour chariot | |
162 | - send_serial(0x0a); | |
163 | - send_serial(0x0d); | |
155 | + //Port série libre | |
156 | + if ((UCSR0A & (1<<RXC0)) == 0){ | |
157 | + // Si une des grandeurs a changé | |
158 | + if ((boutons_anc != boutons) || (joystick_x_anc != joystick_x) || (joystick_y_anc != joystick_y)){ | |
159 | + /* On envoie la trame des grandeurs */ | |
160 | + send_serial(debut_serial_tx); //début de trame | |
161 | + send_serial(boutons); //état global des grandeurs | |
162 | + send_serial(joystick_x); | |
163 | + send_serial(joystick_y); | |
164 | + //retour chariot | |
165 | + send_serial(0x0a); | |
166 | + send_serial(0x0d); | |
164 | 167 | } |
165 | 168 | } |
166 | 169 | |
167 | 170 | //Port série occupé |
168 | 171 | else{ |
169 | - commande_leds(); //On gère la commande des leds | |
172 | + commande_leds(); //On gère la commande des leds | |
170 | 173 | } |
171 | - } | |
174 | + } | |
172 | 175 | return 0; |
173 | 176 | } |
174 | 177 | ... | ... |