-
Notifications
You must be signed in to change notification settings - Fork 6
/
freed_sender.c
132 lines (106 loc) · 3.65 KB
/
freed_sender.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <inttypes.h>
#include <limits.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include "instance.h"
#include "common/logger.h"
#include "common/FreeD.h"
void* freed_sender_proc(void* p)
{
FreeD_D1_t freed;
int r, i, freed_socket, freed_socket_broadcast = 1;
unsigned char buf_packet[FREE_D_D1_PACKET_SIZE];
instance_t* instance = (instance_t*)p;
struct sockaddr_in addrs[MAX_FREED_TARGETS];
logger_printf(0, "%s: Entering....", __FUNCTION__);
memset(addrs, 0, sizeof(addrs));
memset(&freed, 0, sizeof(FreeD_D1_t));
if(instance->freed.div < 1) instance->freed.div = 1;
/* init socket */
freed_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (freed_socket <= 0)
{
logger_printf(0, "%s: socket failed", __FUNCTION__);
return NULL;
};
setsockopt(freed_socket, SOL_SOCKET, SO_BROADCAST, &freed_socket_broadcast, sizeof(freed_socket_broadcast));
/* prepare addr struct */
for(i = 0; i < instance->freed.trgs; i++)
{
char *port, *host;
struct sockaddr_in *addr = &addrs[i];
if(!instance->freed.targets[i][0])
continue;
/* reset addr */
addr->sin_family = 0;
/* parse target */
host = strdup(instance->freed.targets[i]);
logger_printf(1, "%s: new target [%s]", __FUNCTION__, host);
port = strrchr(host, ':');
if(port)
{
memset(addr, 0, sizeof(struct sockaddr_in));
*port = 0; port++;
/* prepare address */
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr(host);
addr->sin_port = htons((unsigned short)atoi(port));
};
free(host);
};
/* main loop */
while(!(*instance->p_exit))
{
int Iris;
struct timespec to;
/* wait for tick */
pthread_mutex_lock(&instance->lock);
clock_gettime(CLOCK_REALTIME, &to);
to.tv_sec += 1;
r = pthread_cond_timedwait(&instance->cond, &instance->lock, &to);
pthread_mutex_unlock(&instance->lock);
instance->freed.cnt++;
if(instance->freed.cnt % instance->freed.div)
continue;
/* prepare struct */
Iris = instance->decoder.counters[2];
freed.Zoom = instance->decoder.counters[0];
freed.Focus = instance->decoder.counters[1];
freed.Spare[0] = (Iris >> 8) && 0x00FF;
freed.Spare[1] = (Iris >> 0) && 0x00FF;
freed.ID = instance->freed.id;
/* build packet */
FreeD_D1_pack(buf_packet, FREE_D_D1_PACKET_SIZE, &freed);
/* send packet to targets */
for(i = 0; i < MAX_FREED_TARGETS; i++)
{
struct sockaddr_in *addr = &addrs[i];
if(!addr->sin_family)
continue;
r = sendto
(
freed_socket, /* Socket to send result */
(char*)buf_packet, /* The datagram buffer */
sizeof(buf_packet), /* The datagram lngth */
0, /* Flags: no options */
(struct sockaddr *)addr , /* addr */
sizeof(struct sockaddr_in) /* Server address length */
);
if(r < 0)
{
r = errno;
logger_printf(1, "%s: sendto(%s) failed, r=%d", __FUNCTION__, instance->freed.targets[i], r);
};
};
};
close(freed_socket);
return NULL;
};