commit 39f0566283624a3d4642c9d876cece8e8ab65645 Author: Stefan Helmert Date: Sat Jan 4 02:34:53 2014 +0100 first commit: event device reading, heng long protocl conversion with CRC diff --git a/UDPclient.cbp b/UDPclient.cbp new file mode 100644 index 0000000..7d087c6 --- /dev/null +++ b/UDPclient.cbp @@ -0,0 +1,42 @@ + + + + + + diff --git a/UDPclient.depend b/UDPclient.depend new file mode 100644 index 0000000..ec8f039 --- /dev/null +++ b/UDPclient.depend @@ -0,0 +1,21 @@ +# depslib dependency file v1.0 +1388607752 source:/home/stefan/Proj/UDPclient/main.c + + + + + + + + + + + + + + + + + + + diff --git a/UDPclient.layout b/UDPclient.layout new file mode 100644 index 0000000..dfbb5ac --- /dev/null +++ b/UDPclient.layout @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient new file mode 100755 index 0000000..1e1513d Binary files /dev/null and b/bin/Debug/UDPclient differ diff --git a/main.c b/main.c new file mode 100644 index 0000000..c11846b --- /dev/null +++ b/main.c @@ -0,0 +1,248 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef struct input_thread_t +{ + char* filename; + struct input_event event; +} input_thread_t; + + +void *input_thread_fcn(void * arg) +{ + printf("pthread started\n"); + + struct input_event ev[2]; + int result = 0; + int fevdev; + int size = sizeof(struct input_event); + int rd; + int value; + input_thread_t* args; + + args = (input_thread_t*) arg; + fevdev = open(args->filename, O_RDONLY); + if (fevdev == -1) { + printf("Failed to open event device.\n"); + exit(1); + } + + while (1) + { + if ((rd = read(fevdev, ev, size * 2)) < size) { + break; + } + + value = ev[0].value; + + args->event = ev[1]; + // quit + if(16==args->event.code && 1==args->event.value) break; + } + + printf("Exiting.\n"); + result = ioctl(fevdev, EVIOCGRAB, 1); + close(fevdev); + + pthread_exit(0); +} + + +int CRC(int data) +{ + int c; + c = 0; + c ^= data & 0x03; + c ^= (data >> 2) & 0x0F; + c ^= (data >> 6) & 0x0F; + c ^= (data >> 10) & 0x0F; + c ^= (data >> 14) & 0x0F; + c ^= (data >> 18) & 0x0F; + return c; +} + +int data2frame(int data) +{ + int frame; + frame = 0; + frame |= CRC(data) << 2; + frame |= data << 6; + frame |= 0xFE000000; + return frame; +} + + +int values2data(int velocity, int direction, int ignation, int mg, int fire, int turretelev, int turret_left, int turret_right, int recoil) +{ + int data = 0; + data = (mg & 1) | (ignation & 1) << 1 | (direction & 0b11111) << 2 | (fire & 1) << 7 | (turretelev & 1) << 8 | (turret_left & 1) << 9 | (turret_right & 1) << 10 | (recoil & 1) << 11 | (velocity & 0b11111) << 12; + return data; +} + +int main(int argc, char* argv[]) +{ + pthread_t inpthread; + pthread_attr_t inp_thread_attr; + input_thread_t input_thread_args; + int inpdetachstate; + int i=0; + int frame; + + int velocity = 0b10000, direction=0b01111; + int ignation = 0, mg = 0, fire = 0, turretelev = 0, turret_left = 0, turret_right = 0, recoil = 0, smoke = 0; + + + input_thread_args.filename = argv[1]; + + + pthread_attr_init(&inp_thread_attr); + if (pthread_create(&inpthread, &inp_thread_attr, input_thread_fcn , (void *) &input_thread_args)) printf("failed to create thread %d\n", i); + + + while(1){ + usleep(100000); + printf("%d %d %d %d %d %d %d %d %d %d | %d %d %d %d\n", velocity, direction, ignation, mg, fire, turret_left, turret_right, turretelev, recoil, smoke, input_thread_args.event.code, input_thread_args.event.value, input_thread_args.event.type, input_thread_args.event.time); + if(108==input_thread_args.event.code){ + if(input_thread_args.event.value){ + velocity = 0b11111; + }else{ + velocity = 0b10000; + } + } + if(103==input_thread_args.event.code){ + if(input_thread_args.event.value){ + velocity = 0b00000; + }else{ + velocity = 0b10000; + } + } + if(105==input_thread_args.event.code){ + if(input_thread_args.event.value){ + direction = 0b00000; + }else{ + direction = 0b01111; + } + } + if(106==input_thread_args.event.code){ + if(input_thread_args.event.value){ + direction = 0b11111; + }else{ + direction = 0b01111; + } + } + if(23==input_thread_args.event.code){ + if(input_thread_args.event.value){ + ignation = 1; + }else{ + ignation = 0; + } + } + if(34==input_thread_args.event.code){ + if(input_thread_args.event.value){ + mg = 1; + }else{ + mg = 0; + } + } + if(33==input_thread_args.event.code){ + if(input_thread_args.event.value){ + fire = 1; + }else{ + fire = 0; + } + } + if(29==input_thread_args.event.code){ + if(input_thread_args.event.value){ + turret_left = 1; + }else{ + turret_left = 0; + } + } + if(20==input_thread_args.event.code){ + if(input_thread_args.event.value){ + turretelev = 1; + }else{ + turretelev = 0; + } + } + if(19==input_thread_args.event.code){ + if(input_thread_args.event.value){ + recoil = 1; + }else{ + recoil = 0; + } + } + + frame = data2frame(values2data(velocity, direction, ignation, mg, fire, turretelev, turret_left, turret_right, recoil)); + printf("%#x\n", frame); + if(pthread_kill(inpthread, 0)) break; + } + + return 0; +} + + + +/* Sample UDP client */ +/* +#include +#include +#include + +int main(int argc, char**argv) +{ + + FILE *kbfp; + char key; + + kbfp = fopen("/dev/input/event2", "rb"); + + while(1){ + key = fgetc(kbfp); + printf("%c\n", key); + } + fclose(kbfp); + + int sockfd,n; + struct sockaddr_in servaddr,cliaddr; + char sendline[1000]; + char recvline[1000]; + + if (argc != 2) + { + printf("usage: udpcli \n"); + exit(1); + } + + sockfd=socket(AF_INET,SOCK_DGRAM,0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr(argv[1]); + servaddr.sin_port=htons(32000); + + while (fgets(sendline, 10000,stdin) != NULL) + { + sendto(sockfd,sendline,strlen(sendline),0, + (struct sockaddr *)&servaddr,sizeof(servaddr)); + n=recvfrom(sockfd,recvline,10000,0,NULL,NULL); + recvline[n]=0; + fputs(recvline,stdout); + } +} +*/ diff --git a/obj/Debug/main.o b/obj/Debug/main.o new file mode 100644 index 0000000..a4543cb Binary files /dev/null and b/obj/Debug/main.o differ