Stefan Schuermans commited on 2016-12-21 09:47:41
Showing 3 changed files, with 73 additions and 8 deletions.
... | ... |
@@ -49,6 +49,7 @@ typedef struct flp_distri_s { |
49 | 49 |
unsigned int distri; /**< number of this distributor */ |
50 | 50 |
unsigned int output_cnt; /**< number of outputs of this distributor */ |
51 | 51 |
unsigned int pixel_cnt; /**< number of pixels connected to every output */ |
52 |
+ struct sockaddr_in addr; /**< network address of distributor */ |
|
52 | 53 |
flp_mapping_t mapping[3]; /**< mapping information for red, green |
53 | 54 |
* and blue channel */ |
54 | 55 |
flp_pixel_t *p_pixels; /**< array with information about pixels |
... | ... |
@@ -108,6 +108,11 @@ int flp_config_proc_distri(flp_config_ctx_t *p_ctx, char *p_setting_part2, |
108 | 108 |
p_distri->distri = distri; |
109 | 109 |
p_distri->output_cnt = out; |
110 | 110 |
p_distri->pixel_cnt = pix; |
111 |
+ /* initialize address to default */ |
|
112 |
+ p_distri->addr.sin_family = AF_INET; |
|
113 |
+ p_distri->addr.sin_addr.s_addr = htonl(FLP_DEST_IP_BASE + |
|
114 |
+ p_distri->distri * FLP_DEST_IP_STEP); |
|
115 |
+ p_distri->addr.sin_port = htons(FLP_DEST_PORT); |
|
111 | 116 |
/* initialize mapping information */ |
112 | 117 |
for (i = 0; i < 3; i++) { |
113 | 118 |
p_distri->mapping[i].base = 0.0; |
... | ... |
@@ -151,6 +156,68 @@ int flp_config_proc_distri(flp_config_ctx_t *p_ctx, char *p_setting_part2, |
151 | 156 |
return 0; |
152 | 157 |
} |
153 | 158 |
|
159 |
+/** |
|
160 |
+ * \brief process distributor address from config file |
|
161 |
+ * |
|
162 |
+ * \param[in,out] p_ctx context information |
|
163 |
+ * \param[in] p_setting_part2 second half of setting to process |
|
164 |
+ * \param[in] p_value value of setting |
|
165 |
+ * \return 0 in case of success, -1 in case of error |
|
166 |
+ */ |
|
167 |
+int flp_config_proc_distri_addr(flp_config_ctx_t *p_ctx, char *p_setting_part2, |
|
168 |
+ char *p_value) |
|
169 |
+{ |
|
170 |
+ char *ptr; |
|
171 |
+ unsigned long val; |
|
172 |
+ unsigned int distri; |
|
173 |
+ flp_distri_t *p_distri; |
|
174 |
+ |
|
175 |
+ /* get distributor number */ |
|
176 |
+ val = strtoul(p_setting_part2, &ptr, 0); |
|
177 |
+ if (ptr == p_setting_part2 |
|
178 |
+ || (*ptr != 0 && *ptr != ' ' && *ptr != '\t' |
|
179 |
+ && *ptr != '\r' && *ptr != '\n')) { |
|
180 |
+ if (p_ctx->p_msg_func) |
|
181 |
+ p_ctx->p_msg_func(p_ctx->p_msg_ctx, flp_msg_type_err, |
|
182 |
+ "invalid mapping specifier \"%s\"" |
|
183 |
+ " in line %u of config file\n", |
|
184 |
+ p_setting_part2, p_ctx->line_no); |
|
185 |
+ return -1; |
|
186 |
+ } |
|
187 |
+ distri = (unsigned int)val; |
|
188 |
+ if (distri >= FLP_DISTRI_MAX_CNT) { |
|
189 |
+ if (p_ctx->p_msg_func) |
|
190 |
+ p_ctx->p_msg_func(p_ctx->p_msg_ctx, flp_msg_type_err, |
|
191 |
+ "invalid distributor number \"%u\"" |
|
192 |
+ " in line %u of config file\n", |
|
193 |
+ distri, p_ctx->line_no); |
|
194 |
+ return -1; |
|
195 |
+ } |
|
196 |
+ |
|
197 |
+ /* get distributor */ |
|
198 |
+ p_distri = p_ctx->p_display->distri_ptrs[distri]; |
|
199 |
+ if (!p_distri) { |
|
200 |
+ if (p_ctx->p_msg_func) |
|
201 |
+ p_ctx->p_msg_func(p_ctx->p_msg_ctx, flp_msg_type_err, |
|
202 |
+ "no distributor with number \"%u\"" |
|
203 |
+ " in line %u of config file\n", |
|
204 |
+ distri, p_ctx->line_no); |
|
205 |
+ return -1; |
|
206 |
+ } |
|
207 |
+ |
|
208 |
+ /* get address */ |
|
209 |
+ if (flp_parse_addr(p_value, &p_distri->addr)) { |
|
210 |
+ if (p_ctx->p_msg_func) |
|
211 |
+ p_ctx->p_msg_func(p_ctx->p_msg_ctx, flp_msg_type_err, |
|
212 |
+ "invalid address \"%s\" for distributor with number" |
|
213 |
+ " \"%u\" in line %u of config file\n", |
|
214 |
+ p_value, distri, p_ctx->line_no); |
|
215 |
+ return -1; |
|
216 |
+ } |
|
217 |
+ |
|
218 |
+ return 0; |
|
219 |
+} |
|
220 |
+ |
|
154 | 221 |
/** |
155 | 222 |
* \brief process mapping from config file |
156 | 223 |
* |
... | ... |
@@ -488,6 +555,10 @@ int flp_config_proc_setting(flp_config_ctx_t *p_ctx, char *p_setting, |
488 | 555 |
if (!strncmp(p_setting, "distributor ", 12)) |
489 | 556 |
return flp_config_proc_distri(p_ctx, p_setting + 12, p_value); |
490 | 557 |
|
558 |
+ /* distributor address */ |
|
559 |
+ if (!strncmp(p_setting, "distributorAddr ", 16)) |
|
560 |
+ return flp_config_proc_distri_addr(p_ctx, p_setting + 16, p_value); |
|
561 |
+ |
|
491 | 562 |
/* mapping */ |
492 | 563 |
if (!strncmp(p_setting, "mapping ", 8)) |
493 | 564 |
return flp_config_proc_mapping(p_ctx, p_setting + 8, p_value); |
... | ... |
@@ -246,22 +246,15 @@ void flp_display_send(flp_display_t *p_display) |
246 | 246 |
{ |
247 | 247 |
unsigned int distri; |
248 | 248 |
flp_distri_t *p_distri; |
249 |
- struct sockaddr_in dest_addr; |
|
250 | 249 |
|
251 | 250 |
/* send data to all distributors */ |
252 | 251 |
for (distri = 0; distri < FLP_DISTRI_MAX_CNT; distri++) { |
253 | 252 |
p_distri = p_display->distri_ptrs[distri]; |
254 | 253 |
if (p_distri) { |
255 | 254 |
|
256 |
- /* assemble destination address of distributor */ |
|
257 |
- dest_addr.sin_family = AF_INET; |
|
258 |
- dest_addr.sin_port = htons(FLP_DEST_PORT); |
|
259 |
- dest_addr.sin_addr.s_addr = |
|
260 |
- htonl(FLP_DEST_IP_BASE + p_distri->distri * FLP_DEST_IP_STEP); |
|
261 |
- |
|
262 | 255 |
/* send message as UDP packet */ |
263 | 256 |
sendto(p_display->sock, (char *)p_distri->p_msg_buf, p_distri->msg_len, |
264 |
- 0, (struct sockaddr *)&dest_addr, sizeof (dest_addr)); |
|
257 |
+ 0, (struct sockaddr *)&p_distri->addr, sizeof (p_distri->addr)); |
|
265 | 258 |
|
266 | 259 |
} /* if (p_distri) */ |
267 | 260 |
} /* for (distri ...) */ |
268 | 261 |