diff --git a/PartiePC/PC.c b/PartiePC/PC.c deleted file mode 100644 index 392b046..0000000 --- a/PartiePC/PC.c +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include -#include -#include - -// arduino ID vendor and product -#define ID_VENDOR 0x2341 -#define ID_PRODUCT 0x01 -#define ENDPOINTS_NUMBER 4 -#define TIMEOUT 100 -#define MAX_DATA 50 - -void init(libusb_context **context, libusb_device ***devices, ssize_t *devices_count){ - int status = libusb_init(context); - if(status != 0){perror("libusb_init"); exit(-1);} - - *devices_count = libusb_get_device_list(*context, devices); - if(*devices_count < 0){perror("libusb_get_device_list"); exit(-1);} -} - -libusb_device* searchArduino(libusb_device **devices, ssize_t devices_count){ - for(int i=0; ibConfigurationValue; - - // detach kernel - for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ - int interface = (*config_desc)->interface[j].altsetting[0].bInterfaceNumber; - if(libusb_kernel_driver_active(*handle, interface)){ - status = libusb_detach_kernel_driver(*handle, interface); - if(status != 0){ perror("libusb_detach_kernel_driver"); exit(-1); } - } - } - - // use config - status = libusb_set_configuration(*handle, configuration); - if(status != 0){ perror("libusb_set_configuration"); exit(-1); } - - // claim interfaces - for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ - struct libusb_interface_descriptor interface_desc = (*config_desc)->interface[j].altsetting[0]; - int interface = interface_desc.bInterfaceNumber; - - status = libusb_claim_interface(*handle, interface); - if(status != 0){ perror("libusb_claim_interface"); exit(-1); } - } -} - -void getEndpoints(struct libusb_config_descriptor *config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ - int count = 0; - // in interfaces - for(int j=0; jbNumInterfaces; j++){ - // find endpoints - for(int k=0; kinterface[j].altsetting[0].bNumEndpoints; k++){ - if(count > ENDPOINTS_NUMBER){ printf("getEndpoints: Array out of bound :%d:", count); exit(-1); } - *(endpoint_desc_list + count) = config_desc->interface[j].altsetting[0].endpoint[k]; - count++; - } - } - //if(count != ENDPOINTS_NUMBER){ printf("Wrong number of endpoints.\nIs this the good device ?\n"); exit(-1); } -} - -void start(libusb_context **context, libusb_device ***devices, libusb_device_handle **handle, struct libusb_config_descriptor **config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ - // init - ssize_t devices_count; - init(context, devices, &devices_count); - - // get arduino device - libusb_device *arduino = searchArduino(*devices, devices_count); - if(arduino == NULL){ printf("Arduino device not found\n"); exit(-1); } - - // open connection, use config, detach kernel and claim interfaces - openConnection(arduino, handle, config_desc); - - // get enpoints - getEndpoints(*config_desc, endpoint_desc_list); -} - -void stop(struct libusb_config_descriptor *config_desc, libusb_device_handle *handle, libusb_device **devices, libusb_context *context){ - // release interfaces - for(int j=0; jbNumInterfaces; j++){ - struct libusb_interface_descriptor interface_desc = config_desc->interface[j].altsetting[0]; - int interface = interface_desc.bInterfaceNumber; - - int status = libusb_release_interface(handle, interface); - if(status != 0){ perror("libusb_release_interface"); exit(-1); } - } - - // free config - libusb_free_config_descriptor(config_desc); - - // close connection - libusb_close(handle); - - // free device list - libusb_free_device_list(devices, 1); - - // libusb exit - libusb_exit(context); -} - -void sendData(int endpoint_id, uint8_t data){ - if(endpoint_id < 0 || endpoint_id > 1){ printf("(sendData) Wrong endpoint !\nMust be 0 or 1\n"); return; } - int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) &data, 1, NULL, TIMEOUT); - if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } -} - -void receiveData(int endpoint_id, uint8_t *data){ - if(endpoint_id < 2 || endpoint_id > 3){ printf("(sendData) Wrong endpoint !\nMust be 2 or 3\n"); return; } - status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) data, 1, NULL, TIMEOUT); - if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } -} - -int go = 1; -void signalINT(int sig){ - if(sig == SIGINT){ - printf("\nSignal SIGINT reçu...\n"); - go = 0; - } -} -int main(){ - libusb_context *context; - libusb_device **devices; - libusb_device_handle *handle; - struct libusb_config_descriptor *config_desc; - struct libusb_endpoint_descriptor endpoint_desc_list[ENDPOINTS_NUMBER]; - - // start - printf("Starting...\n"); - start(&context, &devices, &handle, &config_desc, endpoint_desc_list); - printf("Start complete\n"); - - struct sigaction action; - action.sa_handler = signalINT; - sigaction(SIGINT, &action, NULL); - - while(go){ - sendData(0, 0x16); //0b00010110 - sleep(1); - sendData(1, 0x01); //0b00000001 - sleep(1); - sendData(1, 0x00); - sendData(1, 0x00); - sleep(1); - } - - // stop - printf("Stoping...\n"); - stop(config_desc, handle, devices, context); - printf("Stop complete...\n"); -} diff --git a/PartiePC/PCReveive.c b/PartiePC/PCReveive.c new file mode 100644 index 0000000..f6943a1 --- /dev/null +++ b/PartiePC/PCReveive.c @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include + +// arduino ID vendor and product +#define ID_VENDOR 0x2341 +#define ID_PRODUCT 0x01 +#define ENDPOINTS_NUMBER 4 +#define TIMEOUT 100 +#define MAX_DATA 50 + +void init(libusb_context **context, libusb_device ***devices, ssize_t *devices_count){ + int status = libusb_init(context); + if(status != 0){perror("libusb_init"); exit(-1);} + + *devices_count = libusb_get_device_list(*context, devices); + if(*devices_count < 0){perror("libusb_get_device_list"); exit(-1);} +} + +libusb_device* searchArduino(libusb_device **devices, ssize_t devices_count){ + for(int i=0; ibConfigurationValue; + + // detach kernel + for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ + int interface = (*config_desc)->interface[j].altsetting[0].bInterfaceNumber; + if(libusb_kernel_driver_active(*handle, interface)){ + status = libusb_detach_kernel_driver(*handle, interface); + if(status != 0){ perror("libusb_detach_kernel_driver"); exit(-1); } + } + } + + // use config + status = libusb_set_configuration(*handle, configuration); + if(status != 0){ perror("libusb_set_configuration"); exit(-1); } + + // claim interfaces + for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ + struct libusb_interface_descriptor interface_desc = (*config_desc)->interface[j].altsetting[0]; + int interface = interface_desc.bInterfaceNumber; + + status = libusb_claim_interface(*handle, interface); + if(status != 0){ perror("libusb_claim_interface"); exit(-1); } + } +} + +void getEndpoints(struct libusb_config_descriptor *config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ + int count = 0; + // in interfaces + for(int j=0; jbNumInterfaces; j++){ + // find endpoints + for(int k=0; kinterface[j].altsetting[0].bNumEndpoints; k++){ + if(count > ENDPOINTS_NUMBER){ printf("getEndpoints: Array out of bound :%d:", count); exit(-1); } + *(endpoint_desc_list + count) = config_desc->interface[j].altsetting[0].endpoint[k]; + count++; + } + } + //if(count != ENDPOINTS_NUMBER){ printf("Wrong number of endpoints.\nIs this the good device ?\n"); exit(-1); } +} + +void start(libusb_context **context, libusb_device ***devices, libusb_device_handle **handle, struct libusb_config_descriptor **config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ + // init + ssize_t devices_count; + init(context, devices, &devices_count); + + // get arduino device + libusb_device *arduino = searchArduino(*devices, devices_count); + if(arduino == NULL){ printf("Arduino device not found\n"); exit(-1); } + + // open connection, use config, detach kernel and claim interfaces + openConnection(arduino, handle, config_desc); + + // get enpoints + getEndpoints(*config_desc, endpoint_desc_list); +} + +void stop(struct libusb_config_descriptor *config_desc, libusb_device_handle *handle, libusb_device **devices, libusb_context *context){ + // release interfaces + for(int j=0; jbNumInterfaces; j++){ + struct libusb_interface_descriptor interface_desc = config_desc->interface[j].altsetting[0]; + int interface = interface_desc.bInterfaceNumber; + + int status = libusb_release_interface(handle, interface); + if(status != 0){ perror("libusb_release_interface"); exit(-1); } + } + + // free config + libusb_free_config_descriptor(config_desc); + + // close connection + libusb_close(handle); + + // free device list + libusb_free_device_list(devices, 1); + + // libusb exit + libusb_exit(context); +} + +void sendData(int endpoint_id, uint8_t data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list){ + if(endpoint_id < 0 || endpoint_id > 1){ printf("(sendData) Wrong endpoint !\nMust be 0 or 1\n"); return; } + int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) &data, 1, NULL, TIMEOUT); + if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } +} + +void receiveData(int endpoint_id, uint8_t *data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list){ + if(endpoint_id < 2 || endpoint_id > 3){ printf("(sendData) Wrong endpoint !\nMust be 2 or 3\n"); return; } + int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) data, 1, NULL, 0); + if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } +} + +int go = 1; +void signalINT(int sig){ + if(sig == SIGINT){ + printf("\nSignal SIGINT reçu...\n"); + go = 0; + } +} +int main(){ + libusb_context *context; + libusb_device **devices; + libusb_device_handle *handle; + struct libusb_config_descriptor *config_desc; + struct libusb_endpoint_descriptor endpoint_desc_list[ENDPOINTS_NUMBER]; + + // start + printf("Starting...\n"); + start(&context, &devices, &handle, &config_desc, endpoint_desc_list); + printf("Start complete\n"); + + struct sigaction action; + action.sa_handler = signalINT; + sigaction(SIGINT, &action, NULL); + + while(go){ + int data; + receiveData(3, &data, handle, endpoint_desc_list); + printf("0x%x\n", data); + } + + // stop + printf("Stoping...\n"); + stop(config_desc, handle, devices, context); + printf("Stop complete...\n"); +} diff --git a/PartiePC/PCSend.c b/PartiePC/PCSend.c new file mode 100644 index 0000000..08e2522 --- /dev/null +++ b/PartiePC/PCSend.c @@ -0,0 +1,176 @@ +#include +#include +#include +#include +#include + +// arduino ID vendor and product +#define ID_VENDOR 0x2341 +#define ID_PRODUCT 0x01 +#define ENDPOINTS_NUMBER 4 +#define TIMEOUT 100 +#define MAX_DATA 50 + +void init(libusb_context **context, libusb_device ***devices, ssize_t *devices_count){ + int status = libusb_init(context); + if(status != 0){perror("libusb_init"); exit(-1);} + + *devices_count = libusb_get_device_list(*context, devices); + if(*devices_count < 0){perror("libusb_get_device_list"); exit(-1);} +} + +libusb_device* searchArduino(libusb_device **devices, ssize_t devices_count){ + for(int i=0; ibConfigurationValue; + + // detach kernel + for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ + int interface = (*config_desc)->interface[j].altsetting[0].bInterfaceNumber; + if(libusb_kernel_driver_active(*handle, interface)){ + status = libusb_detach_kernel_driver(*handle, interface); + if(status != 0){ perror("libusb_detach_kernel_driver"); exit(-1); } + } + } + + // use config + status = libusb_set_configuration(*handle, configuration); + if(status != 0){ perror("libusb_set_configuration"); exit(-1); } + + // claim interfaces + for(int j=0; j<(*config_desc)->bNumInterfaces; j++){ + struct libusb_interface_descriptor interface_desc = (*config_desc)->interface[j].altsetting[0]; + int interface = interface_desc.bInterfaceNumber; + + status = libusb_claim_interface(*handle, interface); + if(status != 0){ perror("libusb_claim_interface"); exit(-1); } + } +} + +void getEndpoints(struct libusb_config_descriptor *config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ + int count = 0; + // in interfaces + for(int j=0; jbNumInterfaces; j++){ + // find endpoints + for(int k=0; kinterface[j].altsetting[0].bNumEndpoints; k++){ + if(count > ENDPOINTS_NUMBER){ printf("getEndpoints: Array out of bound :%d:", count); exit(-1); } + *(endpoint_desc_list + count) = config_desc->interface[j].altsetting[0].endpoint[k]; + count++; + } + } + //if(count != ENDPOINTS_NUMBER){ printf("Wrong number of endpoints.\nIs this the good device ?\n"); exit(-1); } +} + +void start(libusb_context **context, libusb_device ***devices, libusb_device_handle **handle, struct libusb_config_descriptor **config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list){ + // init + ssize_t devices_count; + init(context, devices, &devices_count); + + // get arduino device + libusb_device *arduino = searchArduino(*devices, devices_count); + if(arduino == NULL){ printf("Arduino device not found\n"); exit(-1); } + + // open connection, use config, detach kernel and claim interfaces + openConnection(arduino, handle, config_desc); + + // get enpoints + getEndpoints(*config_desc, endpoint_desc_list); +} + +void stop(struct libusb_config_descriptor *config_desc, libusb_device_handle *handle, libusb_device **devices, libusb_context *context){ + // release interfaces + for(int j=0; jbNumInterfaces; j++){ + struct libusb_interface_descriptor interface_desc = config_desc->interface[j].altsetting[0]; + int interface = interface_desc.bInterfaceNumber; + + int status = libusb_release_interface(handle, interface); + if(status != 0){ perror("libusb_release_interface"); exit(-1); } + } + + // free config + libusb_free_config_descriptor(config_desc); + + // close connection + libusb_close(handle); + + // free device list + libusb_free_device_list(devices, 1); + + // libusb exit + libusb_exit(context); +} + +void sendData(int endpoint_id, uint8_t data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list){ + if(endpoint_id < 0 || endpoint_id > 1){ printf("(sendData) Wrong endpoint !\nMust be 0 or 1\n"); return; } + int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) &data, 1, NULL, TIMEOUT); + if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } +} + +void receiveData(int endpoint_id, uint8_t *data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list){ + if(endpoint_id < 2 || endpoint_id > 3){ printf("(sendData) Wrong endpoint !\nMust be 2 or 3\n"); return; } + int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) data, 1, NULL, TIMEOUT); + if(status!=0){ perror("libusb_interrupt_transfer"); exit(-1); } +} + +int go = 1; +void signalINT(int sig){ + if(sig == SIGINT){ + printf("\nSignal SIGINT reçu...\n"); + go = 0; + } +} +int main(){ + libusb_context *context; + libusb_device **devices; + libusb_device_handle *handle; + struct libusb_config_descriptor *config_desc; + struct libusb_endpoint_descriptor endpoint_desc_list[ENDPOINTS_NUMBER]; + + // start + printf("Starting...\n"); + start(&context, &devices, &handle, &config_desc, endpoint_desc_list); + printf("Start complete\n"); + + struct sigaction action; + action.sa_handler = signalINT; + sigaction(SIGINT, &action, NULL); + + while(go){ + sendData(1, 0x01, handle, endpoint_desc_list); + sleep(1); + sendData(0, 0x1F, handle, endpoint_desc_list); + sleep(1); + sendData(0, 0x16, handle, endpoint_desc_list); + sleep(1); + sendData(0, 0x00, handle, endpoint_desc_list); + sendData(1, 0x00, handle, endpoint_desc_list); + sleep(1); + } + + // stop + printf("Stoping...\n"); + stop(config_desc, handle, devices, context); + printf("Stop complete...\n"); +} diff --git a/PartiePC/a.out b/PartiePC/a.out index ae62d8b..4fc331a 100755 Binary files a/PartiePC/a.out and b/PartiePC/a.out differ diff --git a/PartiePC/makefile b/PartiePC/makefile index 2d1e0bf..a31e71f 100644 --- a/PartiePC/makefile +++ b/PartiePC/makefile @@ -1,5 +1,5 @@ all: - gcc *.c -l usb-1.0 -Wall -Wextra + gcc PCSend.c -l usb-1.0 -Wall -Wextra clean: rm -f *.o a.out diff --git a/atmega16u2/base/makefile b/atmega16u2/base/makefile new file mode 100644 index 0000000..cafabbe --- /dev/null +++ b/atmega16u2/base/makefile @@ -0,0 +1,4 @@ +all: + dfu-programmer atmega16u2 erase + dfu-programmer atmega16u2 flash *.hex + dfu-programmer atmega16u2 reset diff --git a/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.c b/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.c index 89e6316..6008c47 100644 --- a/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.c +++ b/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.c @@ -15,6 +15,7 @@ int main(void){ } } +uint8_t led = 0; void PAD_Task(void){ if (USB_DeviceState != DEVICE_STATE_Configured) return; @@ -33,37 +34,34 @@ void PAD_Task(void){ * Z : état d'un bouton * Cas 0b1YZZZZZZ : (joystick) - * 12u2 -> PC (endpoint button 2) : 0bXXXXYYYY - * X != 0000 -> valeur en X du joystick (codé sur 4 bits) Y est mis à 0000 - * Y != 0000 -> valeur en Y du joystick (codé sur 4 bits) X est mis à 0000 + * 12u2 -> PC (endpoint button 2) : 0bX0YYYYYY + * X = 0 -> valeur en X du joystick + * X = 1 -> valeur en Y du joystick */ if(Serial_IsCharReceived()){ uint8_t byte = Serial_ReceiveByte(); if((byte & 0x80) == 0){ // bouttons Endpoint_SelectEndpoint(PAD_IN_EP_BUTTON1); if (Endpoint_IsINReady() && Endpoint_IsReadWriteAllowed()){ - LEDs_SetAllLEDs(LEDS_LED1); + LEDs_SetAllLEDs(LEDS_LED1); //LED Tx Endpoint_Write_8(byte); Endpoint_ClearIN(); - LEDs_SetAllLEDs(0); } }else if((byte & 0x40) == 0){ // joystick X - uint8_t toSend = (byte << 2) && 0xF0; + uint8_t toSend = (byte) & 0x3F; Endpoint_SelectEndpoint(PAD_IN_EP_BUTTON2); if (Endpoint_IsINReady() && Endpoint_IsReadWriteAllowed()){ - LEDs_SetAllLEDs(LEDS_LED1); - Endpoint_Write_8(byte); + LEDs_SetAllLEDs(LEDS_LED1); //LED Tx + Endpoint_Write_8(toSend); Endpoint_ClearIN(); - LEDs_SetAllLEDs(0); } }else{ // joystick Y - uint8_t toSend = (byte >> 2) && 0x0F; + uint8_t toSend = ((byte) & 0x3F) | 0x80; Endpoint_SelectEndpoint(PAD_IN_EP_BUTTON2); if (Endpoint_IsINReady() && Endpoint_IsReadWriteAllowed()){ - LEDs_SetAllLEDs(LEDS_LED1); - Endpoint_Write_8(byte); + LEDs_SetAllLEDs(LEDS_LED1); //LED Tx + Endpoint_Write_8(toSend); Endpoint_ClearIN(); - LEDs_SetAllLEDs(0); } } } @@ -78,22 +76,27 @@ void PAD_Task(void){ * X = état d'une LED (LED 13) * * 16u2 -> 328p : 0bXYYYYYYY - * X = 0 -> pour les LEDs 8 9 10 11 12 (Y : les données) - * X = 1 -> pour la LED 13 (Y : la donnée) + * X = 0 -> pour les LEDs 8 9 10 11 12 13 (Y : les données) */ Endpoint_SelectEndpoint(PAD_OUT_EP_LED1); if (Endpoint_IsOUTReceived() && Endpoint_IsReadWriteAllowed()){ + LEDs_SetAllLEDs(LEDS_LED2); //LED Rx uint8_t byte = Endpoint_Read_8(); - Serial_SendByte(byte); + led = (led & 0x20) | byte; + Serial_SendByte(led); Endpoint_ClearOUT(); } - Endpoint_SelectEndpoint(PAD_OUT_EP_LED1); + Endpoint_SelectEndpoint(PAD_OUT_EP_LED2); if (Endpoint_IsOUTReceived() && Endpoint_IsReadWriteAllowed()){ + LEDs_SetAllLEDs(LEDS_LED2); //LED Rx uint8_t byte = Endpoint_Read_8(); - uint8_t toSend = byte | 0x80; - Serial_SendByte(byte); + led = (led & 0x1F) | byte << 5; + Serial_SendByte(led); Endpoint_ClearOUT(); } + + //LED Reset + LEDs_SetAllLEDs(0); } /** Configures the board hardware and chip peripherals for the project's functionality. */ @@ -117,7 +120,7 @@ void SetupHardware(void){ void EVENT_USB_Device_ConfigurationChanged(void){ /* Setup HID Report Endpoints */ Endpoint_ConfigureEndpoint(PAD_OUT_EP_LED1 , EP_TYPE_INTERRUPT, PAD_EPSIZE, 1); - Endpoint_ConfigureEndpoint(PAD_OUT_EP_LED2 , EP_TYPE_INTERRif(Serial_IsCharReceived())UPT, PAD_EPSIZE, 1); + Endpoint_ConfigureEndpoint(PAD_OUT_EP_LED2 , EP_TYPE_INTERRUPT, PAD_EPSIZE, 1); Endpoint_ConfigureEndpoint(PAD_IN_EP_BUTTON1, EP_TYPE_INTERRUPT, PAD_EPSIZE, 1); Endpoint_ConfigureEndpoint(PAD_IN_EP_BUTTON2, EP_TYPE_INTERRUPT, PAD_EPSIZE, 1); } diff --git a/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.h b/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.h index b9ab132..4501415 100644 --- a/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.h +++ b/atmega16u2/custom/lufa-LUFA-170418/PolytechLille/PAD/PAD.h @@ -29,9 +29,7 @@ /* Function Prototypes: */ void SetupHardware(void); - void HID_Task(void); - void Send_Task(void); - void EVENT_USB_Device_configure(void); + void PAD_Task(void); void EVENT_USB_Device_ControlRequest(void); #endif -- libgit2 0.21.2