Commit 8dca7aebfc94728c9afe92c651cc47f5c75d2a9f
1 parent
35bb800b
Automatic Pumping and Heating
Showing
10 changed files
with
327 additions
and
13 deletions
Show diff stats
Makefile
... | ... | @@ -12,6 +12,8 @@ |
12 | 12 | #include "ui.h" |
13 | 13 | #include "nfc.h" |
14 | 14 | #include "hvc.h" |
15 | +#include "heat.h" | |
16 | +#include "pump.h" | |
15 | 17 | |
16 | 18 | #define CMD_MAX 70 |
17 | 19 | #define KEY 1100 |
... | ... | @@ -94,7 +96,8 @@ void P(int i) |
94 | 96 | void V(int i) |
95 | 97 | { |
96 | 98 | PV(i, 1); |
97 | -} | |
99 | +} | |
100 | + | |
98 | 101 | |
99 | 102 | void stopBus() |
100 | 103 | { |
... | ... | @@ -132,6 +135,12 @@ void processCmd(char* buffer) |
132 | 135 | printx(INFO, BUS, "Setting HEAT OFF"); |
133 | 136 | setHeatWantedState(false); |
134 | 137 | } |
138 | + else if(strcmp(buffer, "setheaton2s") == 0) | |
139 | + { | |
140 | + printx(INFO, BUS, "Setting HEAT ON for 2 secs"); | |
141 | + setHeatTimer(2); | |
142 | + setHeatWantedState(true); | |
143 | + } | |
135 | 144 | else if(strcmp(buffer, "setheaton5s") == 0) |
136 | 145 | { |
137 | 146 | printx(INFO, BUS, "Setting HEAT ON for 5 secs"); |
... | ... | @@ -144,12 +153,29 @@ void processCmd(char* buffer) |
144 | 153 | setHeatTimer(10); |
145 | 154 | setHeatWantedState(true); |
146 | 155 | } |
156 | + else if(strcmp(buffer, "setheaton15s") == 0) | |
157 | + { | |
158 | + printx(INFO, BUS, "Setting HEAT ON for 15 secs"); | |
159 | + setHeatTimer(15); | |
160 | + setHeatWantedState(true); | |
161 | + } | |
147 | 162 | else if(strcmp(buffer, "setpumpon5s") == 0) |
148 | 163 | { |
149 | 164 | printx(INFO, BUS, "Setting PUMP ON for 5 secs"); |
150 | 165 | setPumpTimer(5); |
151 | 166 | setPumpWantedState(true); |
152 | 167 | } |
168 | + else if(strcmp(buffer, "setpumpon10s") == 0) | |
169 | + { | |
170 | + printx(INFO, BUS, "Setting PUMP ON for 10 secs"); | |
171 | + setPumpTimer(10); | |
172 | + setPumpWantedState(true); | |
173 | + } | |
174 | + else if(strcmp(buffer, "autoheat") == 0) | |
175 | + { | |
176 | + printx(INFO, BUS, "Processing Auto Heat to 90°C"); | |
177 | + processHeat(NULL); | |
178 | + } | |
153 | 179 | |
154 | 180 | //printx(DEBUG, BUS, "STRLEN : %d and strcmp ret %d", strlen(buffer), strcmp(buffer, "quit")); |
155 | 181 | } |
... | ... | @@ -162,8 +188,6 @@ void* processBus(void* we) |
162 | 188 | while(!busStop) |
163 | 189 | { |
164 | 190 | P(SEM_OUTPUT); |
165 | - //while(busFree); | |
166 | - //while(!busFree); | |
167 | 191 | printx(DEBUG, BUS, "Event receved !\n"); |
168 | 192 | busFree = false; |
169 | 193 | lseek(bus, 0, SEEK_SET); |
... | ... | @@ -192,8 +216,6 @@ bool initBus() |
192 | 216 | return false; |
193 | 217 | } |
194 | 218 | |
195 | - //P(SEM_INPUT); | |
196 | - | |
197 | 219 | return true; |
198 | 220 | } |
199 | 221 | ... | ... |
... | ... | @@ -0,0 +1,234 @@ |
1 | +#include <stdio.h> | |
2 | +#include <time.h> | |
3 | +#include <stdbool.h> | |
4 | +#include "hvc.h" | |
5 | +#include "heat.h" | |
6 | + | |
7 | +#define TASK_NUMBER 20 | |
8 | +#define T_INIT_THRESH 400 | |
9 | +#define T_STEP_THRESH 860 | |
10 | +#define T_HOLD_THRESH 880 | |
11 | +#define INIT_HEAT_TIME 15 | |
12 | +#define INIT_WAIT_TIME 15 | |
13 | +#define STEP_HEAT_TIME 2 | |
14 | +#define STEP_WAIT_TIME 5 | |
15 | +#define HOLD_HEAT_TIME 1 | |
16 | +#define HOLD_WAIT_TIME 2 | |
17 | +#define HOLD_PUMP_HEAT_TIME 3 | |
18 | +#define HOLD_PUMP_WAIT_TIME 1 | |
19 | + | |
20 | + | |
21 | +//Globals | |
22 | +time_t tTask; | |
23 | +time_t tNow; | |
24 | +time_t tAct; //Lecture de la température du capteur | |
25 | +bool task[TASK_NUMBER]; //A initialiser (task[0]=true, sinon false) | |
26 | + /*for (int i=0;i<TASK_NUMBER;i++) | |
27 | + { | |
28 | + if (i == 0) | |
29 | + task[i]=true; | |
30 | + else | |
31 | + task[i]=false; | |
32 | + }*/ | |
33 | +bool stop=false; | |
34 | +bool heat_ok=false; | |
35 | +bool hold_heat=true; | |
36 | +bool pumpitup=false; //Lecture de l'état de la pompe | |
37 | +bool eco_mode=false; | |
38 | + | |
39 | +void* processHeat(void* arg) | |
40 | +{ | |
41 | + while(!stop) | |
42 | + { | |
43 | + tNow = clock(); | |
44 | + | |
45 | + //Chaufffe initiale | |
46 | + if (task[0]) | |
47 | + { | |
48 | + tTask = clock(); | |
49 | + if (tAct < T_INIT_THRESH) | |
50 | + { | |
51 | + setHeatOn(); | |
52 | + task[0] = false; | |
53 | + task[1] = true; | |
54 | + } | |
55 | + | |
56 | + else | |
57 | + { | |
58 | + task[0] = false; | |
59 | + task[3] = true; | |
60 | + } | |
61 | + } | |
62 | + | |
63 | + else if (task[1]) | |
64 | + { | |
65 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > INIT_HEAT_TIME ) | |
66 | + { | |
67 | + setHeatOff(); | |
68 | + task[1] = false; | |
69 | + task[2] = true; | |
70 | + } | |
71 | + } | |
72 | + | |
73 | + else if (task[2]) | |
74 | + { | |
75 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > INIT_WAIT_TIME ) | |
76 | + { | |
77 | + task[2] = false; | |
78 | + task[3] = true; | |
79 | + } | |
80 | + } | |
81 | + | |
82 | + //Chauffe par paliers | |
83 | + else if (task[3]) | |
84 | + { | |
85 | + if (tAct < T_STEP_THRESH) | |
86 | + { | |
87 | + setHeatOn(); | |
88 | + task[3] = false; | |
89 | + task[4] = true; | |
90 | + } | |
91 | + | |
92 | + else | |
93 | + { | |
94 | + task[3] = false; | |
95 | + task[6] = true; //Numéro de tache début "Maintien au chaud" | |
96 | + } | |
97 | + } | |
98 | + | |
99 | + else if (task[4]) | |
100 | + { | |
101 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > STEP_HEAT_TIME ) | |
102 | + { | |
103 | + setHeatOff(); | |
104 | + task[4] = false; | |
105 | + task[5] = true; | |
106 | + } | |
107 | + } | |
108 | + | |
109 | + else if (task[5]) | |
110 | + { | |
111 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > STEP_WAIT_TIME ) | |
112 | + { | |
113 | + if ( tAct < T_STEP_THRESH ) | |
114 | + { | |
115 | + task[5] = false; | |
116 | + task[3] = true; | |
117 | + } | |
118 | + | |
119 | + else | |
120 | + { | |
121 | + task[5] = false; | |
122 | + task[6] = true; | |
123 | + } | |
124 | + } | |
125 | + } | |
126 | + | |
127 | + // Maintien au chaud | |
128 | + else if (task[6]) | |
129 | + { | |
130 | + heat_ok = true; | |
131 | + task[6]=false; | |
132 | + task[7]=true; | |
133 | + } | |
134 | + | |
135 | + else if (task[7]) | |
136 | + { | |
137 | + if(hold_heat) | |
138 | + { | |
139 | + if( (tAct < T_HOLD_THRESH) && !pumpitup) | |
140 | + { | |
141 | + setHeatOn(); | |
142 | + task[7] = false; | |
143 | + task[8] = true; | |
144 | + } | |
145 | + | |
146 | + else if ( (tAct < T_HOLD_THRESH) && pumpitup) | |
147 | + { | |
148 | + setHeatOn(); | |
149 | + task[7]=false; | |
150 | + task[10]=true; //Numéro de tache "T<Thold && pumpitup" | |
151 | + } | |
152 | + | |
153 | + } | |
154 | + | |
155 | + else | |
156 | + { | |
157 | + task[6]=false; | |
158 | + task[12]=true; //Sinon go étape d'attente fin | |
159 | + } | |
160 | + } | |
161 | + | |
162 | + //Maintien au chaud sans pompage | |
163 | + else if (task[8]) | |
164 | + { | |
165 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_HEAT_TIME ) | |
166 | + { | |
167 | + setHeatOff(); | |
168 | + task[8] = false; | |
169 | + task[9] = true; | |
170 | + } | |
171 | + } | |
172 | + | |
173 | + else if (task[9]) | |
174 | + { | |
175 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_WAIT_TIME ) | |
176 | + { | |
177 | + if ( tAct < T_HOLD_THRESH) | |
178 | + { | |
179 | + task[9] = false; | |
180 | + task[7] = true; //Retour au début de "Maintien au chaud" | |
181 | + } | |
182 | + } | |
183 | + } | |
184 | + | |
185 | + //Maintien au chaud avec pompage | |
186 | + else if (task[10]) | |
187 | + { | |
188 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_PUMP_HEAT_TIME ) | |
189 | + { | |
190 | + setHeatOff(); | |
191 | + task[10] = false; | |
192 | + task[11] = true; | |
193 | + } | |
194 | + } | |
195 | + | |
196 | + else if (task[11]) | |
197 | + { | |
198 | + if( ((tNow - tTask) / CLOCKS_PER_SEC) > HOLD_PUMP_WAIT_TIME ) | |
199 | + { | |
200 | + if ( tAct < T_HOLD_THRESH) | |
201 | + { | |
202 | + task[11] = false; | |
203 | + task[7] = true; //Retour au début de "Maintien au chaud" | |
204 | + } | |
205 | + } | |
206 | + } | |
207 | + | |
208 | + //Fin de maintien au chaud (demandé par l'extérieur) et reboucle quand hold_heat est remis | |
209 | + else if(task[12]) | |
210 | + { | |
211 | + setHeatOff(); | |
212 | + heat_ok=false; | |
213 | + | |
214 | + if(hold_heat) | |
215 | + { | |
216 | + task[12]=false; | |
217 | + task[1]=true; //Retour au début | |
218 | + } | |
219 | + } | |
220 | + | |
221 | + | |
222 | + //Mode économie d'énergie | |
223 | + else if(task[13]) | |
224 | + { | |
225 | + //task[]=false; | |
226 | + //task[]=true; | |
227 | + } | |
228 | + | |
229 | + | |
230 | + } | |
231 | + | |
232 | + | |
233 | +return NULL; | |
234 | +} | ... | ... |
... | ... | @@ -13,6 +13,7 @@ |
13 | 13 | #include "hvc.h" |
14 | 14 | #include "printx.h" |
15 | 15 | #include "serial.h" |
16 | +#include "heat.h" | |
16 | 17 | |
17 | 18 | #define DEVICE1 "/dev/ttyACM1" |
18 | 19 | #define SPEED B19200 |
... | ... | @@ -31,6 +32,7 @@ int hvc_fd = -1; |
31 | 32 | bool hvcStop = false; |
32 | 33 | bool sPump = false; |
33 | 34 | bool sHeat = false; |
35 | +bool autoHeat = false; | |
34 | 36 | struct termios hvcSaveterm; |
35 | 37 | bool wHeat = false; |
36 | 38 | bool wPump = false; |
... | ... | @@ -40,6 +42,7 @@ double tHeatTimer; |
40 | 42 | time_t tPumpStart; |
41 | 43 | double tPumpTimer; |
42 | 44 | time_t tPumpStop; |
45 | +int tempCons; | |
43 | 46 | |
44 | 47 | void stopHVC() |
45 | 48 | { |
... | ... | @@ -70,6 +73,11 @@ void setHeatTimer(double t) |
70 | 73 | tHeatTimer = t; |
71 | 74 | } |
72 | 75 | |
76 | +void setAutoHeat(bool s) | |
77 | +{ | |
78 | + autoHeat = s; | |
79 | +} | |
80 | + | |
73 | 81 | bool initHVC() |
74 | 82 | { |
75 | 83 | unsigned char data; |
... | ... | @@ -97,6 +105,7 @@ bool initHVC() |
97 | 105 | void* processHVC(void* we) |
98 | 106 | { |
99 | 107 | uint8_t data; |
108 | + float temp; | |
100 | 109 | |
101 | 110 | while(!hvcStop) |
102 | 111 | { |
... | ... | @@ -104,7 +113,8 @@ void* processHVC(void* we) |
104 | 113 | sendData(&hvc_fd, GET_TEMP); |
105 | 114 | data = getData(&hvc_fd); |
106 | 115 | setTemp(data); |
107 | - printx(DEBUG, HVC, "TEMP %f\n", 25 + (((float)(80*data)))/255); | |
116 | + temp = 25 + (((float)(80*data)))/255; | |
117 | + printx(DEBUG, HVC, "TEMP %f\n", temp); | |
108 | 118 | if(tHeatTimer > 0) |
109 | 119 | { |
110 | 120 | tHeatStop = clock(); |
... | ... | @@ -113,7 +123,6 @@ void* processHVC(void* we) |
113 | 123 | wHeat = false; |
114 | 124 | tHeatTimer = 0; |
115 | 125 | } |
116 | - | |
117 | 126 | } |
118 | 127 | |
119 | 128 | if(tPumpTimer > 0) | ... | ... |
... | ... | @@ -68,7 +68,7 @@ bool isTagPresent(char* tag) |
68 | 68 | if(data == PROFESSOR_TAG) |
69 | 69 | { |
70 | 70 | sendData(&nfc_fd, GET_TAG_DETAILS); |
71 | - //printx(INFO, NFC, "Professor Tag Detected %02x\n", data); | |
71 | + printx(INFO, NFC, "Professor Tag Detected %02x\n", data); | |
72 | 72 | //return (read(serial_fd, tag, 6) == 6); |
73 | 73 | } |
74 | 74 | else if(data == STUDENT_TAG) | ... | ... |
printx.c
... | ... | @@ -57,11 +57,11 @@ void printx(severity s, msgfrom from, char* str, ...) |
57 | 57 | char buffer1[MAX_BUFFER]; |
58 | 58 | char buffer2[MAX_BUFFER]; |
59 | 59 | va_list arglist; |
60 | - //float now = clock(); | |
60 | + float now = clock(); | |
61 | 61 | va_start(arglist, str); |
62 | 62 | vsprintf(buffer1, str, arglist); |
63 | - //fprintf(logfile, "[%6f] : %s", (now - start)/CLOCKS_PER_SEC, buffer1); | |
64 | - //fflush(logfile); | |
63 | + fprintf(logfile, "[%6f] : %s", (now - start)/CLOCKS_PER_SEC, buffer1); | |
64 | + fflush(logfile); | |
65 | 65 | sprintf(buffer2, "[%s] %s%s%s", f_name[from], s_color[s], buffer1, S_RESET); |
66 | 66 | removeCharFromString('\n', buffer2); |
67 | 67 | addToLog(buffer2); | ... | ... |
... | ... | @@ -0,0 +1,37 @@ |
1 | +#include <stdio.h> | |
2 | +#include <time.h> | |
3 | +#include <stdbool.h> | |
4 | +#include "hvc.h" | |
5 | +#include "pump.h" | |
6 | + | |
7 | +#define K_DEB 1925 //en imp/L | |
8 | + | |
9 | + | |
10 | +//Globals | |
11 | +bool stop=false; | |
12 | +bool heat_ok=false; | |
13 | +bool coffee_wanted=false; | |
14 | +int volDeb=0; // Volume du débitmetre en impulsion | |
15 | +int volWanted=0; | |
16 | + | |
17 | +void* processHeat(void* arg) | |
18 | +{ | |
19 | + while (!stop) | |
20 | + { | |
21 | + if (heat_ok && coffee_wanted) | |
22 | + { | |
23 | + if (volDeb < volWanted) | |
24 | + { | |
25 | + setPumpOn(); | |
26 | + } | |
27 | + | |
28 | + else | |
29 | + { | |
30 | + setPumpOff(); | |
31 | + coffee_wanted=false; | |
32 | + volDeb=0; | |
33 | + } | |
34 | + } | |
35 | + sleep(1); | |
36 | + } | |
37 | +} | ... | ... |
... | ... | @@ -225,6 +225,6 @@ void displayUI() |
225 | 225 | sprintf(buffer, "\u2503> %s", cmd); |
226 | 226 | printf("%s\u2503\n", fillStatusWithSpaces(buffer, buffer)); |
227 | 227 | printf("\u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B\n"); |
228 | - printf("\x1b[2A\x1b[%dC", strlen(cmd) + 3); | |
228 | + printf("\x1b[2A\x1b[%dC",(int)(strlen(cmd)) + 3); | |
229 | 229 | fflush(stdout); |
230 | 230 | } | ... | ... |