From 3b507ff03c55cc3ff0486f8cfd4f2f0c0d4c02a4 Mon Sep 17 00:00:00 2001 From: Stefan Helmert Date: Wed, 5 Feb 2014 06:43:14 +0100 Subject: [PATCH] client sends a structure, now with right, left, pan, tilt --- UDPclient.cbp | 8 ++++ UDPclient.depend | 6 +-- UDPclient.layout | 17 +++++++- bin/Debug/UDPclient | Bin 25615 -> 25143 bytes client.config | 2 +- henglong.c | 33 ++++++++++++++++ henglong.h | 2 +- main.c | 90 +++++++++++++++++++++++++++---------------- obj/Debug/henglong.o | Bin 7984 -> 7608 bytes obj/Debug/main.o | Bin 18056 -> 18104 bytes 10 files changed, 118 insertions(+), 40 deletions(-) diff --git a/UDPclient.cbp b/UDPclient.cbp index 7d087c6..fcc9514 100644 --- a/UDPclient.cbp +++ b/UDPclient.cbp @@ -31,6 +31,14 @@ + + + + + + + diff --git a/UDPclient.depend b/UDPclient.depend index c975b3b..979a97f 100644 --- a/UDPclient.depend +++ b/UDPclient.depend @@ -1,5 +1,5 @@ # depslib dependency file v1.0 -1389621137 source:/home/stefan/Proj/UDPclient/main.c +1391553490 source:/home/stefan/Proj/UDPclient/main.c @@ -21,10 +21,10 @@ "henglong.h" -1389212471 source:/home/stefan/Proj/UDPclient/henglong.c +1391557977 source:/home/stefan/Proj/UDPclient/henglong.c "henglong.h" -1389038543 /home/stefan/Proj/UDPclient/henglong.h +1391558168 /home/stefan/Proj/UDPclient/henglong.h diff --git a/UDPclient.layout b/UDPclient.layout index dfbb5ac..6c22ab7 100644 --- a/UDPclient.layout +++ b/UDPclient.layout @@ -1,9 +1,24 @@ + + + + + + + + + + + + + + + - + diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient index 7cefc08473479de9a6b9d052d3a74ed30ebf93c9..4d0af53e924ce7eefd94fbda467151a973ea9d93 100755 GIT binary patch literal 25143 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 literal 25615 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 = 0; henglong->clisel = 0; henglong->servoff = 0; + henglong->tilt_up = 0; + henglong->tilt_down = 0; + henglong->pan_left = 0; + henglong->pan_right = 0; + } @@ -58,6 +63,34 @@ int event2data(henglong_t* henglong, struct input_event event) henglong->servoff = 0; } } + if(17==event.code){ + if(event.value){ + henglong->tilt_up = 1; + }else{ + henglong->tilt_up = 0; + } + } + if(31==event.code){ + if(event.value){ + henglong->tilt_down = 1; + }else{ + henglong->tilt_down = 0; + } + } + if(30==event.code){ + if(event.value){ + henglong->pan_left = 1; + }else{ + henglong->pan_left = 0; + } + } + if(32==event.code){ + if(event.value){ + henglong->pan_right = 1; + }else{ + henglong->pan_right = 0; + } + } if(2<=event.code && 11>=event.code){ if(event.value){ henglong->clisel = (event.code - 1) % 10; diff --git a/henglong.h b/henglong.h index 9adf154..821b64f 100644 --- a/henglong.h +++ b/henglong.h @@ -9,7 +9,7 @@ typedef struct henglong_t { int velocity, direction; - int ignation, mg, fire, turretelev, turret_left, turret_right, recoil; + int ignation, mg, fire, turretelev, turret_left, turret_right, recoil, tilt_up, tilt_down, pan_left, pan_right; uint8_t clisel; unsigned char servoff; } henglong_t; diff --git a/main.c b/main.c index 04c9e50..aae9ab9 100644 --- a/main.c +++ b/main.c @@ -21,13 +21,33 @@ #include #include "henglong.h" +typedef struct outtty_t +{ + int16_t motor_r; + int16_t motor_l; + int16_t servo_tilt; + int16_t servo_pan; +} outtty_t; + typedef struct input_thread_t { char* filename; int frame; henglong_t hl; + outtty_t outtty; } input_thread_t; +typedef struct RCdatagram_t +{ + uint16_t frame_nbr; + uint64_t time_us; + int frame_recv; + uint8_t clisel; + uint8_t clinbr; + uint8_t client_selected; + unsigned char servoff; + outtty_t outtty; +} RCdatagram_t; void *input_thread_fcn(void * arg) { @@ -55,7 +75,18 @@ void *input_thread_fcn(void * arg) if(EV_KEY == ev.type) { printf("%d %d\n", ev.code, ev.value); args->frame = data2frame(event2data(&args->hl, ev)); - + args->outtty.motor_r = (2*0b01111 - args->hl.velocity - args->hl.direction)*40; + args->outtty.motor_l = (- args->hl.velocity + args->hl.direction)*40; + args->outtty.servo_pan += args->hl.pan_left - args->hl.pan_right; + if(args->outtty.servo_pan>50) args->outtty.servo_pan = 50; + if(args->outtty.servo_pan<-50) args->outtty.servo_pan = -50; + if(args->outtty.servo_tilt>50) args->outtty.servo_tilt = 50; + if(args->outtty.servo_tilt<-50) args->outtty.servo_tilt = -50; + args->outtty.servo_tilt += args->hl.tilt_up - args->hl.tilt_down; + if(args->hl.ignation) { + args->outtty.servo_pan = 0; + args->outtty.servo_tilt= 0; + } } // quit if(16==ev.code && 1==ev.value) break; @@ -87,14 +118,14 @@ uint64_t get_us(void) void *refl_thread_fcn(void* arg) { - int n, i = 0; + int n; 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; uint8_t clinbr, clisel; unsigned char servoff; + RCdatagram_t refldata; printf("pthread refl started\n"); @@ -102,22 +133,19 @@ void *refl_thread_fcn(void* arg) 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; - } - clinbr = recvline[14]; - clisel = recvline[15]; - servoff = recvline[16]; + n=recvfrom(refl_thread_args_ptr->sockfd,&refldata,64,0,NULL,NULL); + + + frame_nbr_refl = refldata.frame_nbr; + + time_us_refl = refldata.time_us; + + + frame_refl = refldata.frame_recv; + + clinbr = refldata.clinbr; + clisel = refldata.clisel; + servoff = refldata.servoff; printf("REFL FRAME -- FRM_NBR: %5d, RTT: %7" PRIu64 ", BYTES recv: %3d, REFL_FRM: %#x, CLINBR: %d, CLISEL: %d, SERVOFF: %d\n", frame_nbr_refl, get_us() - time_us_refl, n, frame_refl, clinbr, clisel, servoff); refl_thread_args_ptr->timestamps[frame_nbr_refl % refl_thread_args_ptr->timeout] = 0; } @@ -178,14 +206,13 @@ int main(int argc, char* argv[]) pthread_t inpthread, refl_thread; input_thread_t input_thread_args; refl_thread_args_t refl_thread_args; - int i=0; int frame = 0; uint16_t frame_nbr; int sockfd, n_send; struct sockaddr_in servaddr; - unsigned char sendline[64]; uint64_t time_us; henglongconf_t conf; + RCdatagram_t senddata; if(2!=argc){ @@ -228,20 +255,15 @@ int main(int argc, char* argv[]) if(refl_thread_args.timestamps[frame_nbr % conf.timeout]) printf("*** Frameloss detected! Lost frame from local time: %" PRIu64 "\n", refl_thread_args.timestamps[frame_nbr % conf.timeout]); refl_thread_args.timestamps[frame_nbr % conf.timeout] = time_us; - for(i=0;i<2;i++){ - sendline[i] = (frame_nbr >> i*8) & 0xFF; - } - for(i=0;i<8;i++){ - sendline[i+2] = (time_us >> i*8) & 0xFF; - } - for(i=0;i<4;i++){ - sendline[i+10] = (frame >> i*8) & 0xFF; - } - sendline[14] = conf.clinbr; - sendline[15] = input_thread_args.hl.clisel; - sendline[16] = input_thread_args.hl.servoff; + senddata.frame_nbr = frame_nbr; + senddata.time_us = time_us; + senddata.frame_recv = frame; + senddata.clinbr = conf.clinbr; + senddata.clisel = input_thread_args.hl.clisel; + senddata.servoff = input_thread_args.hl.servoff; + senddata.outtty = input_thread_args.outtty; - n_send = sendto(sockfd, sendline, 32, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + n_send = sendto(sockfd, &senddata, sizeof(senddata), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); printf("SEND FRAME -- FRM_NBR: %5d, BYTES send: %3d, SEND_FRM: %#x, CLINBR: %d, CLISEL: %d, SERVOFF: %d\n", frame_nbr, n_send, frame, conf.clinbr, input_thread_args.hl.clisel, input_thread_args.hl.servoff); if(pthread_kill(inpthread, 0)) break; diff --git a/obj/Debug/henglong.o b/obj/Debug/henglong.o index 3e97257a416246d82b2b747476bc5242dbbe0cf6..4bba9fee5d738588c7d06e7eed55482c426e7207 100644 GIT binary patch literal 7608 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 DBOP*m literal 7984 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 Ss^PpoPii>V|Gb8C{r?MVG!<9? diff --git a/obj/Debug/main.o b/obj/Debug/main.o index aea1af8ee13f2b5188c148d4179f8a8d39914df5..27790d11693ddc581d61fa60ea0cddf4c6e89f2f 100644 GIT binary patch literal 18104 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 literal 18056 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 qWV{3gAG=ZT&^>>D!7~%_bIr{pZ@{2vs#4!