thermferm/thermferm.c

changeset 420
644a6106d712
parent 418
0bfe08c7ba6e
child 422
13502d0dda65
equal deleted inserted replaced
419:8a7f8272516c 420:644a6106d712
27 #include "server.h" 27 #include "server.h"
28 #include "thermferm.h" 28 #include "thermferm.h"
29 #include "simulator.h" 29 #include "simulator.h"
30 #include "lcd-pcf8574.h" 30 #include "lcd-pcf8574.h"
31 #include "lcd-buffer.h" 31 #include "lcd-buffer.h"
32 #include "slcd.h"
32 #include "panel.h" 33 #include "panel.h"
33 #include "futil.h" 34 #include "futil.h"
34 #include "xutil.h" 35 #include "xutil.h"
35 #include "pid.h" 36 #include "pid.h"
36 37
41 int run_hold = FALSE; 42 int run_hold = FALSE;
42 43
43 extern int debug; 44 extern int debug;
44 extern sys_config Config; 45 extern sys_config Config;
45 extern int lcdHandle; 46 extern int lcdHandle;
47 extern int slcdHandle;
46 int setupmenu = MENU_NONE; 48 int setupmenu = MENU_NONE;
47 units_list *current_unit = NULL; /* In panel editor this points to the current unit. */ 49 units_list *current_unit = NULL; /* In panel editor this points to the current unit. */
48 profiles_list *current_profile = NULL; 50 profiles_list *current_profile = NULL;
49 float temp_temp = 20.0; 51 float temp_temp = 20.0;
50 52
51 #ifndef HAVE_WIRINGPI_H 53 #ifndef HAVE_WIRINGPI_H
52 pthread_t threads[5]; 54 pthread_t threads[5];
53 #endif 55 #endif
54 extern const char UNITMODE[5][8]; 56 extern const char UNITMODE[5][8];
55 extern const char PROFSTATE[4][6]; 57 extern const char PROFSTATE[4][6];
58
59 extern int sock;
56 60
57 61
58 int server(void); 62 int server(void);
59 void help(void); 63 void help(void);
60 void die(int); 64 void die(int);
104 snprintf(buf, 20, "Old mode %s", UNITMODE[current_unit->mode]); 108 snprintf(buf, 20, "Old mode %s", UNITMODE[current_unit->mode]);
105 #ifdef HAVE_WIRINGPI_H 109 #ifdef HAVE_WIRINGPI_H
106 lcdPuts(lcdHandle, buf); 110 lcdPuts(lcdHandle, buf);
107 lcdPosition(lcdHandle, 0, 1); 111 lcdPosition(lcdHandle, 0, 1);
108 #endif 112 #endif
113 slcdPuts(slcdHandle, buf);
114 slcdPosition(slcdHandle, 0, 1);
109 } 115 }
110 116
111 117
112 118
113 void go_menu(int menu) 119 void go_menu(int menu)
118 piLock(LOCK_LCD); 124 piLock(LOCK_LCD);
119 piLock(LOCK_MENU); 125 piLock(LOCK_MENU);
120 lcdClear(lcdHandle); 126 lcdClear(lcdHandle);
121 lcdPosition(lcdHandle, 0, 0); 127 lcdPosition(lcdHandle, 0, 0);
122 #endif 128 #endif
129 slcdClear(slcdHandle);
130 slcdPosition(slcdHandle, 0, 0);
131
123 syslog(LOG_NOTICE, "from menu %d to menu %d", setupmenu, menu); 132 syslog(LOG_NOTICE, "from menu %d to menu %d", setupmenu, menu);
124 setupmenu = menu; 133 setupmenu = menu;
125 134
126 switch (menu) { 135 switch (menu) {
127 case MENU_NONE: 136 case MENU_NONE:
128 #ifdef HAVE_WIRINGPI_H
129 lcd_buf_show(); 137 lcd_buf_show();
130 #endif
131 break; 138 break;
132 139
133 case MENU_TOP_DEFAULT: 140 case MENU_TOP_DEFAULT:
134 #ifdef HAVE_WIRINGPI_H 141 #ifdef HAVE_WIRINGPI_H
135 lcdPuts(lcdHandle, "Setup mode."); 142 lcdPuts(lcdHandle, "Setup mode.");
136 lcdPosition(lcdHandle, 0, 1); 143 lcdPosition(lcdHandle, 0, 1);
137 lcdPuts(lcdHandle, "Up&Down = Escape"); 144 lcdPuts(lcdHandle, "Up&Down = Escape");
138 #endif 145 #endif
146 slcdPuts(slcdHandle, "Setup mode.");
147 slcdPosition(slcdHandle, 0, 1);
148 slcdPuts(slcdHandle, "Up&Down = Escape");
139 break; 149 break;
140 150
141 case MENU_TOP_UNITS: 151 case MENU_TOP_UNITS:
142 #ifdef HAVE_WIRINGPI_H 152 #ifdef HAVE_WIRINGPI_H
143 lcdPuts(lcdHandle, "Select units"); 153 lcdPuts(lcdHandle, "Select units");
144 #endif 154 #endif
155 slcdPuts(slcdHandle, "Select units");
145 break; 156 break;
146 157
147 case MENU_UNITS: 158 case MENU_UNITS:
148 #ifdef HAVE_WIRINGPI_H 159 #ifdef HAVE_WIRINGPI_H
149 lcdPuts(lcdHandle, "Choose unit:"); 160 lcdPuts(lcdHandle, "Choose unit:");
150 lcdPosition(lcdHandle, 0, 1); 161 lcdPosition(lcdHandle, 0, 1);
151 lcdPuts(lcdHandle, current_unit->name); 162 lcdPuts(lcdHandle, current_unit->name);
152 #endif 163 #endif
164 slcdPuts(slcdHandle, "Choose unit:");
165 slcdPosition(slcdHandle, 0, 1);
166 slcdPuts(slcdHandle, current_unit->name);
153 break; 167 break;
154 168
155 case MENU_MODE_OFF: show_mode(); 169 case MENU_MODE_OFF: show_mode();
156 #ifdef HAVE_WIRINGPI_H 170 #ifdef HAVE_WIRINGPI_H
157 lcdPuts(lcdHandle, "New mode OFF"); 171 lcdPuts(lcdHandle, "New mode OFF");
158 #endif 172 #endif
173 slcdPuts(slcdHandle, "New mode OFF");
159 break; 174 break;
160 175
161 case MENU_MODE_NONE: show_mode(); 176 case MENU_MODE_NONE: show_mode();
162 #ifdef HAVE_WIRINGPI_H 177 #ifdef HAVE_WIRINGPI_H
163 lcdPuts(lcdHandle, "New mode NONE"); 178 lcdPuts(lcdHandle, "New mode NONE");
164 #endif 179 #endif
180 slcdPuts(slcdHandle, "New mode NONE");
165 break; 181 break;
166 182
167 case MENU_NONE_HEAT: snprintf(buf, Config.lcd_cols, "Set heater %s", current_unit->heater_state ? "OFF":"ON"); 183 case MENU_NONE_HEAT: snprintf(buf, Config.lcd_cols, "Set heater %s", current_unit->heater_state ? "OFF":"ON");
168 #ifdef HAVE_WIRINGPI_H 184 #ifdef HAVE_WIRINGPI_H
169 lcdPuts(lcdHandle, buf); 185 lcdPuts(lcdHandle, buf);
170 #endif 186 #endif
187 slcdPuts(slcdHandle, buf);
171 break; 188 break;
172 189
173 case MENU_NONE_COOL: snprintf(buf, Config.lcd_cols, "Set cooler %s", current_unit->cooler_state ? "OFF":"ON"); 190 case MENU_NONE_COOL: snprintf(buf, Config.lcd_cols, "Set cooler %s", current_unit->cooler_state ? "OFF":"ON");
174 #ifdef HAVE_WIRINGPI_H 191 #ifdef HAVE_WIRINGPI_H
175 lcdPuts(lcdHandle, buf); 192 lcdPuts(lcdHandle, buf);
176 #endif 193 #endif
194 slcdPuts(slcdHandle, buf);
177 break; 195 break;
178 196
179 case MENU_NONE_FAN: snprintf(buf, Config.lcd_cols, "Set fan %s", current_unit->fan_state ? "OFF":"ON"); 197 case MENU_NONE_FAN: snprintf(buf, Config.lcd_cols, "Set fan %s", current_unit->fan_state ? "OFF":"ON");
180 #ifdef HAVE_WIRINGPI_H 198 #ifdef HAVE_WIRINGPI_H
181 lcdPuts(lcdHandle, buf); 199 lcdPuts(lcdHandle, buf);
182 #endif 200 #endif
201 slcdPuts(slcdHandle, buf);
183 break; 202 break;
184 203
185 case MENU_MODE_BEER: show_mode(); 204 case MENU_MODE_BEER: show_mode();
186 #ifdef HAVE_WIRINGPI_H 205 #ifdef HAVE_WIRINGPI_H
187 lcdPuts(lcdHandle, "New mode BEER"); 206 lcdPuts(lcdHandle, "New mode BEER");
188 #endif 207 #endif
208 slcdPuts(slcdHandle, buf);
189 break; 209 break;
190 210
191 case MENU_BEER_TEMP: 211 case MENU_BEER_TEMP:
192 #ifdef HAVE_WIRINGPI_H 212 #ifdef HAVE_WIRINGPI_H
193 lcdPuts(lcdHandle, "Set beer temp"); 213 lcdPuts(lcdHandle, "Set beer temp");
194 lcdPosition(lcdHandle, 0, 1); 214 lcdPosition(lcdHandle, 0, 1);
195 #endif 215 #endif
216 slcdPuts(slcdHandle, "Set beer temp");
217 slcdPosition(slcdHandle, 0, 1);
218
196 snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp); 219 snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp);
197 #ifdef HAVE_WIRINGPI_H 220 #ifdef HAVE_WIRINGPI_H
198 lcdPuts(lcdHandle, buf); 221 lcdPuts(lcdHandle, buf);
199 #endif 222 #endif
223 slcdPuts(slcdHandle, buf);
200 break; 224 break;
201 225
202 case MENU_MODE_FRIDGE: show_mode(); 226 case MENU_MODE_FRIDGE: show_mode();
203 #ifdef HAVE_WIRINGPI_H 227 #ifdef HAVE_WIRINGPI_H
204 lcdPuts(lcdHandle, "New mode FRIDGE"); 228 lcdPuts(lcdHandle, "New mode FRIDGE");
205 #endif 229 #endif
230 slcdPuts(slcdHandle, "New mode FRIDGE");
206 break; 231 break;
207 232
208 case MENU_FRIDGE_TEMP: 233 case MENU_FRIDGE_TEMP:
209 #ifdef HAVE_WIRINGPI_H 234 #ifdef HAVE_WIRINGPI_H
210 lcdPuts(lcdHandle, "Set fridge temp"); 235 lcdPuts(lcdHandle, "Set fridge temp");
211 lcdPosition(lcdHandle, 0, 1); 236 lcdPosition(lcdHandle, 0, 1);
212 #endif 237 #endif
238 slcdPuts(slcdHandle, "Set fridge temp");
239 slcdPosition(slcdHandle, 0, 1);
213 snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp); 240 snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp);
214 #ifdef HAVE_WIRINGPI_H 241 #ifdef HAVE_WIRINGPI_H
215 lcdPuts(lcdHandle, buf); 242 lcdPuts(lcdHandle, buf);
216 #endif 243 #endif
244 slcdPuts(slcdHandle, buf);
217 break; 245 break;
218 246
219 case MENU_MODE_PROFILE: show_mode(); 247 case MENU_MODE_PROFILE: show_mode();
220 #ifdef HAVE_WIRINGPI_H 248 #ifdef HAVE_WIRINGPI_H
221 lcdPuts(lcdHandle, "New mode PROFILE"); 249 lcdPuts(lcdHandle, "New mode PROFILE");
222 #endif 250 #endif
251 slcdPuts(slcdHandle, "New mode PROFILE");
223 break; 252 break;
224 253
225 case MENU_PROFILE_SELECT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 254 case MENU_PROFILE_SELECT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
226 #ifdef HAVE_WIRINGPI_H 255 #ifdef HAVE_WIRINGPI_H
227 lcdPuts(lcdHandle, buf); 256 lcdPuts(lcdHandle, buf);
228 lcdPosition(lcdHandle, 0, 1); 257 lcdPosition(lcdHandle, 0, 1);
229 lcdPuts(lcdHandle, "Select profile"); 258 lcdPuts(lcdHandle, "Select profile");
230 #endif 259 #endif
260 slcdPuts(slcdHandle, buf);
261 slcdPosition(slcdHandle, 0, 1);
262 slcdPuts(slcdHandle, "Select profile");
231 break; 263 break;
232 264
233 case MENU_PROFILE_START: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 265 case MENU_PROFILE_START: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
234 #ifdef HAVE_WIRINGPI_H 266 #ifdef HAVE_WIRINGPI_H
235 lcdPuts(lcdHandle, buf); 267 lcdPuts(lcdHandle, buf);
236 lcdPosition(lcdHandle, 0, 1); 268 lcdPosition(lcdHandle, 0, 1);
237 lcdPuts(lcdHandle, "Start profile"); 269 lcdPuts(lcdHandle, "Start profile");
238 #endif 270 #endif
271 slcdPuts(slcdHandle, buf);
272 slcdPosition(slcdHandle, 0, 1);
273 slcdPuts(slcdHandle, "Start profile");
239 break; 274 break;
240 275
241 case MENU_PROFILE_PAUSE: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 276 case MENU_PROFILE_PAUSE: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
242 #ifdef HAVE_WIRINGPI_H 277 #ifdef HAVE_WIRINGPI_H
243 lcdPuts(lcdHandle, buf); 278 lcdPuts(lcdHandle, buf);
244 lcdPosition(lcdHandle, 0, 1); 279 lcdPosition(lcdHandle, 0, 1);
245 lcdPuts(lcdHandle, "Pause profile"); 280 lcdPuts(lcdHandle, "Pause profile");
246 #endif 281 #endif
282 slcdPuts(slcdHandle, buf);
283 slcdPosition(slcdHandle, 0, 1);
284 slcdPuts(slcdHandle, "Pause profile");
247 break; 285 break;
248 286
249 case MENU_PROFILE_ABORT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 287 case MENU_PROFILE_ABORT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
250 #ifdef HAVE_WIRINGPI_H 288 #ifdef HAVE_WIRINGPI_H
251 lcdPuts(lcdHandle, buf); 289 lcdPuts(lcdHandle, buf);
252 lcdPosition(lcdHandle, 0, 1); 290 lcdPosition(lcdHandle, 0, 1);
253 lcdPuts(lcdHandle, "Abort profile"); 291 lcdPuts(lcdHandle, "Abort profile");
254 #endif 292 #endif
293 slcdPuts(slcdHandle, buf);
294 slcdPosition(slcdHandle, 0, 1);
295 slcdPuts(slcdHandle, "Abort profile");
255 break; 296 break;
256 297
257 case MENU_PROFILE_RESUME: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 298 case MENU_PROFILE_RESUME: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
258 #ifdef HAVE_WIRINGPI_H 299 #ifdef HAVE_WIRINGPI_H
259 lcdPuts(lcdHandle, buf); 300 lcdPuts(lcdHandle, buf);
260 lcdPosition(lcdHandle, 0, 1); 301 lcdPosition(lcdHandle, 0, 1);
261 lcdPuts(lcdHandle, "Resume profile"); 302 lcdPuts(lcdHandle, "Resume profile");
262 #endif 303 #endif
304 slcdPuts(slcdHandle, buf);
305 slcdPosition(slcdHandle, 0, 1);
306 slcdPuts(slcdHandle, "Resume profile");
263 break; 307 break;
264 308
265 case MENU_PROFILE_GOOFF: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); 309 case MENU_PROFILE_GOOFF: snprintf(buf, Config.lcd_cols, "%s", current_profile->name);
266 #ifdef HAVE_WIRINGPI_H 310 #ifdef HAVE_WIRINGPI_H
267 lcdPuts(lcdHandle, buf); 311 lcdPuts(lcdHandle, buf);
268 lcdPosition(lcdHandle, 0, 1); 312 lcdPosition(lcdHandle, 0, 1);
269 lcdPuts(lcdHandle, "Set profile OFF"); 313 lcdPuts(lcdHandle, "Set profile OFF");
270 #endif 314 #endif
315 slcdPuts(slcdHandle, buf);
316 slcdPosition(slcdHandle, 0, 1);
317 slcdPuts(slcdHandle, "Set profile OFF");
271 break; 318 break;
272 319
273 case MENU_TOP_SYS: 320 case MENU_TOP_SYS:
274 #ifdef HAVE_WIRINGPI_H 321 #ifdef HAVE_WIRINGPI_H
275 lcdPuts(lcdHandle, "System menu"); 322 lcdPuts(lcdHandle, "System menu");
276 #endif 323 #endif
324 slcdPuts(slcdHandle, "System menu");
277 break; 325 break;
278 326
279 case MENU_SYS_HALT: 327 case MENU_SYS_HALT:
280 #ifdef HAVE_WIRINGPI_H 328 #ifdef HAVE_WIRINGPI_H
281 lcdPuts(lcdHandle, "Halt system"); 329 lcdPuts(lcdHandle, "Halt system");
282 #endif 330 #endif
331 slcdPuts(slcdHandle, "Halt system");
283 break; 332 break;
284 333
285 case MENU_SYS_REBOOT: 334 case MENU_SYS_REBOOT:
286 #ifdef HAVE_WIRINGPI_H 335 #ifdef HAVE_WIRINGPI_H
287 lcdPuts(lcdHandle, "Reboot system"); 336 lcdPuts(lcdHandle, "Reboot system");
288 #endif 337 #endif
338 slcdPuts(slcdHandle, "Reboot system");
289 break; 339 break;
290 } 340 }
291 341
292 #ifdef HAVE_WIRINGPI_H 342 #ifdef HAVE_WIRINGPI_H
293 piUnlock(LOCK_MENU); 343 piUnlock(LOCK_MENU);
301 { 351 {
302 #ifdef HAVE_WIRINGPI_H 352 #ifdef HAVE_WIRINGPI_H
303 piLock(LOCK_LCD); 353 piLock(LOCK_LCD);
304 lcdClear(lcdHandle); 354 lcdClear(lcdHandle);
305 setBacklight(0); 355 setBacklight(0);
356 #endif
357 slcdClear(slcdHandle);
358 #ifdef HAVE_WIRINGPI_H
306 piUnlock(LOCK_LCD); 359 piUnlock(LOCK_LCD);
307 #endif 360 #endif
308 } 361 }
309 362
310 363
798 } 851 }
799 852
800 #ifdef HAVE_WIRINGPI_H 853 #ifdef HAVE_WIRINGPI_H
801 if (wiringPiSetup () ) 854 if (wiringPiSetup () )
802 return 1; 855 return 1;
856 #endif
803 857
804 if ((rc = initLCD (Config.lcd_cols, Config.lcd_rows))) { 858 if ((rc = initLCD (Config.lcd_cols, Config.lcd_rows))) {
805 fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc); 859 fprintf(stderr, "Cannot initialize LCD display, rc=%d\n", rc);
806 return 1; 860 return 1;
807 } 861 }
808 #endif
809 862
810 if (debug) { 863 if (debug) {
811 /* 864 /*
812 * For debugging run in foreground. 865 * For debugging run in foreground.
813 */ 866 */
1755 device_out(unit->fan_address, unit->fan_state); 1808 device_out(unit->fan_address, unit->fan_state);
1756 device_out(unit->light_address, unit->light_state); 1809 device_out(unit->light_address, unit->light_state);
1757 syslog(LOG_NOTICE, "Unit `%s' stopped in mode %s", unit->name, UNITMODE[unit->mode]); 1810 syslog(LOG_NOTICE, "Unit `%s' stopped in mode %s", unit->name, UNITMODE[unit->mode]);
1758 } 1811 }
1759 1812
1813 syslog(LOG_NOTICE, "Out of loop");
1760 if (debug) 1814 if (debug)
1761 fprintf(stdout, (char *)"Out of loop\n"); 1815 fprintf(stdout, (char *)"Out of loop\n");
1762 1816
1763 /* 1817 /*
1764 * Give threads time to cleanup 1818 * Give threads time to cleanup
1765 */ 1819 */
1766 usleep(1500000); 1820 usleep(1500000);
1767 1821
1768 stopLCD(); 1822 stopLCD();
1823 if (sock != -1) {
1824 if (shutdown(sock, SHUT_RDWR)) {
1825 syslog(LOG_NOTICE, "Can't shutdown socket: %s", strerror(errno));
1826 }
1827 sock = -1;
1828 }
1769 wrconfig(); 1829 wrconfig();
1770 ulockprog((char *)"thermferm"); 1830 ulockprog((char *)"thermferm");
1771 return 0; 1831 return 0;
1772 } 1832 }
1773 1833

mercurial