You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							116 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
	
	
							116 lines
						
					
					
						
							3.0 KiB
						
					
					
				| #include <malloc.h>
 | |
| #include <string.h>
 | |
| #include <math.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include "analog.h"
 | |
| #include "firehazard.h"
 | |
| #include "graphics/bitmaps.h"
 | |
| #include "liquid.h"
 | |
| #include "graphics/drawing.h"
 | |
| #include "graphics/display_spec.h"
 | |
| 
 | |
| #include "scenes.h"
 | |
| #include "scene_menu.h"
 | |
| 
 | |
| struct Priv {
 | |
|     Scene_paint_t basePaint;
 | |
| };
 | |
| 
 | |
| static struct SceneEvent onSelect(struct MenuScene *self) {
 | |
|     if (self->selected == 0) {
 | |
|         struct NumberSceneOpts *opts = calloc(1, sizeof(struct NumberSceneOpts));
 | |
|         strcpy(opts->unit, "°C");
 | |
|         strcpy(opts->label, "Setpoint");
 | |
|         opts->value = (int) roundf(fire_get_setpoint(false));
 | |
|         opts->min = 0;
 | |
|         opts->max = 350;
 | |
|         return SceneEvent_OpenChild(NewScene_Number(opts), 0);
 | |
|     }
 | |
| 
 | |
|     if (self->selected == 1) {
 | |
|         fire_enable(!fire_enabled());
 | |
|         return SceneEvent_Repaint();
 | |
|     }
 | |
| 
 | |
|     return SceneEvent_None();
 | |
| }
 | |
| 
 | |
| static void priv_deinit(struct MenuScene *self)
 | |
| {
 | |
|     free(self->extra);
 | |
|     self->extra = NULL;
 | |
| }
 | |
| 
 | |
| static struct SceneEvent onChildReturn(struct MenuScene *self, uint32_t tag, int32_t status, void *data)
 | |
| {
 | |
|     if (tag == 0) {
 | |
|         fire_setlevel((float) status);
 | |
|     }
 | |
| 
 | |
|     return SceneEvent_Repaint();
 | |
| }
 | |
| 
 | |
| #define XLINE 40
 | |
| 
 | |
| void print_labels(struct MenuItem *items) {
 | |
|     snprintf(items[0].label, MENUITEM_LABEL_LEN, "▶%.0f°C", fire_get_setpoint(false));
 | |
|     if (fire_enabled()) {
 | |
|         strncpy(items[1].label, "▶STOP", MENUITEM_LABEL_LEN);
 | |
|     } else {
 | |
|         strncpy(items[1].label, "▶START", MENUITEM_LABEL_LEN);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void paint(struct MenuScene *self)
 | |
| {
 | |
|     struct Priv *priv = self->extra;
 | |
| 
 | |
|     print_labels(self->items);
 | |
| 
 | |
|     LCD_clearDisplay(0);
 | |
| 
 | |
|     LCD_setLine(XLINE-1, 0, XLINE-1, LCD_HEIGHT, BLACK);
 | |
| 
 | |
|     char buf[10];
 | |
|     sprintf(buf, "%.0f", analog_read());
 | |
|     // TODO centering
 | |
|     LCD_setStrEx(buf, XLINE/2, 0, BLACK, (struct TextStyle) {.size = FONT_DOUBLE, .align = ALIGN_CENTER});
 | |
|     LCD_setStrEx("°C", XLINE/2, 17, BLACK, (struct TextStyle) {.align = ALIGN_CENTER}); //.size = FONT_BOLD,
 | |
| 
 | |
|     const struct BitmapImage *img;
 | |
|     if (fire_enabled()) {
 | |
|         img = Bitmap_Get("flame");
 | |
|     } else {
 | |
|         img = Bitmap_Get("no_flame");
 | |
|     }
 | |
| 
 | |
|     LCD_setBitmap(img, XLINE/2-24/2, 26, false, BLACK);
 | |
| 
 | |
|     priv->basePaint((struct Scene *) self);
 | |
| }
 | |
| 
 | |
| struct Scene *NewScene_MenuTest() {
 | |
|     struct MenuItem *items = calloc(2, sizeof(struct MenuItem));
 | |
| 
 | |
|     print_labels(items);
 | |
|     
 | |
|     struct MenuScene * scene = NewScene_Menu(items, 2);
 | |
|     scene->onSelect = onSelect;
 | |
| 
 | |
|     scene->x = XLINE;
 | |
|     scene->ncols = 8;
 | |
| 
 | |
|     // private data added by the subclass
 | |
|     struct Priv *priv = calloc(1, sizeof(struct Priv));
 | |
|     priv->basePaint = scene->base.paint;
 | |
|     scene->base.paint = (Scene_paint_t) paint;
 | |
|     scene->extra = priv;
 | |
|     scene->extra_deinit = (Scene_deinit_t) priv_deinit;
 | |
|     scene->wraparound = true;
 | |
| 
 | |
|     // add a child return handler (base does not use this)
 | |
|     scene->base.onChildReturn = (Scene_onChildReturn_t) onChildReturn;
 | |
| 
 | |
|     return (struct Scene *) scene;
 | |
| }
 | |
| 
 |