@@ -25,10 +25,13 @@ MenuEntry mainMenuEntry("Main Menu");
25
25
MenuEntry autoMixMenuEntry (" Auto Mixing" , &mainMenuEntry);
26
26
MenuEntry manualMixMenuEntry (" Manual Mixing" , &mainMenuEntry);
27
27
MenuEntry ingredientsMenuEntry (" Ingredient List" , &mainMenuEntry);
28
+ MenuEntry maintenanceMenuEntry (" Maintenance" , &mainMenuEntry);
28
29
29
30
MenuEntry manualMix1MenuEntry (" Valve 1 & 2" , &manualMixMenuEntry, manualDrawFunc, manualActFunc, (void *)(0x01 | 0x02 ));
30
31
MenuEntry manualMix2MenuEntry (" Valve 3 & 4" , &manualMixMenuEntry, manualDrawFunc, manualActFunc, (void *)(0x04 | 0x08 ));
31
32
33
+ MenuEntry maintenanceRunAllMenuEntry (" Open all Valves" , &maintenanceMenuEntry, maintenanceDrawFunc, maintenanceActFunc);
34
+
32
35
MenuEntry *ingredientMenuEntries[INGREDIENT_COUNT];
33
36
MenuEntry *recipeAutoMenuEntries[RECIPE_COUNT];
34
37
@@ -56,23 +59,58 @@ void initUI(void) {
56
59
57
60
for (int i = 0 ; i < INGREDIENT_COUNT; i++) {
58
61
Serial.println (F (" Creating Ingredient menu entry..." ));
59
-
62
+
60
63
ingredientMenuEntries[i] = new MenuEntry (ingredients[i]->name ,
61
64
&ingredientsMenuEntry, ingredientDrawFunc, alwaysReturnActFunc, ingredients[i]);
62
65
}
63
66
64
67
for (int i = 0 ; i < RECIPE_COUNT; i++) {
65
68
Serial.println (F (" Creating recipe menu entry..." ));
66
-
69
+
67
70
recipeAutoMenuEntries[i] = new MenuEntry (recipes[i]->name ,
68
71
&autoMixMenuEntry, dispenseDrawFunc, dispenseActFunc, recipes[i]);
69
72
}
70
73
}
71
74
75
+ int maintenanceDrawFunc (MenuEntry *entry, void *userData) {
76
+ writeLine (0 , F (" Maintenance" ));
77
+ writeLine (1 , " " );
78
+ writeLine (2 , F (" Opening all Valves" ));
79
+ writeLine (3 , " " );
80
+ writeLine (4 , F (" Press button to" ));
81
+ writeLine (5 , F (" close and exit" ));
82
+ writeLine (6 , " " );
83
+ writeLine (7 , " " );
84
+
85
+ DRAW_TEXT ();
86
+
87
+ for (int i = 0 ; i < 4 ; i++) {
88
+ digitalWrite (valves[i], LOW);
89
+ }
90
+
91
+ return MENU_NO_ERR;
92
+ }
93
+
94
+ int maintenanceActFunc (MenuEntry **entry, void *userData) {
95
+ int sw1 = s1.poll ();
96
+ int sw2 = s2.poll ();
97
+ int sw3 = s3.poll ();
98
+
99
+ if ((sw1 == -1 ) || (sw2 == -1 ) || (sw3 == -1 )) {
100
+ for (int i = 0 ; i < 4 ; i++) {
101
+ digitalWrite (valves[i], HIGH);
102
+ }
103
+ *entry = (*entry)->getParent ();
104
+ return MENU_SHOULD_DRAW;
105
+ }
106
+
107
+ return MENU_NO_ERR;
108
+ }
109
+
72
110
int manualDrawFunc (MenuEntry *entry, void *userData) {
73
111
int valvesel = (int )userData;
74
112
75
- String name (" Valves:" );
113
+ String name (F ( " Valves:" ) );
76
114
int l = 1 ;
77
115
for (int i = 0 ; i < 4 ; i++) {
78
116
if (valvesel & (1 << i)) {
@@ -84,8 +122,8 @@ int manualDrawFunc(MenuEntry *entry, void *userData) {
84
122
85
123
writeLine (0 , name);
86
124
l++;
87
- writeLine (l++, " L & R to dispense" );
88
- writeLine (l++, " Center to exit!" );
125
+ writeLine (l++, F ( " L & R to dispense" ) );
126
+ writeLine (l++, F ( " Center to exit!" ) );
89
127
90
128
DRAW_TEXT ();
91
129
return MENU_NO_ERR;
@@ -133,23 +171,19 @@ int ingredientDrawFunc(MenuEntry *entry, void *userData) {
133
171
Ingredient *ing = (Ingredient *)userData;
134
172
135
173
writeLine (0 , entry->getName ());
136
- writeLine (1 , String (" Valve No: " ) + String (ing->valve ));
174
+ writeLine (1 , String (F ( " Valve No: " ) ) + String (ing->valve ));
137
175
writeLine (2 , " " );
138
- writeLine (3 , String (" Alcohol: " ) + String (ing->alcohol ) + " %" );
176
+ writeLine (3 , String (F ( " Alcohol: " ) ) + String (ing->alcohol ) + " %" );
139
177
writeLine (4 , " " );
140
- writeLine (5 , " / 100ml:" );
141
- writeLine (6 , String (" Caffeine: " ) + String (ing->caffeine ) + " mg" );
142
- writeLine (7 , String (" Calories: " ) + String (ing->calories ) + " kcal" );
178
+ writeLine (5 , F ( " / 100ml:" ) );
179
+ writeLine (6 , String (F ( " Caffeine: " ) ) + String (ing->caffeine ) + " mg" );
180
+ writeLine (7 , String (F ( " Calories: " ) ) + String (ing->calories ) + " kcal" );
143
181
144
182
DRAW_TEXT ();
145
183
146
184
return MENU_NO_ERR;
147
185
}
148
186
149
- #define FLOW_RATE (1000 / 50 ) // 1000ms / 50ml
150
-
151
- static int lastDispensionTimes[4 ] = { 0 , 0 , 0 , 0 };
152
-
153
187
int dispenseActFunc (MenuEntry **entry, void *userData) {
154
188
static unsigned long progressTime = 0 ;
155
189
@@ -191,18 +225,15 @@ int dispenseActFunc(MenuEntry **entry, void *userData) {
191
225
if (!dispensing && !dispensed && !showStats) {
192
226
if (sw2 == -1 ) {
193
227
// start dispenser, calculate timings
194
- lastDispensionTimes[0 ] = 0 ;
195
- lastDispensionTimes[1 ] = 0 ;
196
- lastDispensionTimes[2 ] = 0 ;
197
- lastDispensionTimes[3 ] = 0 ;
228
+ int dispensionTimes[4 ] = { 0 , 0 , 0 , 0 };
198
229
for (int i = 0 ; i < 4 ; i++) {
199
230
if (recipe->parts [i].ingredient != NULL ) {
200
231
int targetSize = recipe->parts [i].percentage * recipe->size / 100 ;
201
232
int targetTime = targetSize * FLOW_RATE;
202
- lastDispensionTimes [recipe->parts [i].ingredient ->valve ] = targetTime;
233
+ dispensionTimes [recipe->parts [i].ingredient ->valve ] = targetTime;
203
234
}
204
235
}
205
- startDispensing (lastDispensionTimes [0 ], lastDispensionTimes [1 ], lastDispensionTimes [2 ], lastDispensionTimes [3 ]);
236
+ startDispensing (dispensionTimes [0 ], dispensionTimes [1 ], dispensionTimes [2 ], dispensionTimes [3 ]);
206
237
dispensed = true ;
207
238
progressTime = millis ();
208
239
} else {
@@ -238,7 +269,7 @@ int dispenseActFunc(MenuEntry **entry, void *userData) {
238
269
static int dispenseDrawDrinkInfo (Recipe *recipe) {
239
270
uint32_t sizePx = ((uint32_t )recipe->size /* - DRINK_SIZE_MINIMUM */ ) * OLED_WIDTH / (DRINK_SIZE_MAXIMUM /* - DRINK_SIZE_MINIMUM */ );
240
271
241
- String sizeInfo (" Size: " );
272
+ String sizeInfo (F ( " Size: " ) );
242
273
sizeInfo += recipe->size ;
243
274
sizeInfo += " ml" ;
244
275
@@ -298,8 +329,8 @@ static int dispenseDrawProgress(Recipe *recipe) {
298
329
u8g.firstPage ();
299
330
do {
300
331
u8g.setFont (LARGE_FONT);
301
- u8g.drawStr (50 , (1 * LARGE_FONT_HEIGHT), " Dispensing" );
302
- u8g.drawStr (50 , (2 * LARGE_FONT_HEIGHT) + (1 * GLASS_TEXT_OFF), " Wait!" );
332
+ u8g.drawStr (50 , (1 * LARGE_FONT_HEIGHT), F ( " Dispensing" ) );
333
+ u8g.drawStr (50 , (2 * LARGE_FONT_HEIGHT) + (1 * GLASS_TEXT_OFF), F ( " Wait!" ) );
303
334
u8g.drawStr (50 , (3 * LARGE_FONT_HEIGHT) + (2 * GLASS_TEXT_OFF), prog.c_str ());
304
335
305
336
u8g.drawHLine (GLASS_ANIM_OFF_X, OLED_HEIGHT - GLASS_ANIM_OFF_Y, GLASS_ANIM_WIDTH);
@@ -320,9 +351,9 @@ static int dispenseShowStats(Recipe *recipe) {
320
351
// to not update properly...
321
352
delay (250 ); // just wait a bit for this to pass
322
353
323
- String alcohol (" Alcohol: " );
324
- String caffeine (" Caffeine: " );
325
- String calories (" Calories: " );
354
+ String alcohol (F ( " Alcohol: " ) );
355
+ String caffeine (F ( " Caffeine: " ) );
356
+ String calories (F ( " Calories: " ) );
326
357
327
358
uint32_t alcoholPercent = 0 ;
328
359
uint32_t caffeineCont = 0 ;
@@ -349,10 +380,10 @@ static int dispenseShowStats(Recipe *recipe) {
349
380
u8g.firstPage ();
350
381
do {
351
382
u8g.setFont (LARGE_FONT);
352
- u8g.drawStr (0 , LARGE_FONT_HEIGHT, " Enjoy your drink!" );
383
+ u8g.drawStr (0 , LARGE_FONT_HEIGHT, F ( " Enjoy your drink!" ) );
353
384
354
385
u8g.setFont (SMALL_FONT);
355
- u8g.drawStr (0 , LARGE_FONT_HEIGHT + (2 * SMALL_FONT_HEIGHT), " Statistics:" );
386
+ u8g.drawStr (0 , LARGE_FONT_HEIGHT + (2 * SMALL_FONT_HEIGHT), F ( " Statistics:" ) );
356
387
u8g.drawStr (0 , LARGE_FONT_HEIGHT + (3 * SMALL_FONT_HEIGHT), alcohol.c_str ());
357
388
u8g.drawStr (0 , LARGE_FONT_HEIGHT + (4 * SMALL_FONT_HEIGHT), caffeine.c_str ());
358
389
u8g.drawStr (0 , LARGE_FONT_HEIGHT + (5 * SMALL_FONT_HEIGHT), calories.c_str ());
0 commit comments