client event reading and UDP operation ready - checking reflected frame and detecting frameloss

This commit is contained in:
Stefan Helmert 2014-01-05 16:34:00 +01:00
parent 39f0566283
commit b29d631668
4 changed files with 200 additions and 123 deletions

View File

@ -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
<pthread.h>
<stdio.h>
<stdlib.h>

Binary file not shown.

321
main.c
View File

@ -14,7 +14,8 @@
#include <sys/time.h>
#include <termios.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
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 <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
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 <IP address>\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);
}
}
*/

Binary file not shown.