thermferm/server.c

changeset 46
000399c64d3f
parent 45
053c4657105f
child 48
d8c64f81b192
equal deleted inserted replaced
45:053c4657105f 46:000399c64d3f
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 */
93 117
94 118
95 119
96 void cmd_server(void) 120 void cmd_server(void)
97 { 121 {
98 char *hostname, buf[SS_BUFSIZE], obuf[SS_BUFSIZE]; 122 char *inp, *hostname, buf[SS_BUFSIZE], obuf[SS_BUFSIZE];
99 int i, rc, rlen, timer; 123 int i, rc, rlen, timer;
100 socklen_t fromlen; 124 socklen_t fromlen;
101 struct pollfd pfd[1]; 125 struct pollfd pfd[1];
126 float newtemp;
102 127
103 /* 128 /*
104 * Close listen socket 129 * Close listen socket
105 */ 130 */
106 close(ls); 131 close(ls);
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;

mercurial