diff --git a/UDPclient.depend b/UDPclient.depend index 76cf40b..cb8f3ad 100644 --- a/UDPclient.depend +++ b/UDPclient.depend @@ -176,10 +176,10 @@ 1395878369 source:/home/chch/HengLongUDPclient/checkvideo.c "checkvideo.h" -1396205007 source:/home/chch/HengLongUDPclient/checkkillswitch.c +1396457823 source:/home/chch/HengLongUDPclient/checkkillswitch.c "checkkillswitch.h" -1396202748 /home/chch/HengLongUDPclient/checkkillswitch.h +1396457833 /home/chch/HengLongUDPclient/checkkillswitch.h diff --git a/bin/Debug/UDPclient b/bin/Debug/UDPclient index bc4f90a..e4e36cf 100755 Binary files a/bin/Debug/UDPclient and b/bin/Debug/UDPclient differ diff --git a/bin/Release/UDPclient b/bin/Release/UDPclient index 802f78d..f5f6976 100755 Binary files a/bin/Release/UDPclient and b/bin/Release/UDPclient differ diff --git a/checkkillswitch.c b/checkkillswitch.c index 113406c..27f3b6b 100644 --- a/checkkillswitch.c +++ b/checkkillswitch.c @@ -2,12 +2,15 @@ #include "checkkillswitch.h" -int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size) +int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size, uint32_t timeout_us) { int sockfd = 0, n = 0; //char recvBuff[1024]; char sendBuff[1024]; struct sockaddr_in serv_addr; + struct timeval timeout; + timeout.tv_sec = timeout_us/1000000; + timeout.tv_usec = timeout_us; memset(recvBuffer, '0',size); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) @@ -27,6 +30,9 @@ int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size) return 1; } + if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) printf("setsockopt failed\n"); + if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) printf("setsockopt failed\n"); + if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\n Error : Connect Failed \n"); @@ -48,12 +54,12 @@ int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size) return n; } -int checkkillswitch(char* ip, uint16_t port, char* url) +int checkkillswitch(char* ip, uint16_t port, char* url, uint32_t timeout_us) { char rb[1024]; int n; if(0==ip[0]) return 1; - getPage(ip, port, url, rb, sizeof(rb)); + getPage(ip, port, url, rb, sizeof(rb), timeout_us); n = strstr(rb, "true"); if(NULL != n) return 1; return 0; diff --git a/checkkillswitch.h b/checkkillswitch.h index ce62b0c..f61840f 100644 --- a/checkkillswitch.h +++ b/checkkillswitch.h @@ -9,7 +9,7 @@ #include -int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size); -int checkkillswitch(char* ip, uint16_t port, char* url); +int getPage(char* ip, uint16_t port, char* url, char* recvBuffer, uint32_t size, uint32_t timeout_us); +int checkkillswitch(char* ip, uint16_t port, char* url, uint32_t timeout_us); #endif // CHECKKILLSWITCH_H_INCLUDED diff --git a/client.config b/client.config index 860067a..1b6e035 100644 --- a/client.config +++ b/client.config @@ -10,3 +10,4 @@ TIMEOUT 250 CLINBR 0 VIDEO 192.168.1.66:8080 KILLSW 192.168.1.20:8080/status +KILLSWTO_US 600000 diff --git a/main.c b/main.c index 11ac457..77a97f4 100644 --- a/main.c +++ b/main.c @@ -275,6 +275,7 @@ typedef struct henglongconf_t uint16_t port, videoport, killport; uint8_t timeout; uint8_t clinbr; + uint32_t killswtimeoutus; } henglongconf_t; henglongconf_t getconfig(char* conffilename) @@ -302,6 +303,7 @@ henglongconf_t getconfig(char* conffilename) conf.killsw[0] = 0; conf.killport = 0; conf.killurl[0] = 0; + conf.killswtimeoutus = 500000; while(fgets(line, 256, configFile)){ sscanf(line, "%16s %256s", parameter, value); if(0==strcmp(parameter,"KEYBOARD")){ @@ -341,6 +343,9 @@ henglongconf_t getconfig(char* conffilename) if(0==strcmp(parameter,"KILLSW")){ sscanf(value, "%16[^:]:%" SCNu16 "%256s", conf.killsw, &conf.killport, conf.killurl); } + if(0==strcmp(parameter,"KILLSWTO_US")){ + sscanf(value, "%" SCNu32 , &conf.killswtimeoutus); + } } return conf; } @@ -380,14 +385,37 @@ void *cam_ctrl_thread_fcn(void* arg) } +typedef struct killsw_thread_t +{ + char* ip; + uint16_t port; + char* url; + uint32_t timeout_us; + int state; +} killsw_thread_t; + +void *killsw_thread_fcn(void* arg) +{ + printf("pthread killsw started\n"); + killsw_thread_t* args; + args = (killsw_thread_t*) arg; + args->state = 0; + while(1){ + args->state = checkkillswitch(args->ip, args->port, args->url, args->timeout_us); + } + pthread_exit(0); +} + + int main(int argc, char* argv[]) { - pthread_t keybthread, joythread, refl_thread, cam_ctrl_thread; + pthread_t keybthread, joythread, refl_thread, cam_ctrl_thread, killsw_thread; input_thread_t keyboard_thread_args; input_thread_t joystick_thread_args; refl_thread_args_t refl_thread_args; + killsw_thread_t killsw_thread_args; cam_ctrl_thread_t cam_ctrl_thread_args; int frame = 0; uint16_t frame_nbr; @@ -438,7 +466,17 @@ int main(int argc, char* argv[]) }else{ printf("no cam config!\n"); } - + killsw_thread_args.state = 1; // default, wenn kein Killswitch konfiguriert - immer an + if(conf.killsw[0]){ + killsw_thread_args.ip = conf.killsw; + killsw_thread_args.port = conf.killport; + killsw_thread_args.url = conf.killurl; + killsw_thread_args.state = 0; + killsw_thread_args.timeout_us = conf.killswtimeoutus; + if (pthread_create(&killsw_thread, NULL, killsw_thread_fcn , (void *) &killsw_thread_args)) printf("failed to create killsw thread\n"); + }else{ + printf("no killswitch!\n"); + } sockfd = socket(AF_INET,SOCK_DGRAM,0); @@ -466,7 +504,7 @@ int main(int argc, char* argv[]) printf("No video stream connection from %s:%u, remote control locked!\n", conf.video, conf.videoport); continue; } - if(0==checkkillswitch(conf.killsw,conf.killport,conf.killurl)){ + if(0==killsw_thread_args.state){ printf("Killswitch pressed or no connection.!\n"); continue; } diff --git a/obj/Debug/checkkillswitch.o b/obj/Debug/checkkillswitch.o index 7df0507..990f6c6 100644 Binary files a/obj/Debug/checkkillswitch.o and b/obj/Debug/checkkillswitch.o differ diff --git a/obj/Debug/main.o b/obj/Debug/main.o index 1189207..5508578 100644 Binary files a/obj/Debug/main.o and b/obj/Debug/main.o differ diff --git a/obj/Release/checkkillswitch.o b/obj/Release/checkkillswitch.o index eddff93..af98f31 100644 Binary files a/obj/Release/checkkillswitch.o and b/obj/Release/checkkillswitch.o differ diff --git a/obj/Release/main.o b/obj/Release/main.o index 5949939..694373b 100644 Binary files a/obj/Release/main.o and b/obj/Release/main.o differ