Sun, 10 Aug 2014 21:22:17 +0200
Code cleanup, streamlined error messages.
158 | 1 | /***************************************************************************** |
2 | * Copyright (C) 2014 | |
3 | * | |
4 | * Michiel Broek <mbroek at mbse dot eu> | |
5 | * | |
6 | * This file is part of the mbsePi-apps | |
7 | * | |
8 | * This is free software; you can redistribute it and/or modify it | |
9 | * under the terms of the GNU General Public License as published by the | |
10 | * Free Software Foundation; either version 2, or (at your option) any | |
11 | * later version. | |
12 | * | |
13 | * mbsePi-apps is distributed in the hope that it will be useful, but | |
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 | * General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU General Public License | |
19 | * along with thermferm; see the file COPYING. If not, write to the Free | |
20 | * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | |
21 | *****************************************************************************/ | |
22 | ||
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
23 | #include "thermferm.h" |
158 | 24 | #include "devices.h" |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
25 | #include "rc-switch.h" |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
26 | #include "panel.h" |
158 | 27 | #include "xutil.h" |
28 | ||
29 | ||
30 | extern int debug; | |
31 | extern sys_config Config; | |
32 | extern int my_shutdown; | |
33 | ||
34 | ||
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
35 | #ifdef HAVE_WIRINGPI_H |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
36 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
37 | #define MAXTIMINGS 100 |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
38 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
39 | int dht11_pin = -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
40 | int dht11_temperature = -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
41 | int dht11_humidity = -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
42 | int dht11_valid = FALSE; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
43 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
44 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
45 | static uint8_t sizecvt(const int read_value) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
46 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
47 | * digitalRead() and friends from wiringpi are defined as returning a value |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
48 | * < 256. However, they are returned as int() types. This is a safety function |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
49 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
50 | if (read_value > 255 || read_value < 0) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
51 | syslog(LOG_NOTICE, "invalid data from wiringPi library"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
52 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
53 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
54 | return (uint8_t)read_value; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
55 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
56 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
57 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
58 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
59 | /* |
213
2317b8d644fa
Code cleanup, streamlined error messages.
Michiel Broek <mbroek@mbse.eu>
parents:
212
diff
changeset
|
60 | * DHT11 sensor read. |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
61 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
62 | void dht11Read(void) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
63 | int tries = 5; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
64 | unsigned short got_correct_data = 0; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
65 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
66 | if (dht11_pin == -1) |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
67 | return; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
68 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
69 | while (tries && !got_correct_data) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
70 | uint8_t laststate = HIGH; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
71 | uint8_t counter = 0; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
72 | uint8_t j = 0, i = 0; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
73 | int dht11_dat[5] = {0,0,0,0,0}; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
74 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
75 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
76 | * Select output mode to send the start signal. |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
77 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
78 | pinMode(dht11_pin, OUTPUT); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
79 | digitalWrite(dht11_pin, HIGH); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
80 | usleep(1000); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
81 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
82 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
83 | * Low for at least 18 milliseconds |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
84 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
85 | digitalWrite(dht11_pin, LOW); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
86 | usleep(20000); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
87 | digitalWrite(dht11_pin, HIGH); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
88 | pinMode(dht11_pin, INPUT); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
89 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
90 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
91 | * Detect change and read data |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
92 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
93 | for (i=0; i<MAXTIMINGS; i++) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
94 | counter = 0; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
95 | delayMicroseconds(10); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
96 | while (sizecvt(digitalRead(dht11_pin)) == laststate) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
97 | counter++; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
98 | delayMicroseconds(1); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
99 | if (counter == 255) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
100 | break; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
101 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
102 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
103 | laststate = sizecvt(digitalRead(dht11_pin)); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
104 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
105 | if (counter == 255) |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
106 | break; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
107 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
108 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
109 | * ignore first 3 transitions |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
110 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
111 | if ((i >= 4) && (i%2 == 0)) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
112 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
113 | // shove each bit into the storage bytes |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
114 | dht11_dat[(int)((double)j/8)] <<= 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
115 | if (counter > 16) |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
116 | dht11_dat[(int)((double)j/8)] |= 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
117 | j++; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
118 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
119 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
120 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
121 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
122 | * If there is no sensor, j = 0 |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
123 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
124 | if ((counter == 255) && (j == 0)) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
125 | if (dht11_temperature != -1) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
126 | syslog(LOG_NOTICE, "dht11 sensor disappeared"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
127 | } else { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
128 | syslog(LOG_NOTICE, "dht11 sensor not present"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
129 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
130 | dht11_temperature = -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
131 | dht11_humidity = -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
132 | dht11_valid = FALSE; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
133 | return; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
134 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
135 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
136 | /* |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
137 | * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
138 | * print it out if data is good |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
139 | */ |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
140 | if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF))) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
141 | got_correct_data = 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
142 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
143 | int h = dht11_dat[0] + dht11_dat[1]; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
144 | int t = (dht11_dat[2] & 0x7F) + dht11_dat[3]; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
145 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
146 | if ((dht11_dat[2] & 0x80) != 0) |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
147 | t *= -1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
148 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
149 | dht11_temperature = t; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
150 | dht11_humidity = h; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
151 | dht11_valid = TRUE; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
152 | } else { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
153 | tries--; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
154 | if (tries == 0) |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
155 | syslog(LOG_INFO, "dht11 data checksum was wrong 5 times"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
156 | usleep(100000); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
157 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
158 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
159 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
160 | |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
161 | #endif |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
162 | |
158 | 163 | |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
164 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
165 | int device_out(char *uuid, int value) |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
166 | { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
167 | devices_list *device; |
187
3c8bf18fdf42
Updated conditional defines and dependencies
Michiel Broek <mbroek@mbse.eu>
parents:
185
diff
changeset
|
168 | time_t now; |
3c8bf18fdf42
Updated conditional defines and dependencies
Michiel Broek <mbroek@mbse.eu>
parents:
185
diff
changeset
|
169 | #ifdef HAVE_WIRINGPI_H |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
170 | int i, rc; |
187
3c8bf18fdf42
Updated conditional defines and dependencies
Michiel Broek <mbroek@mbse.eu>
parents:
185
diff
changeset
|
171 | char buf[40]; |
3c8bf18fdf42
Updated conditional defines and dependencies
Michiel Broek <mbroek@mbse.eu>
parents:
185
diff
changeset
|
172 | #endif |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
173 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
174 | if (uuid == NULL) |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
175 | return 0; |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
176 | |
185 | 177 | now = time(NULL); |
181
4099412fca09
Fixed double commands to 433 MHz switches, they did not switch.
Michiel Broek <mbroek@mbse.eu>
parents:
179
diff
changeset
|
178 | |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
179 | for (device = Config.devices; device; device = device->next) { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
180 | if (strcmp(uuid, device->uuid) == 0) { |
185 | 181 | /* |
182 | * Execute command if different then the old value. But also | |
212 | 183 | * every 2 minutes because commands can have temporary |
184 | * disconnects, or have radio problems. | |
185 | 185 | */ |
186 | if ((value != device->value) || (((int)now - (int)device->timestamp) > 120)) { | |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
187 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
188 | #ifdef HAVE_WIRINGPI_H |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
189 | rc = 0; |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
190 | if ((device->type == DEVTYPE_RC433) && (device->gpiopin != -1) && (device->present == DEVPRESENT_YES)) { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
191 | enableTransmit(device->gpiopin); |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
192 | snprintf(buf, 39, "%s,%d", device->address, value ? 1:0); |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
193 | for (i = 0; i < strlen(buf); i++) |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
194 | if (buf[i] == '-') |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
195 | buf[i] = ','; |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
196 | rc = toggleSwitch(buf); |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
197 | syslog(LOG_NOTICE, "RC433 command %s rc=%d", buf, rc); |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
198 | if (debug) |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
199 | fprintf(stdout, "RC433 command %s rc=%d\n", buf, rc); |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
200 | disableTransmit(); |
212 | 201 | device->value = value; |
202 | device->timestamp = time(NULL); | |
203 | return rc; | |
204 | } | |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
205 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
206 | if ((device->type == DEVTYPE_GPIO) && (device->gpiopin != -1) && (device->present == DEVPRESENT_YES)) { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
207 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
208 | } |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
209 | #endif |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
210 | if ((device->type == DEVTYPE_W1) && (device->direction == DEVDIR_OUT_BIN) && (device->present == DEVPRESENT_YES)) { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
211 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
212 | } |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
213 | } else { |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
214 | return 0; |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
215 | } |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
216 | } |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
217 | } |
185 | 218 | |
179
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
219 | return 0; |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
220 | } |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
221 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
222 | |
417ee898fb02
Added PID implementation and 433 MHz radio control switches. Not reliable yet.
Michiel Broek <mbroek@mbse.eu>
parents:
166
diff
changeset
|
223 | |
158 | 224 | /* |
225 | * Auto detect hotplugged or known to be present devices | |
226 | */ | |
227 | int devices_detect(void) | |
228 | { | |
229 | struct dirent *de; | |
230 | DIR *fd; | |
231 | devices_list *device, *ndev; | |
232 | int found, subdevices, i, rc = 0; | |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
233 | char buf[40]; |
158 | 234 | uuid_t uu; |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
235 | #ifdef HAVE_WIRINGPI_H |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
236 | int pin; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
237 | #endif |
158 | 238 | |
239 | /* | |
240 | * Scan for 1-wire devices | |
241 | */ | |
242 | if ((fd = opendir((char *)"/sys/bus/w1/devices"))) { | |
243 | while ((de = readdir(fd))) { | |
244 | if (de->d_name[0] != '.') { | |
245 | found = FALSE; | |
246 | for (device = Config.devices; device; device = device->next) { | |
161
493e39bb0a08
Small fixes for device configuration
Michiel Broek <mbroek@mbse.eu>
parents:
158
diff
changeset
|
247 | if (strcmp(device->address,de->d_name) == 0) { |
158 | 248 | found = TRUE; |
249 | break; | |
250 | } | |
251 | } | |
252 | ||
253 | if (found == FALSE) { | |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
254 | strncpy(buf, de->d_name, 2); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
255 | buf[2] = '\0'; |
158 | 256 | subdevices = 1; |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
257 | if (strcmp(buf, (char *)"29") == 0) |
158 | 258 | subdevices = 8; |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
259 | if (strcmp(buf, (char *)"3a") == 0) |
158 | 260 | subdevices = 2; |
261 | for (i = 0; i < subdevices; i++) { | |
262 | ndev = (devices_list *)malloc(sizeof(devices_list)); | |
263 | ndev->next = NULL; | |
264 | ndev->version = 1; | |
265 | ndev->uuid = malloc(37); | |
266 | uuid_generate(uu); | |
267 | uuid_unparse(uu, ndev->uuid); | |
268 | ndev->type = DEVTYPE_W1; | |
269 | ndev->direction = DEVDIR_UNDEF; | |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
270 | if (strcmp(buf, (char *)"10") == 0) { |
158 | 271 | ndev->direction = DEVDIR_IN_ANALOG; |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
272 | ndev->description = xstrcpy((char *)"DS18S20 Digital thermometer"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
273 | } else if (strcmp(buf, (char *)"28") == 0) { |
158 | 274 | ndev->direction = DEVDIR_IN_ANALOG; |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
275 | ndev->description = xstrcpy((char *)"DS18B20 Digital thermometer"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
276 | } else if (strcmp(buf, (char *)"29") == 0) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
277 | ndev->description = xstrcpy((char *)"DS2408 8 Channel addressable switch/LCD"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
278 | } else if (strcmp(buf, (char *)"3a") == 0) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
279 | ndev->description = xstrcpy((char *)"DS2413 Dual channel addressable switch"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
280 | } else if (strcmp(buf, (char *)"w1") == 0) { |
158 | 281 | ndev->description = xstrcpy((char *)"Master System device"); |
282 | } else { | |
283 | ndev->description = xstrcpy((char *)"Unknown device family "); | |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
284 | ndev->description = xstrcat(ndev->description, buf); |
158 | 285 | } |
286 | ndev->value = ndev->inuse = 0; | |
287 | ndev->present = DEVPRESENT_YES; | |
288 | ndev->address = xstrcpy(de->d_name); | |
289 | ndev->subdevice = i; | |
290 | ndev->gpiopin = -1; | |
291 | ndev->comment = xstrcpy((char *)"Auto detected device"); | |
292 | ndev->timestamp = time(NULL); | |
293 | ||
294 | if (Config.devices == NULL) { | |
295 | Config.devices = ndev; | |
296 | } else { | |
297 | for (device = Config.devices; device; device = device->next) { | |
161
493e39bb0a08
Small fixes for device configuration
Michiel Broek <mbroek@mbse.eu>
parents:
158
diff
changeset
|
298 | if (device->next == NULL) { |
158 | 299 | device->next = ndev; |
161
493e39bb0a08
Small fixes for device configuration
Michiel Broek <mbroek@mbse.eu>
parents:
158
diff
changeset
|
300 | break; |
493e39bb0a08
Small fixes for device configuration
Michiel Broek <mbroek@mbse.eu>
parents:
158
diff
changeset
|
301 | } |
158 | 302 | } |
303 | } | |
304 | rc++; | |
305 | } | |
306 | } | |
307 | } | |
308 | } | |
166
c31ea86fec43
Forgot some close functions so tha program ran out of file descriptors. Better loggin for writing the configuration.
Michiel Broek <mbroek@mbse.eu>
parents:
164
diff
changeset
|
309 | closedir(fd); |
158 | 310 | } |
311 | ||
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
312 | #ifdef HAVE_WIRINGPI_H |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
313 | if (piBoardRev() == 2) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
314 | /* |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
315 | * Support rev B boards only |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
316 | */ |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
317 | found = FALSE; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
318 | for (device = Config.devices; device; device = device->next) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
319 | if (device->type == DEVTYPE_GPIO) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
320 | found = TRUE; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
321 | break; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
322 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
323 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
324 | |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
325 | if (found == FALSE) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
326 | /* |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
327 | * There were no GPIO devices found. |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
328 | */ |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
329 | subdevices = 12; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
330 | pin = 0; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
331 | for (i = 0; i < subdevices; i++) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
332 | if (i == 8) |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
333 | pin = 17; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
334 | |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
335 | ndev = (devices_list *)malloc(sizeof(devices_list)); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
336 | ndev->next = NULL; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
337 | ndev->version = 1; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
338 | ndev->uuid = malloc(37); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
339 | uuid_generate(uu); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
340 | uuid_unparse(uu, ndev->uuid); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
341 | ndev->type = DEVTYPE_GPIO; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
342 | ndev->value = digitalRead(pin); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
343 | ndev->present = DEVPRESENT_YES; |
163
3d813570a5e3
LIST BUS now displays the new devices table. Adjusted the web screen
Michiel Broek <mbroek@mbse.eu>
parents:
162
diff
changeset
|
344 | ndev->address = xstrcpy((char *)"GPIO"); |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
345 | snprintf(buf, 39, "Raspberry GPIO %d", i); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
346 | ndev->description = xstrcpy(buf); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
347 | ndev->subdevice = i; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
348 | ndev->gpiopin = pin; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
349 | ndev->timestamp = time(NULL); |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
350 | if (i == PANEL_LED) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
351 | ndev->direction = DEVDIR_OUT_BIN; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
352 | ndev->inuse = 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
353 | ndev->comment = xstrcpy((char *)"Frontpanel LED"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
354 | } else if (i == PANEL_ENTER) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
355 | ndev->direction = DEVDIR_IN_BIN; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
356 | ndev->inuse = 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
357 | ndev->comment = xstrcpy((char *)"Frontpanel Enter key"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
358 | } else if (i == PANEL_DOWN) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
359 | ndev->direction = DEVDIR_IN_BIN; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
360 | ndev->inuse = 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
361 | ndev->comment = xstrcpy((char *)"Frontpanel Down key"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
362 | } else if (i == PANEL_UP) { |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
363 | ndev->direction = DEVDIR_IN_BIN; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
364 | ndev->inuse = 1; |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
365 | ndev->comment = xstrcpy((char *)"Frontpanel Up key"); |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
366 | } else if (i == 7) { |
162
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
367 | ndev->direction = DEVDIR_INTERN; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
368 | ndev->inuse = 1; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
369 | ndev->comment = xstrcpy((char *)"1-Wire bus"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
370 | } else { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
371 | ndev->direction = DEVDIR_IN_BIN; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
372 | ndev->inuse = 0; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
373 | ndev->comment = xstrcpy((char *)"Raspberry GPIO"); |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
374 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
375 | pin++; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
376 | |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
377 | if (Config.devices == NULL) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
378 | Config.devices = ndev; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
379 | } else { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
380 | for (device = Config.devices; device; device = device->next) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
381 | if (device->next == NULL) { |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
382 | device->next = ndev; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
383 | break; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
384 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
385 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
386 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
387 | rc++; |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
388 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
389 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
390 | } |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
391 | #endif |
6fc9e3f7962f
Added Raspberry GPIO devices
Michiel Broek <mbroek@mbse.eu>
parents:
161
diff
changeset
|
392 | |
158 | 393 | return rc; |
394 | } | |
395 | ||
396 | ||
397 | ||
398 | #ifdef HAVE_WIRINGPI_H | |
399 | PI_THREAD (my_devices_loop) | |
400 | #else | |
401 | void *my_devices_loop(void *threadid) | |
402 | #endif | |
403 | { | |
404 | devices_list *device; | |
164
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
405 | char *addr = NULL, line[60], *p = NULL; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
406 | FILE *fp; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
407 | int temp, rc; |
158 | 408 | |
409 | syslog(LOG_NOTICE, "Thread my_devices_loop started"); | |
410 | ||
411 | /* | |
412 | * Loop forever until the external shutdown variable is set. | |
413 | */ | |
414 | for (;;) { | |
415 | ||
416 | /* | |
164
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
417 | * Process all devices. |
158 | 418 | */ |
419 | for (device = Config.devices; device; device = device->next) { | |
420 | ||
421 | if (my_shutdown) | |
422 | break; | |
423 | ||
164
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
424 | switch (device->type) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
425 | case DEVTYPE_W1: |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
426 | if (strncmp(device->address, (char *)"28", 2) == 0) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
427 | /* Read DS18B20 sensor */ |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
428 | addr = xstrcpy((char *)"/sys/bus/w1/devices/"); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
429 | addr = xstrcat(addr, device->address); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
430 | addr = xstrcat(addr, (char *)"/w1_slave"); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
431 | if ((fp = fopen(addr, "r"))) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
432 | if (device->present != DEVPRESENT_YES) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
433 | syslog(LOG_NOTICE, "sensor %s is back", device->address); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
434 | device->present = DEVPRESENT_YES; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
435 | } |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
436 | /* |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
437 | * The output looks like: |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
438 | * 72 01 4b 46 7f ff 0e 10 57 : crc=57 YES |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
439 | * 72 01 4b 46 7f ff 0e 10 57 t=23125 |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
440 | */ |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
441 | fgets(line, 50, fp); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
442 | line[strlen(line)-1] = '\0'; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
443 | if ((line[36] == 'Y') && (line[37] == 'E')) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
444 | /* CRC is Ok, continue */ |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
445 | fgets(line, 50, fp); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
446 | line[strlen(line)-1] = '\0'; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
447 | strtok(line, (char *)"="); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
448 | p = strtok(NULL, (char *)"="); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
449 | rc = sscanf(p, "%d", &temp); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
450 | if ((rc == 1) && (device->value != temp)) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
451 | device->value = temp; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
452 | device->timestamp = time(NULL); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
453 | } |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
454 | } else { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
455 | syslog(LOG_NOTICE, "sensor %s CRC error", device->address); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
456 | device->present = DEVPRESENT_ERROR; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
457 | } |
166
c31ea86fec43
Forgot some close functions so tha program ran out of file descriptors. Better loggin for writing the configuration.
Michiel Broek <mbroek@mbse.eu>
parents:
164
diff
changeset
|
458 | fclose(fp); |
164
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
459 | } else { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
460 | if (device->present != DEVPRESENT_NO) { |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
461 | syslog(LOG_NOTICE, "sensor %s is missing", device->address); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
462 | device->present = DEVPRESENT_NO; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
463 | } |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
464 | } |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
465 | free(addr); |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
466 | addr = NULL; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
467 | } |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
468 | break; |
203 | 469 | |
470 | #ifdef HAVE_WIRINGPI_H | |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
471 | case DEVTYPE_DHT: |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
472 | if (device->subdevice == 0) { |
203 | 473 | dht11_pin = device->gpiopin; |
474 | dht11Read(); | |
475 | if (dht11_valid) { | |
476 | device->value = dht11_temperature * 1000; | |
477 | device->timestamp = time(NULL); | |
478 | device->present = DEVPRESENT_YES; | |
479 | } else { | |
480 | device->present = DEVPRESENT_ERROR; | |
481 | } | |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
482 | } else if (device->subdevice == 1) { |
203 | 483 | if (dht11_valid) { |
484 | device->value = dht11_humidity * 1000; | |
485 | device->timestamp = time(NULL); | |
486 | device->present = DEVPRESENT_YES; | |
487 | } else { | |
488 | device->present = DEVPRESENT_ERROR; | |
489 | } | |
202
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
490 | } |
5d09ca728809
Code added on the wrong machine
Michiel Broek <mbroek@mbse.eu>
parents:
187
diff
changeset
|
491 | break; |
203 | 492 | #endif |
493 | ||
164
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
494 | default: |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
495 | break; |
f16def8472ba
Threads partly working via new devices interface
Michiel Broek <mbroek@mbse.eu>
parents:
163
diff
changeset
|
496 | } |
212 | 497 | |
498 | /* | |
499 | * Delay a bit after procesing a device. | |
500 | */ | |
501 | usleep(10000); | |
502 | } | |
158 | 503 | } |
504 | ||
505 | syslog(LOG_NOTICE, "Thread my_devices_loop stopped"); | |
506 | return 0; | |
507 | } | |
508 | ||
509 | ||
510 |