2 * \brief Implementace klienta pro UDP komunikaci.
4 * \author Martin Prudek
6 * Implementace klienta pro prijmani referencni pozice pro rizeni motoru.
7 * Pouziva protokol UDP.
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
23 #define NSEC_PER_SEC (1000000000) /* The number of nsecs per sec. */
28 * Funkce spusti sekvenci,
29 * ktera pravidelne aktualizuje pozici vzdaleneho moturu
32 void* start_reading_remote_position(void * param)
38 struct sockaddr_in my_addr, srv_addr;
45 int interval = 2000000; /*500hz*/
46 struct remote_pos_st *rpst=(struct remote_pos_st*)param;
51 /* create a UDP socket */
52 sockd = socket(AF_INET, SOCK_DGRAM, 0);
55 perror("Socket creation error");
60 /* Configure client address */
61 my_addr.sin_family = AF_INET;
62 my_addr.sin_addr.s_addr = INADDR_ANY;
65 bind(sockd, (struct sockaddr*)&my_addr, sizeof(my_addr));
67 /*inicializa bufferu*/
68 memset(buf,0,MAX_BUF);
72 srv_addr.sin_family = AF_INET;
73 inet_aton(ipbuff, &srv_addr.sin_addr);
74 srv_addr.sin_port = htons(port);
76 strcpy(code,"pr"); /*position request code */
78 clock_gettime(CLOCK_MONOTONIC ,&t);
80 /* wait until next shot */
81 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
83 sendto(sockd, code, delka, 0,(struct sockaddr*)&srv_addr, sizeof(srv_addr));
84 addrlen = sizeof(srv_addr);
85 count = recvfrom(sockd, buf, MAX_BUF, 0,(struct sockaddr*)&srv_addr, &addrlen);
87 sem_wait(rpst->semaphore);
89 sem_post(rpst->semaphore);
92 *rpst->rem_pos=*((int*)buf)*rpst->factor;
93 sem_post(rpst->semaphore);
95 /* calculate next shot */
96 t.tv_nsec += interval;
97 while (t.tv_nsec >= NSEC_PER_SEC) {
98 t.tv_nsec -= NSEC_PER_SEC;