thermferm/server.c

changeset 80
81bf78a7618e
parent 79
eb9dd60aa791
child 81
547bbe344886
equal deleted inserted replaced
79:eb9dd60aa791 80:81bf78a7618e
68 Config.cc_idleRangeL = -1.000; 68 Config.cc_idleRangeL = -1.000;
69 } 69 }
70 70
71 71
72 72
73 int unit_add(char *name) 73 /*
74 * Send message to client
75 */
76 int srv_send(const char *format, ...)
77 {
78 char out[SS_BUFSIZE];
79 va_list va_ptr;
80
81 if (s == -1)
82 return -1;
83
84 va_start(va_ptr, format);
85 vsnprintf(out, SS_BUFSIZE-1, format, va_ptr);
86 va_end(va_ptr);
87
88 if (debug) {
89 syslog(LOG_NOTICE, "send: \"%s\"", out);
90 fprintf(stdout, "send: \"%s\"\n", out);
91 }
92
93 if (send(s, out, strlen(out), 0) != strlen(out)) {
94 syslog(LOG_NOTICE, "srv_send failed");
95 return -1;
96 }
97
98 if (send(s, (char *)"\r\n", 2, 0) != 2) {
99 syslog(LOG_NOTICE, "srv_send failed");
100 return -1;
101 }
102
103 return 0;
104 }
105
106
107
108 int unit_add(char *buf)
74 { 109 {
75 units_list *unit, *tmp; 110 units_list *unit, *tmp;
76 uuid_t uu; 111 uuid_t uu;
112 char *cmd, *opt;
113 int id = 1;
114
115 cmd = strtok(buf, " \0");
116 opt = strtok(NULL, "\0");
117 if (opt == NULL) {
118 srv_send((char *)"501 Parameter missing");
119 return 1;
120 }
121
122 if (debug)
123 fprintf(stdout, "cmd: '%s' opt: '%s'\n", MBSE_SS(cmd), MBSE_SS(opt));
77 124
78 unit = (units_list *)malloc(sizeof(units_list)); 125 unit = (units_list *)malloc(sizeof(units_list));
79 unit->next = NULL; 126 unit->next = NULL;
80 unit->uuid = malloc(37); 127 unit->uuid = malloc(37);
81 uuid_generate(uu); 128 uuid_generate(uu);
82 uuid_unparse(uu, unit->uuid); 129 uuid_unparse(uu, unit->uuid);
83 unit->name = xstrcpy(name); 130 unit->name = xstrcpy(opt);
84 unit->air_address = unit->beer_address = unit->io1_address = unit->io2_address = unit->profile = NULL; 131 unit->air_address = unit->beer_address = unit->io1_address = unit->io2_address = unit->profile = NULL;
85 unit->volume = 0.0; 132 unit->volume = 0.0;
86 unit->heater_available = unit->cooler_available = unit->fan_available = FALSE; 133 unit->heater_available = unit->cooler_available = unit->fan_available = FALSE;
87 unit->air_temp = unit->beer_temp = unit->beer_set = unit->fridge_set = 20.0; 134 unit->air_temp = unit->beer_temp = unit->beer_set = unit->fridge_set = 20.0;
88 unit->heater_state = unit->cooler_state = unit->fan_state = unit->door_state = unit->mode = 0; 135 unit->heater_state = unit->cooler_state = unit->fan_state = unit->door_state = unit->mode = 0;
90 unit->temp_set_max = 30.0; 137 unit->temp_set_max = 30.0;
91 unit->idle_rangeH = 1.0; 138 unit->idle_rangeH = 1.0;
92 unit->idle_rangeL = -1.0; 139 unit->idle_rangeL = -1.0;
93 unit->prof_started = (time_t)0; 140 unit->prof_started = (time_t)0;
94 141
95
96 if (Config.units == NULL) { 142 if (Config.units == NULL) {
97 Config.units = unit; 143 Config.units = unit;
98 } else { 144 } else {
99 for (tmp = Config.units; tmp; tmp = tmp->next) { 145 for (tmp = Config.units; tmp; tmp = tmp->next) {
146 id++;
100 if (tmp->next == NULL) { 147 if (tmp->next == NULL) {
101 tmp->next = unit; 148 tmp->next = unit;
102 break; 149 break;
103 } 150 }
104 } 151 }
105 } 152 }
153
154 syslog(LOG_NOTICE, "Unit %d with uuid %s added", id, unit->uuid);
155 srv_send((char *)"211 Unit %d with uuid %s added", id, unit->uuid);
156 current_unit = id;
106 return 0; 157 return 0;
107 }
108
109
110
111 /*
112 * Send message to client
113 */
114 int srv_send(const char *format, ...)
115 {
116 char out[SS_BUFSIZE];
117 va_list va_ptr;
118
119 if (s == -1)
120 return -1;
121
122 va_start(va_ptr, format);
123 vsnprintf(out, SS_BUFSIZE-1, format, va_ptr);
124 va_end(va_ptr);
125
126 if (debug) {
127 syslog(LOG_NOTICE, "send: \"%s\"", out);
128 fprintf(stdout, "send: \"%s\"\n", out);
129 }
130
131 if (send(s, out, strlen(out), 0) != strlen(out)) {
132 syslog(LOG_NOTICE, "srv_send failed");
133 return -1;
134 }
135
136 if (send(s, (char *)"\r\n", 2, 0) != 2) {
137 syslog(LOG_NOTICE, "srv_send failed");
138 return -1;
139 }
140
141 return 0;
142 }
143
144
145
146 void cmd_die(int onsig)
147 {
148 syslog(LOG_NOTICE, "Server process die on signal %d", onsig);
149 close(s);
150 exit(0);
151 } 158 }
152 159
153 160
154 161
155 void cmd_server(void) 162 void cmd_server(void)
178 if (buf[i] == '\n') 185 if (buf[i] == '\n')
179 buf[i] = '\0'; 186 buf[i] = '\0';
180 if (buf[i] == '\r') 187 if (buf[i] == '\r')
181 buf[i] = '\0'; 188 buf[i] = '\0';
182 } 189 }
190 for (i = strlen(buf) -1; i > 0; i--) {
191 if (buf[i] == ' ')
192 buf[i] = '\0';
193 else
194 break;
195 }
183 if (strlen(buf)) { 196 if (strlen(buf)) {
184 if (debug) { 197 if (debug) {
185 syslog(LOG_NOTICE, "recv: \"%s\"", buf); 198 syslog(LOG_NOTICE, "recv: \"%s\"", buf);
186 fprintf(stdout, "recv: \"%s\"\n", buf); 199 fprintf(stdout, "recv: \"%s\"\n", buf);
187 } 200 }
188 201
189 /* 202 /*
190 * Process commands from the client 203 * Process commands from the client
191 */ 204 */
192 if (strncmp(buf, "HELP", 4) == 0) { 205 if (strncmp(buf, "ADD", 3) == 0) {
206 unit_add(buf);
207 } else if (strncmp(buf, "HELP", 4) == 0) {
193 srv_send((char *)"100 Help text follows"); 208 srv_send((char *)"100 Help text follows");
194 srv_send((char *)"Recognized commands:"); 209 srv_send((char *)"Recognized commands:");
195 srv_send((char *)""); 210 srv_send((char *)"");
211 srv_send((char *)"ADD name Add a new unit with \"name\"");
196 srv_send((char *)"LCD Get LCD screen (allways 4 rows of 20 characters)"); 212 srv_send((char *)"LCD Get LCD screen (allways 4 rows of 20 characters)");
197 srv_send((char *)"."); 213 srv_send((char *)".");
198 } else if (strncmp(buf, "LCD", 3) == 0) { 214 } else if (strncmp(buf, "LCD", 3) == 0) {
199 #ifdef HAVE_WIRINGPI_H 215 #ifdef HAVE_WIRINGPI_H
200 srv_send((char *)"201 information follows"); 216 srv_send((char *)"201 information follows");

mercurial