21 *****************************************************************************/ |
21 *****************************************************************************/ |
22 |
22 |
23 |
23 |
24 #include "../lib/mbselib.h" |
24 #include "../lib/mbselib.h" |
25 #include "server.h" |
25 #include "server.h" |
26 |
26 #include "thermferm.h" |
27 |
27 |
28 extern bool my_shutdown; |
28 extern bool my_shutdown; |
29 extern bool debug; |
29 extern bool debug; |
30 extern int lcdHandle; |
30 extern int lcdHandle; |
31 extern unsigned char lcdbuf[MAX_LCDS][20][4]; |
31 extern unsigned char lcdbuf[MAX_LCDS][20][4]; |
32 extern sys_config Config; |
32 extern sys_config Config; |
33 extern int clients; |
33 extern int clients; |
34 |
34 |
35 /* beer settings */ |
|
36 float cs_beerSet = 20.0; |
|
37 float cs_fridgeSet = 20.0; |
|
38 unsigned char cs_mode = 'o'; /* o = Off, f = fridge, b = beer, p = profile-run */ |
|
39 |
|
40 |
|
41 int s; /* connected socket */ |
35 int s; /* connected socket */ |
42 int ls; /* listen socket */ |
36 int ls; /* listen socket */ |
43 |
37 |
44 struct sockaddr_in myaddr_in; /* for local socket address */ |
38 struct sockaddr_in myaddr_in; /* for local socket address */ |
45 struct sockaddr_in peeraddr_in; /* for peer socket address */ |
39 struct sockaddr_in peeraddr_in; /* for peer socket address */ |
46 |
40 |
47 struct hostent *hp; |
41 struct hostent *hp; |
48 |
42 |
49 #define SS_BUFSIZE 1024 |
43 #define SS_BUFSIZE 1024 |
50 #define SS_TIMEOUT 300 |
44 #define SS_TIMEOUT 300 |
|
45 |
|
46 |
|
47 |
|
48 void defaultControlsettings(void) |
|
49 { |
|
50 beer->cs_mode = 'o'; /* o = Off, f = fridge, b = beer, p = profile-run */ |
|
51 beer->cs_beerSet = 20.0; |
|
52 beer->cs_fridgeSet = 20.0; |
|
53 beer->cs_heatEstimator = 0.2; |
|
54 beer->cs_coolEstimator = 5; |
|
55 } |
|
56 |
|
57 |
|
58 |
|
59 void defaultControlConstants(void) |
|
60 { |
|
61 beer->cc_tempFormat = 'C'; |
|
62 beer->cc_tempSetMin = 1.0; |
|
63 beer->cc_tempSetMax = 30.0; |
|
64 beer->cc_idleRangeH = 1.000; |
|
65 beer->cc_idleRangeL = -1.000; |
|
66 } |
|
67 |
|
68 |
|
69 |
|
70 void defaultControlVariables(void) |
|
71 { |
|
72 beer->cv_beerDiff = 0.0; |
|
73 } |
|
74 |
51 |
75 |
52 |
76 |
53 /* |
77 /* |
54 * Send message to client |
78 * Send message to client |
55 */ |
79 */ |
170 * Process commands from the client |
195 * Process commands from the client |
171 */ |
196 */ |
172 if (strncmp(buf, "ack", 3) == 0) { |
197 if (strncmp(buf, "ack", 3) == 0) { |
173 srv_send((char *)"ack"); |
198 srv_send((char *)"ack"); |
174 } else if (strncmp(buf, "lcd", 3) == 0) { |
199 } else if (strncmp(buf, "lcd", 3) == 0) { |
175 sprintf(obuf, "[\"12345678901234567890\", \"12345678901234567890\", \"12345678901234567890\", \"12345678901234567890\"]"); |
200 sprintf(obuf, "[\" \", \" \", \" \", \" \"]"); |
176 for (i = 0; i < 20; i++) { |
201 for (i = 0; i < 20; i++) { |
177 obuf[i+2] = lcdbuf[lcdHandle][i][0]; |
202 obuf[i+2] = lcdbuf[lcdHandle][i][0]; |
178 obuf[i+26] = lcdbuf[lcdHandle][i][1]; |
203 obuf[i+26] = lcdbuf[lcdHandle][i][1]; |
179 obuf[i+50] = lcdbuf[lcdHandle][i][2]; |
204 obuf[i+50] = lcdbuf[lcdHandle][i][2]; |
180 obuf[i+74] = lcdbuf[lcdHandle][i][3]; |
205 obuf[i+74] = lcdbuf[lcdHandle][i][3]; |
181 } |
206 } |
182 srv_send(obuf); |
207 srv_send(obuf); |
183 } else if (strncmp(buf, "getMode", 7) == 0) { |
208 } else if (strncmp(buf, "getMode", 7) == 0) { |
184 srv_send("%c", cs_mode); |
209 srv_send("%c", beer->cs_mode); |
|
210 } else if (strncmp(buf, "getFridge", 9) == 0) { |
|
211 srv_send("%.1f", beer->cs_fridgeSet); |
|
212 } else if (strncmp(buf, "getBeer", 7) == 0) { |
|
213 srv_send("%.1f", beer->cs_beerSet); |
|
214 } else if (strncmp(buf, "getControlConstants", 19) == 0) { |
|
215 srv_send("{ \"tempFormat\":\"%c\", \"tempSetMin\":%.1f, \"tempSetMax\":%.1f, \"idleRangeH\":%.3f, \"idleRangeL\":%.3f }", |
|
216 beer->cc_tempFormat, beer->cc_tempSetMin, beer->cc_tempSetMax, beer->cc_idleRangeH, beer->cc_idleRangeL ); |
185 } else if (strncmp(buf, "getControlSettings", 18) == 0) { |
217 } else if (strncmp(buf, "getControlSettings", 18) == 0) { |
186 srv_send("{ mode:%c, \"beerSet\":\"%.1f\", \"fridgeSet\":\"%.1f\", \"heatEstimator\":\"0.2\", \"coolEstimator\":\"5\" }", cs_mode, cs_beerSet, cs_fridgeSet); |
218 srv_send("{ \"mode\":\"%c\", \"beerSet\":%.1f, \"fridgeSet\":%.1f, \"heatEstimator\":%.1f, \"coolEstimator\":%.1f }", |
|
219 beer->cs_mode, beer->cs_beerSet, beer->cs_fridgeSet, beer->cs_heatEstimator, beer->cs_coolEstimator); |
|
220 } else if (strncmp(buf, "getControlVariables", 19) == 0) { |
|
221 srv_send("{ \"beerDiff\":%.2f }", beer->cv_beerDiff); |
|
222 } else if (strncmp(buf, "setBeer=", 8) == 0) { |
|
223 inp = xstrcpy(buf+8); |
|
224 rc = sscanf(inp, "%f", &newtemp); |
|
225 if (debug) |
|
226 fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); |
|
227 if (rc == 1) { |
|
228 srv_send("ack"); |
|
229 beer->cs_mode = 'b'; |
|
230 beer->cs_beerSet = newtemp; |
|
231 } else { |
|
232 srv_send("err"); |
|
233 } |
|
234 } else if (strncmp(buf, "setFridge=", 10) == 0) { |
|
235 inp = xstrcpy(buf+10); |
|
236 rc = sscanf(inp, "%f", &newtemp); |
|
237 if (debug) |
|
238 fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); |
|
239 if (rc == 1) { |
|
240 srv_send("ack"); |
|
241 beer->cs_mode = 'f'; |
|
242 beer->cs_fridgeSet = newtemp; |
|
243 } else { |
|
244 srv_send("err"); |
|
245 } |
187 } else { |
246 } else { |
188 if (debug) |
247 if (debug) |
189 fprintf(stdout, "unknown command \"%s\"\n", buf); |
248 fprintf(stdout, "unknown command \"%s\"\n", buf); |
190 srv_send((char *)"ERR"); |
249 srv_send((char *)"ERR"); |
191 } |
250 } |
228 int optval = 1; |
287 int optval = 1; |
229 |
288 |
230 syslog(LOG_NOTICE, "Thread my_server_loop started"); |
289 syslog(LOG_NOTICE, "Thread my_server_loop started"); |
231 if (debug) |
290 if (debug) |
232 fprintf(stdout, "Thread my_server_loop started\n"); |
291 fprintf(stdout, "Thread my_server_loop started\n"); |
|
292 |
|
293 defaultControlsettings(); |
|
294 defaultControlConstants(); |
|
295 defaultControlVariables(); |
233 |
296 |
234 memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); |
297 memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); |
235 memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in)); |
298 memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in)); |
236 myaddr_in.sin_family = AF_INET; |
299 myaddr_in.sin_family = AF_INET; |
237 myaddr_in.sin_addr.s_addr = INADDR_ANY; |
300 myaddr_in.sin_addr.s_addr = INADDR_ANY; |