diff --git a/games/ninvaders/ninvaders-0.1.1/aliens.o b/games/ninvaders/ninvaders-0.1.1/aliens.o new file mode 100644 index 0000000..5337cfb Binary files /dev/null and b/games/ninvaders/ninvaders-0.1.1/aliens.o differ diff --git a/games/ninvaders/ninvaders-0.1.1/arduino.c b/games/ninvaders/ninvaders-0.1.1/arduino.c new file mode 100644 index 0000000..cc82ebd --- /dev/null +++ b/games/ninvaders/ninvaders-0.1.1/arduino.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include "arduino.h" + +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 && status!=LIBUSB_ERROR_TIMEOUT){ perror("libusb_interrupt_transfer"); exit(-1); } +} + +int 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 -1; } + int status = libusb_interrupt_transfer(handle, endpoint_desc_list[endpoint_id].bEndpointAddress, (unsigned char *) data, 1, NULL, TIMEOUT); + if(status!=0 && status!=LIBUSB_ERROR_TIMEOUT){ perror("libusb_interrupt_transfer"); exit(-1); } + return status; +} diff --git a/games/ninvaders/ninvaders-0.1.1/arduino.h b/games/ninvaders/ninvaders-0.1.1/arduino.h new file mode 100644 index 0000000..944d968 --- /dev/null +++ b/games/ninvaders/ninvaders-0.1.1/arduino.h @@ -0,0 +1,19 @@ +#ifndef ARDUINO +#define ARDUINO + +#define ID_VENDOR 0x2341 +#define ID_PRODUCT 0x01 +#define ENDPOINTS_NUMBER 4 +#define TIMEOUT 50 +#define MAX_DATA 50 + +void init(libusb_context **context, libusb_device ***devices, ssize_t *devices_count); +libusb_device* searchArduino(libusb_device **devices, ssize_t devices_count); +void openConnection(libusb_device *arduino, libusb_device_handle **handle, struct libusb_config_descriptor **config_desc); +void getEndpoints(struct libusb_config_descriptor *config_desc, struct libusb_endpoint_descriptor *endpoint_desc_list); +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); +void stop(struct libusb_config_descriptor *config_desc, libusb_device_handle *handle, libusb_device **devices, libusb_context *context); +void sendData(int endpoint_id, uint8_t data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list); +int receiveData(int endpoint_id, uint8_t *data, libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list); + +#endif diff --git a/games/ninvaders/ninvaders-0.1.1/globals.o b/games/ninvaders/ninvaders-0.1.1/globals.o new file mode 100644 index 0000000..03859c3 Binary files /dev/null and b/games/ninvaders/ninvaders-0.1.1/globals.o differ diff --git a/games/ninvaders/ninvaders-0.1.1/makefile b/games/ninvaders/ninvaders-0.1.1/makefile new file mode 100644 index 0000000..c2ffbd0 --- /dev/null +++ b/games/ninvaders/ninvaders-0.1.1/makefile @@ -0,0 +1,20 @@ +CC=gcc +CFLAGS=-O3 -Wall +LIBS=-l ncurses usb-1.0 + +CFILES=globals.c view.c aliens.c ufo.c player.c ardunio.c nInvaders.c +HFILES=globals.h view.h aliens.h ufo.h player.h ardunio.h nInvaders.h +OFILES=globals.o view.o aliens.o ufo.o player.o ardunio.o nInvaders.o +all: nInvaders + rm -f $(OFILES) + +nInvaders: $(OFILES) $(HFILES) + $(CC) $(LDFLAGS) -o$@ $(OFILES) $(LIBS) + +.c.o: + $(CC) -c -I. $(CFLAGS) $(OPTIONS) $< +clean: + rm -f nInvaders $(OFILES) + +exec: all + ./nInvaders diff --git a/games/ninvaders/ninvaders-0.1.1/nInvaders.c b/games/ninvaders/ninvaders-0.1.1/nInvaders.c index 793139c..3e8a6f2 100644 --- a/games/ninvaders/ninvaders-0.1.1/nInvaders.c +++ b/games/ninvaders/ninvaders-0.1.1/nInvaders.c @@ -29,6 +29,11 @@ #include "player.h" #include "aliens.h" #include "ufo.h" +#include "arduino.h" +#include +#include +#include +#include #define FPS 50 @@ -131,12 +136,22 @@ void drawscore() /** * reads input from keyboard and do action */ -void readInput() +void readInput(libusb_device_handle *handle, struct libusb_endpoint_descriptor *endpoint_desc_list) { int ch; static int lastmove; + timeout(100); ch = getch(); // get key pressed + if(ch == -1){ + uint8_t data; + int status = receiveData(2, &data, handle, endpoint_desc_list); + if(status == 0){ + if(data & 0x10 == 0x10) ch = KEY_LEFT; + else if(data & 0x08 == 0x08) ch = ' '; + else if(data & 0x04 == 0x04) ch = KEY_RIGHT; + } + } switch (status) { @@ -326,10 +341,31 @@ void setUpTimer() } +int go = 1; +void signalINT(int sig){ + if(sig == SIGINT){ + go = 0; + } +} int main(int argc, char **argv) { - weite = 0; - score = 0; + 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 + start(&context, &devices, &handle, &config_desc, endpoint_desc_list); + + // singals + struct sigaction action; + action.sa_handler = signalINT; + sigaction(SIGINT, &action, NULL); + + // nInvaders + weite = 0; + score = 0; lives = 3; level = 0; skill_level = 1; @@ -344,8 +380,11 @@ int main(int argc, char **argv) // read keyboard input do { // do movements and key-checking - readInput(); - } while (0 == 0); + readInput(handler, endpoint_desc_list); + } while (go); + + // stop + stop(config_desc, handle, devices, context); return 0; } diff --git a/games/ninvaders/ninvaders-0.1.1/player.o b/games/ninvaders/ninvaders-0.1.1/player.o new file mode 100644 index 0000000..0807a67 Binary files /dev/null and b/games/ninvaders/ninvaders-0.1.1/player.o differ diff --git a/games/ninvaders/ninvaders-0.1.1/ufo.o b/games/ninvaders/ninvaders-0.1.1/ufo.o new file mode 100644 index 0000000..10edbd0 Binary files /dev/null and b/games/ninvaders/ninvaders-0.1.1/ufo.o differ diff --git a/games/ninvaders/ninvaders-0.1.1/view.o b/games/ninvaders/ninvaders-0.1.1/view.o new file mode 100644 index 0000000..366f3ce Binary files /dev/null and b/games/ninvaders/ninvaders-0.1.1/view.o differ -- libgit2 0.21.2