]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/test_sw/udp_cli.c
Correct typo in rpi-mc-1 mapping to Ti AM437x based RICO board.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / udp_cli.c
1 /**
2  * \brief Implementace klienta pro UDP komunikaci.
3  * \file udp_cli.c
4  * \author Martin Prudek
5  * 
6  *      Implementace klienta pro prijmani referencni pozice pro rizeni motoru.
7  *      Pouziva protokol UDP.
8  */
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
13 #include <string.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <time.h>
17 #include <unistd.h>
18
19 #include "udp_cli.h"
20
21
22 #define MAX_BUF 1400
23 #define NSEC_PER_SEC    (1000000000) /* The number of nsecs per sec. */
24
25
26 /**
27  * 
28  * Funkce spusti sekvenci,
29  * ktera pravidelne aktualizuje pozici vzdaleneho moturu
30  * port 45789 
31  */
32 void* start_reading_remote_position(void * param)
33 {
34
35         char* ipbuff;
36         int delka;
37         int sockd;
38         struct sockaddr_in my_addr, srv_addr;
39         char buf[MAX_BUF];
40         char code[MAX_BUF];
41         int count;
42         int addrlen;
43         int port=45789;
44         struct timespec t;
45         int interval = 2000000; /*500hz*/
46         struct remote_pos_st *rpst=(struct remote_pos_st*)param;
47         
48
49         ipbuff=rpst->ip;
50   
51         /* create a UDP socket */
52         sockd = socket(AF_INET, SOCK_DGRAM, 0);
53         if (sockd == -1)
54         {
55                 perror("Socket creation error");
56                 exit(1);
57         }
58
59
60         /* Configure client address */
61         my_addr.sin_family = AF_INET;
62         my_addr.sin_addr.s_addr = INADDR_ANY;
63         my_addr.sin_port = 0;
64
65         bind(sockd, (struct sockaddr*)&my_addr, sizeof(my_addr));
66
67         /*inicializa bufferu*/
68         memset(buf,0,MAX_BUF);
69         buf[MAX_BUF-1]='\0';
70
71         /* server address */
72         srv_addr.sin_family = AF_INET;
73         inet_aton(ipbuff, &srv_addr.sin_addr);
74         srv_addr.sin_port = htons(port);
75         
76         strcpy(code,"pr"); /*position request code */
77         delka=strlen(code)+1;
78         clock_gettime(CLOCK_MONOTONIC ,&t);
79         while(1){  
80                 /* wait until next shot */
81                 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
82
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);
86
87                 sem_wait(rpst->semaphore);
88                 if (rpst->stop){
89                         sem_post(rpst->semaphore);
90                         break;
91                 }
92                 *rpst->rem_pos=*((int*)buf)*rpst->factor;
93                 sem_post(rpst->semaphore);
94
95                 /* calculate next shot */
96                 t.tv_nsec += interval;
97                 while (t.tv_nsec >= NSEC_PER_SEC) {
98                         t.tv_nsec -= NSEC_PER_SEC;
99                         t.tv_sec++;
100
101                 }
102         }
103         close(sockd);
104         return (void *)0;
105 }
106