From 85e30d3d43c7c0a4c65e557cd4ff768588558a1b Mon Sep 17 00:00:00 2001 From: chch Date: Sun, 16 Feb 2014 04:36:01 +0100 Subject: [PATCH] added joystick support --- UDPclient.cbp | 1 + UDPclient.depend | 31 +++++++++ UDPclient.layout | 24 +++---- bin/Debug/UDPclient | Bin 25143 -> 25226 bytes client.config | 5 +- main.c | 157 +++++++++++++++++++++++++++++++++++-------- obj/Debug/henglong.o | Bin 7608 -> 7144 bytes obj/Debug/main.o | Bin 18104 -> 19816 bytes 8 files changed, 173 insertions(+), 45 deletions(-) diff --git a/UDPclient.cbp b/UDPclient.cbp index fcc9514..ff84ddc 100644 --- a/UDPclient.cbp +++ b/UDPclient.cbp @@ -29,6 +29,7 @@ + diff --git a/UDPclient.depend b/UDPclient.depend index 979a97f..2e47e21 100644 --- a/UDPclient.depend +++ b/UDPclient.depend @@ -29,3 +29,34 @@ +1392499886 source:/home/chch/HengLongUDPclient/main.c + + + + + + + + + + + + + + + + + + + + "henglong.h" + + +1392494240 /home/chch/HengLongUDPclient/henglong.h + + + + +1392494235 source:/home/chch/HengLongUDPclient/henglong.c + "henglong.h" + diff --git a/UDPclient.layout b/UDPclient.layout index 6c22ab7..e481d70 100644 --- a/UDPclient.layout +++ b/UDPclient.layout @@ -1,24 +1,16 @@ - - - - + + - - - - + + - - - - + + - - - - + + diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient index 4d0af53e924ce7eefd94fbda467151a973ea9d93..6e3527b1ed63191ba792ac49d65f91f893b2fcc3 100755 GIT binary patch literal 25226 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 literal 25143 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 diff --git a/client.config b/client.config index b11e9ae..bc98dfa 100644 --- a/client.config +++ b/client.config @@ -1,5 +1,6 @@ -INPUTDEV /dev/input/event2 +KEYBOARD /dev/input/event2 +JOYSTICK /dev/input/js0 FRAME_US 100000 -SERVER 127.0.0.1:32000 +SERVER 10.8.212.200:32000 TIMEOUT 250 CLINBR 0 diff --git a/main.c b/main.c index aae9ab9..be2d3c0 100644 --- a/main.c +++ b/main.c @@ -20,6 +20,7 @@ #define __STDC_FORMAT_MACROS #include #include "henglong.h" +#include typedef struct outtty_t { @@ -37,33 +38,41 @@ typedef struct input_thread_t outtty_t outtty; } input_thread_t; +void initouttty(outtty_t* tty) +{ + tty->motor_l = 0; + tty->motor_r = 0; + tty->servo_pan = 0; + tty->servo_tilt = 0; +} + typedef struct RCdatagram_t { uint16_t frame_nbr; uint64_t time_us; - int frame_recv; + int32_t frame_recv; uint8_t clisel; uint8_t clinbr; uint8_t client_selected; - unsigned char servoff; + uint8_t servoff; outtty_t outtty; -} RCdatagram_t; +} __attribute__ ((packed)) RCdatagram_t; -void *input_thread_fcn(void * arg) +void *keyboard_thread_fcn(void * arg) { printf("pthread input started\n"); struct input_event ev; int fevdev; - int size = sizeof(struct input_event); + int size = sizeof(ev); int rd; 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); + printf("Failed to open keyboard device.\n"); + pthread_exit(0); } while (1) @@ -92,7 +101,7 @@ void *input_thread_fcn(void * arg) if(16==ev.code && 1==ev.value) break; } - printf("Exiting input thread.\n"); + printf("Exiting keyboard thread.\n"); ioctl(fevdev, EVIOCGRAB, 1); close(fevdev); @@ -100,6 +109,75 @@ void *input_thread_fcn(void * arg) } +void *joystick_thread_fcn(void * arg) +{ + printf("pthread input started\n"); + + struct js_event ev; + struct JS_DATA_TYPE jsdata; + int fevdev; + int size = sizeof(ev); + int rd; + outtty_t outttyloc; + input_thread_t* args; + + args = (input_thread_t*) arg; + fevdev = open(args->filename, O_RDONLY); + if (fevdev == -1) { + printf("Failed to open joystick device.\n"); + pthread_exit(0); + } + + jsdata.x = 0; + jsdata.y = 0; + jsdata.buttons = 0; + + while (1) + { + if ((rd = read(fevdev, &ev, size)) < size) { + break; + } + + if(JS_EVENT_BUTTON == ev.type) { + //printf("%d %d %d\n", ev.type, ev.value, ev.number); + if(1==ev.value){ + jsdata.buttons |= 1<outttyloc.motor_r) outttyloc.motor_r = -1023; + if(1022outttyloc.motor_l) outttyloc.motor_l = -1023; + + args->outtty = outttyloc; + + printf("%6d %6d %4x\n", jsdata.x, jsdata.y, jsdata.buttons); + } + + printf("Exiting joystick thread.\n"); + close(fevdev); + + pthread_exit(0); +} + + typedef struct refl_thread_args_t { int sockfd; @@ -133,7 +211,7 @@ void *refl_thread_fcn(void* arg) refl_thread_args_ptr = (refl_thread_args_t*) arg; while(1){ - n=recvfrom(refl_thread_args_ptr->sockfd,&refldata,64,0,NULL,NULL); + n=recvfrom(refl_thread_args_ptr->sockfd,&refldata,sizeof(refldata),0,NULL,NULL); frame_nbr_refl = refldata.frame_nbr; @@ -155,7 +233,8 @@ void *refl_thread_fcn(void* arg) typedef struct henglongconf_t { uint32_t frame_us; - char inpdevname[256]; + char keyboarddevname[256]; + char joystickdevname[256]; in_addr_t ip; // v4 only uint16_t port; uint8_t timeout; @@ -174,14 +253,18 @@ henglongconf_t getconfig(char* conffilename) // defaults conf.timeout = 16; conf.frame_us = 100000; - strcpy(conf.inpdevname, "/dev/input/event2"); conf.port = 32000; conf.ip = inet_addr("127.0.0.1"); + conf.keyboarddevname[0] = 0; + conf.joystickdevname[0] = 0; while(fgets(line, 256, configFile)){ sscanf(line, "%16s %256s", parameter, value); - if(0==strcmp(parameter,"INPUTDEV")){ - sscanf(value, "%256s", conf.inpdevname); + if(0==strcmp(parameter,"KEYBOARD")){ + sscanf(value, "%256s", conf.keyboarddevname); + } + if(0==strcmp(parameter,"JOYSTICK")){ + sscanf(value, "%256s", conf.joystickdevname); } if(0==strcmp(parameter,"FRAME_US")){ sscanf(value, "%" SCNu32 , &conf.frame_us); @@ -203,8 +286,9 @@ henglongconf_t getconfig(char* conffilename) int main(int argc, char* argv[]) { - pthread_t inpthread, refl_thread; - input_thread_t input_thread_args; + pthread_t keybthread, joythread, refl_thread; + input_thread_t keyboard_thread_args; + input_thread_t joystick_thread_args; refl_thread_args_t refl_thread_args; int frame = 0; uint16_t frame_nbr; @@ -214,21 +298,31 @@ int main(int argc, char* argv[]) henglongconf_t conf; RCdatagram_t senddata; - if(2!=argc){ printf("\nThis program is intented to be run on the PC as client to control the server on the heng long tank. \n\n USAGE: UDPclient client.config\n\n Copyright (C) 2014 Stefan Helmert \n\n"); return 0; } - inithenglong(&input_thread_args.hl); + inithenglong(&keyboard_thread_args.hl); + initouttty(&keyboard_thread_args.outtty); + inithenglong(&joystick_thread_args.hl); + initouttty(&joystick_thread_args.outtty); conf = getconfig(argv[1]); - input_thread_args.filename = conf.inpdevname; - - - if (pthread_create(&inpthread, NULL, input_thread_fcn , (void *) &input_thread_args)) printf("failed to create thread\n"); + joystick_thread_args.filename = conf.joystickdevname; + keyboard_thread_args.filename = conf.keyboarddevname; + if(keyboard_thread_args.filename[0]){ + if (pthread_create(&keybthread, NULL, keyboard_thread_fcn , (void *) &keyboard_thread_args)) printf("failed to create keyboard thread\n"); + }else{ + printf("no keyboard!\n"); + } + if(joystick_thread_args.filename[0]){ + if (pthread_create(&joythread, NULL, joystick_thread_fcn , (void *) &joystick_thread_args)) printf("failed to create joystick thread\n"); + }else{ + printf("no joystick!\n"); + } sockfd = socket(AF_INET,SOCK_DGRAM,0); @@ -247,7 +341,7 @@ int main(int argc, char* argv[]) while(1){ usleep(conf.frame_us); - frame = input_thread_args.frame; + frame = 0xc0ffee; time_us = get_us(); frame_nbr++; @@ -259,14 +353,23 @@ int main(int argc, char* argv[]) 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; + senddata.clisel = keyboard_thread_args.hl.clisel; + senddata.servoff = keyboard_thread_args.hl.servoff; + + senddata.outtty.motor_l = keyboard_thread_args.outtty.motor_l + joystick_thread_args.outtty.motor_l; + senddata.outtty.motor_r = keyboard_thread_args.outtty.motor_r + joystick_thread_args.outtty.motor_r; + senddata.outtty.servo_pan = keyboard_thread_args.outtty.servo_pan + joystick_thread_args.outtty.servo_pan; + senddata.outtty.servo_tilt = keyboard_thread_args.outtty.servo_tilt + joystick_thread_args.outtty.servo_tilt; + + if(1022senddata.outtty.motor_l) senddata.outtty.motor_l = -1023; + if(1022senddata.outtty.motor_r) senddata.outtty.motor_r = -1023; 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; + printf("SEND FRAME -- FRM_NBR: %5d, BYTES send: %3d, SEND_FRM: %#x, CLINBR: %d, CLISEL: %d, SERVOFF: %d\n", frame_nbr, n_send, frame, senddata.clinbr, senddata.clisel, senddata.servoff); + if(pthread_kill(keybthread, 0)) break; } return 0; diff --git a/obj/Debug/henglong.o b/obj/Debug/henglong.o index 4bba9fee5d738588c7d06e7eed55482c426e7207..5c890b8979f9c73147000f34a4ea99c57999d189 100644 GIT binary patch literal 7144 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 literal 7608 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 DBOP*m diff --git a/obj/Debug/main.o b/obj/Debug/main.o index 27790d11693ddc581d61fa60ea0cddf4c6e89f2f..5cb1cab7e6fbf662dfc6aa5f807f74f8bdb52cab 100644 GIT binary patch literal 19816 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