Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
336 | f9daq | 1 | /* |
2 | * server.c |
||
3 | * |
||
4 | * Created on: 18. dec. 2018 |
||
5 | * Author: Domen |
||
6 | */ |
||
7 | |||
8 | #include "server.h" |
||
9 | //#include "data_handling.h" je ze definiran v server.h |
||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | /*-------------------------------PUBLIC FUNCTIONS----------------------------------*/ |
||
19 | |||
20 | int Server_init(int *server_info) |
||
21 | { |
||
22 | |||
23 | int sock_server; |
||
24 | int sock_client; |
||
25 | int enable = 1; |
||
26 | struct sockaddr_in addr; |
||
27 | |||
28 | |||
29 | |||
30 | |||
31 | |||
32 | if ( (sock_server = socket(AF_INET, SOCK_STREAM, 0)) < 0) //create an endpoint for communication |
||
33 | { |
||
34 | perror ("ERROR:socket"); |
||
35 | return EXIT_FAILURE; |
||
36 | } |
||
37 | |||
38 | |||
39 | setsockopt(sock_server, SOL_SOCKET, SO_REUSEADDR, (void *)&enable, sizeof(enable)); //set the socket options |
||
40 | |||
41 | //setup listening address (setup server address v flowchartu) |
||
42 | memset(&addr, 0, sizeof(addr)); //copy 0 to the first sizeof(addr) characters of the string, pointet by the &addr |
||
43 | addr.sin_family = AF_INET; |
||
44 | addr.sin_addr.s_addr = htonl(INADDR_ANY); //poslusaj na vseh IP naslovih //htonl converts the unsinged int hostlong from host byte order to netword byte order |
||
45 | addr.sin_port = htons(1001); //Red pitaya port = 1001; //htons je isto kot htonl, samo da za short integerje |
||
46 | |||
47 | |||
48 | if (bind(sock_server, (struct sockaddr *)&addr, sizeof(addr)) < 0) //bind poveze ustvarjen socket (sock_server) z naslovom (stvar pod komentarjem setup listening address) |
||
49 | { |
||
50 | perror("ERROR:bind"); |
||
51 | return EXIT_FAILURE; |
||
52 | } |
||
53 | |||
54 | listen(sock_server,1024); //poskusa vzpostaviti povezavo, to naredi 1024x. |
||
55 | printf("Listening on port 1001 ... \n"); |
||
56 | |||
57 | |||
58 | |||
59 | if( (sock_client = accept(sock_server, NULL, NULL)) < 0) |
||
60 | { |
||
61 | perror("ERROR: accept"); |
||
62 | return EXIT_FAILURE; |
||
63 | } |
||
64 | |||
65 | else |
||
66 | { |
||
67 | |||
68 | server_info[0] = sock_server; //zlozim podatke o serverju v tabelo |
||
69 | server_info[1] = sock_client; |
||
70 | printf("Server_init funcija pride do konca. Vrne sock client:%d",sock_client); |
||
71 | |||
72 | return 0; |
||
73 | |||
74 | |||
75 | } |
||
76 | |||
77 | |||
78 | } |
||
79 | |||
80 | |||
81 | |||
82 | |||
83 | void Server_comm(int* server_info, HW_system *strct, int status) |
||
84 | { |
||
85 | int bytes_rec; |
||
86 | uint32_t data_from_PC; |
||
87 | uint32_t data_for_PC; |
||
88 | |||
89 | int Server_ID = server_info[0]; |
||
90 | int Client_ID = server_info[1]; |
||
91 | |||
92 | int sent = 0; //za test |
||
93 | static int do_it_once = 0; |
||
94 | |||
95 | |||
96 | //PREJEMANJE PODATKOV OD PC-JA: |
||
97 | bytes_rec = recv(Client_ID, &data_from_PC, 4, MSG_DONTWAIT); // vpise prejete podatke v data_from_PC in vrne, kolk bajtov je prejel v bytes_rec |
||
98 | |||
99 | if (bytes_rec == 4) //vpis prejetih podatkov v strukturo |
||
100 | { |
||
101 | |||
102 | (strct -> start) = data_from_PC & START_MASK; |
||
103 | (strct -> reset) = (data_from_PC & RESET_MASK) >> 1; |
||
104 | (strct -> HW_config_flag) = (data_from_PC & HW_CONFIG_MASK) >> 2; |
||
105 | (strct -> send_data_flag) = (data_from_PC & SEND_DATA_MASK) >> 3; |
||
106 | (strct -> disconnect_flag) = (data_from_PC & DISCONNECT_MASK) >> 4; |
||
107 | (strct -> threshold) = (data_from_PC & THRESHOLD_MASK) >> 8; |
||
108 | (strct -> acq_window) = (data_from_PC & ACQ_WINDOW_MASK) >> 19; |
||
109 | (strct -> sw_trigger) = (data_from_PC & SW_TRIGGER_MASK) >> 27; |
||
110 | |||
111 | //za test |
||
112 | //printf("Podatki, prejeti od PC-ja: 0x%08x\n",data_from_PC); |
||
113 | } |
||
114 | |||
115 | else |
||
116 | { |
||
117 | //printf("Ni blo 4 bajtov, prislo je %d bajtov.\n", bytes_rec); |
||
118 | } |
||
119 | |||
120 | |||
121 | //------------------------------NOTIFICATIONS ZA TEST------------------------------------------------- |
||
122 | if((strct -> reset)==1) printf("Sistem RESET\n"); |
||
123 | |||
124 | //----------------------------------------------------------------------------------------------------- |
||
125 | |||
126 | //POSILJANJE PODATKOV V PC: |
||
127 | if ( ((strct -> send_data_flag) == 1) && (status == 2) ) |
||
128 | { |
||
129 | data_for_PC = ( (strct -> hist_data) << 8 ) | ( (strct -> UC_rd_en_current) << 1 ) | (strct -> UC_rd_en_final); |
||
130 | sent = send(Client_ID,&data_for_PC, 4, MSG_NOSIGNAL); //&data_for_PC |
||
131 | printf("Poslano %d bajtov.\n",sent); |
||
132 | |||
133 | //ko pride final histogram, ugasni prejemanje, da ga potem PC spet zazene in se ne prehiteva |
||
134 | if ( (strct -> UC_rd_en_final) == 1 && do_it_once == 0) |
||
135 | { |
||
136 | (strct -> send_data_flag) = 0; |
||
137 | //printf("Poslan prvi podatek koncnega histograma. Ugasam posiljanje!"); |
||
138 | do_it_once = 1; |
||
139 | } |
||
140 | |||
141 | else if ((strct -> UC_rd_en_current == 1)) |
||
142 | { |
||
143 | do_it_once = 0; |
||
144 | } |
||
145 | } |
||
146 | |||
147 | //TODO: zapiranje serverja in clienta |
||
148 | if ((strct -> disconnect_flag) == 1) |
||
149 | { |
||
150 | close(Client_ID); |
||
151 | close(Server_ID); |
||
152 | } |
||
153 | |||
154 | |||
155 | } |
||
156 | |||
157 |