From b29d6316684f0e97d89f78205abff3ec680c7a0e Mon Sep 17 00:00:00 2001 From: Stefan Helmert Date: Sun, 5 Jan 2014 16:34:00 +0100 Subject: [PATCH] client event reading and UDP operation ready - checking reflected frame and detecting frameloss --- UDPclient.depend | 2 +- bin/Debug/UDPclient | Bin 16199 -> 19096 bytes main.c | 321 +++++++++++++++++++++++++++----------------- obj/Debug/main.o | Bin 10240 -> 16808 bytes 4 files changed, 200 insertions(+), 123 deletions(-) diff --git a/UDPclient.depend b/UDPclient.depend index ec8f039..2df2d25 100644 --- a/UDPclient.depend +++ b/UDPclient.depend @@ -1,5 +1,5 @@ # depslib dependency file v1.0 -1388607752 source:/home/stefan/Proj/UDPclient/main.c +1388888028 source:/home/stefan/Proj/UDPclient/main.c diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient index 1e1513d89ab3f48a9266b069b8e7e9c480f82d69..ea3b2cc00eb4cc094862002b5d379a260185a71e 100755 GIT binary patch literal 19096 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 delta 5342 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 diff --git a/main.c b/main.c index c11846b..7ca7461 100644 --- a/main.c +++ b/main.c @@ -14,7 +14,8 @@ #include #include #include - +#include +#include typedef struct input_thread_t { @@ -62,7 +63,6 @@ void *input_thread_fcn(void * arg) pthread_exit(0); } - int CRC(int data) { int c; @@ -94,19 +94,178 @@ int values2data(int velocity, int direction, int ignation, int mg, int fire, int return data; } +typedef struct henglong_t +{ + int velocity, direction; + int ignation, mg, fire, turretelev, turret_left, turret_right, recoil; +} henglong_t; + +void inithenglong(henglong_t* henglong) +{ + henglong->velocity = 0b10000; + henglong->direction = 0b01111; + henglong->ignation = 0; + henglong->mg = 0; + henglong->fire = 0; + henglong->turretelev = 0; + henglong->turret_left = 0; + henglong->turret_right = 0; + henglong->recoil = 0; +} + + +int event2data(henglong_t* henglong, struct input_event event) +{ + if(108==event.code){ + if(event.value){ + henglong->velocity = 0b11111; + }else{ + henglong->velocity = 0b10000; + } + } + if(103==event.code){ + if(event.value){ + henglong->velocity = 0b00000; + }else{ + henglong->velocity = 0b10000; + } + } + if(105==event.code){ + if(event.value){ + henglong->direction = 0b00000; + }else{ + henglong->direction = 0b01111; + } + } + if(106==event.code){ + if(event.value){ + henglong->direction = 0b11111; + }else{ + henglong->direction = 0b01111; + } + } + if(23==event.code){ + if(event.value){ + henglong->ignation = 1; + }else{ + henglong->ignation = 0; + } + } + if(34==event.code){ + if(event.value){ + henglong->mg = 1; + }else{ + henglong->mg = 0; + } + } + if(33==event.code){ + if(event.value){ + henglong->fire = 1; + }else{ + henglong->fire = 0; + } + } + if(29==event.code){ + if(event.value){ + henglong->turret_left = 1; + }else{ + henglong->turret_left = 0; + } + } + if(20==event.code){ + if(event.value){ + henglong->turretelev = 1; + }else{ + henglong->turretelev = 0; + } + } + if(19==event.code){ + if(event.value){ + henglong->recoil = 1; + }else{ + henglong->recoil = 0; + } + } + + return values2data(henglong->velocity, henglong->direction, henglong->ignation, henglong->mg, henglong->fire, henglong->turretelev, henglong->turret_left, henglong->turret_right, henglong->recoil); +} + +typedef struct refl_thread_args_t +{ + int sockfd; + uint64_t timestamps[256]; + uint16_t frame_nbr_send; +} refl_thread_args_t; + + +uint64_t get_us(void) +{ + struct timeval tv; + gettimeofday(&tv,NULL); + return (uint64_t)tv.tv_usec + 1000000* (uint64_t)tv.tv_sec; +} + +void *refl_thread_fcn(void* arg) +{ + int n, i = 0; + int frame_refl; + uint64_t time_us_refl; + unsigned char recvline[64]; + uint16_t frame_nbr_refl; + refl_thread_args_t* refl_thread_args_ptr; + printf("pthread refl started\n"); + + refl_thread_args_ptr = (refl_thread_args_t*) arg; + + while(1){ + n=recvfrom(refl_thread_args_ptr->sockfd,recvline,64,0,NULL,NULL); + frame_nbr_refl = 0; + for(i=0;i<2;i++){ + frame_nbr_refl |= recvline[i] << i*8; + } + time_us_refl = 0ULL; + for(i=0;i<8;i++){ + time_us_refl |= ((uint64_t)recvline[i+2]) << i*8; + } + frame_refl = 0; + for(i=0;i<4;i++){ + frame_refl |= recvline[i+10] << i*8; + } + printf("REFL FRAME -- FRM_NBR: %5d, RTT: %7llu, BYTES recv: %3d, REFL_FRM: %#x\n", frame_nbr_refl, get_us() - time_us_refl, n, frame_refl); + refl_thread_args_ptr->timestamps[frame_nbr_refl&0x0F] = 0; + } + pthread_exit(0); +} + + int main(int argc, char* argv[]) { - pthread_t inpthread; + pthread_t inpthread, refl_thread; pthread_attr_t inp_thread_attr; input_thread_t input_thread_args; + refl_thread_args_t refl_thread_args; int inpdetachstate; int i=0; int frame; + uint16_t frame_nbr; + uint16_t frame_nbr_refl; int velocity = 0b10000, direction=0b01111; - int ignation = 0, mg = 0, fire = 0, turretelev = 0, turret_left = 0, turret_right = 0, recoil = 0, smoke = 0; + int ignation = 0, mg = 0, fire = 0, turretelev = 0, turret_left = 0, turret_right = 0, recoil = 0; + int sockfd,n, n_send; + struct sockaddr_in servaddr,cliaddr; + unsigned char sendline[64]; + unsigned char recvline[64]; + unsigned char tmpchr; + henglong_t hl1; + + uint64_t time_us, time_us_refl; + int frame_refl; + + inithenglong(&hl1); + input_thread_args.filename = argv[1]; @@ -114,82 +273,48 @@ int main(int argc, char* argv[]) if (pthread_create(&inpthread, &inp_thread_attr, input_thread_fcn , (void *) &input_thread_args)) printf("failed to create thread %d\n", i); + sockfd = socket(AF_INET,SOCK_DGRAM,0); + + refl_thread_args.sockfd = sockfd; + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr(argv[2]); + servaddr.sin_port=htons(32000); + + if (pthread_create(&refl_thread, NULL, refl_thread_fcn, (void *) &refl_thread_args)) printf("failed to create thread %d\n", i); + + memset(refl_thread_args.timestamps, 0, 256); + frame_nbr = 0; 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; - } + //printf("%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, input_thread_args.event.code, input_thread_args.event.value, input_thread_args.event.type, input_thread_args.event.time); + + frame = data2frame(event2data(&hl1, input_thread_args.event)); + time_us = get_us(); + frame_nbr++; + refl_thread_args.frame_nbr_send = frame_nbr; + if(refl_thread_args.timestamps[frame_nbr & 0x0F]) printf("*** Frameloss detected! Lost frame from local time: %llu \n", refl_thread_args.timestamps[frame_nbr & 0x0F]); + refl_thread_args.timestamps[frame_nbr & 0x0F] = time_us; + + for(i=0;i<2;i++){ + sendline[i] = (frame_nbr >> i*8) & 0xFF; } - if(103==input_thread_args.event.code){ - if(input_thread_args.event.value){ - velocity = 0b00000; - }else{ - velocity = 0b10000; - } + for(i=0;i<8;i++){ + sendline[i+2] = (time_us >> i*8) & 0xFF; } - 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; - } + for(i=0;i<4;i++){ + sendline[i+10] = (frame >> i*8) & 0xFF; } - frame = data2frame(values2data(velocity, direction, ignation, mg, fire, turretelev, turret_left, turret_right, recoil)); - printf("%#x\n", frame); + + n_send = sendto(sockfd, sendline, 16, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + + + + + printf("SEND FRAME -- FRM_NBR: %5d, BYTES send: %3d, SEND_FRM: %#x\n", frame_nbr, n_send, frame); if(pthread_kill(inpthread, 0)) break; } @@ -198,51 +323,3 @@ int main(int argc, char* argv[]) -/* 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 index a4543cba4d6ec18973f0e7993fdf219cd990ad53..59d9b784cd75f4cd624deafc2466ef26119895df 100644 GIT binary patch literal 16808 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 I!+E{^2Sh|BTL1t6