Multicore & Modularized
This commit is contained in:
		
							
								
								
									
										127
									
								
								src/display/display.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/display/display.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
			
		||||
#include "display.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t *BlackImage = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int8_t view_count = -1;
 | 
			
		||||
static int8_t view_curr = 0;
 | 
			
		||||
static DisplayWrapper** views = 0;
 | 
			
		||||
 | 
			
		||||
void Display::setup(){
 | 
			
		||||
    DEV_Module_Init();
 | 
			
		||||
    EPD_2IN13_V2_Init(EPD_2IN13_V2_FULL);
 | 
			
		||||
    EPD_2IN13_V2_Clear();
 | 
			
		||||
    delay(100);
 | 
			
		||||
 | 
			
		||||
    uint16_t Imagesize = ((EPD_2IN13_V2_WIDTH % 8 == 0) ? (EPD_2IN13_V2_WIDTH / 8 ) : (EPD_2IN13_V2_WIDTH / 8 + 1)) * EPD_2IN13_V2_HEIGHT;
 | 
			
		||||
    if ((BlackImage = (uint8_t *)malloc(Imagesize)) == NULL) exit(1);
 | 
			
		||||
    Paint_NewImage(BlackImage, EPD_2IN13_V2_WIDTH, EPD_2IN13_V2_HEIGHT, 270, WHITE);
 | 
			
		||||
    Paint_SelectImage(BlackImage);
 | 
			
		||||
    Paint_SetMirroring(MIRROR_HORIZONTAL);
 | 
			
		||||
    Paint_Clear(WHITE);
 | 
			
		||||
 | 
			
		||||
    Paint_DrawIcon(89,54, ICON_LOGO, &FontIcon, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawString_EN(29, 5, "Helcel", &Font45, WHITE, BLACK);
 | 
			
		||||
    Paint_SelectImage(BlackImage);
 | 
			
		||||
    EPD_2IN13_V2_Display(BlackImage);
 | 
			
		||||
    delay(100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Display::drawTime(strDateTime* dt){
 | 
			
		||||
    Paint_ClearWindows(170, EPD_2IN13_V2_WIDTH - Font24.Height, 170 + Font24.Width * 4.5, EPD_2IN13_V2_WIDTH, WHITE);
 | 
			
		||||
    if (!dt->valid) return;
 | 
			
		||||
    Paint_DrawTime(170, 98, dt, &Font24, WHITE, BLACK);
 | 
			
		||||
    EPD_2IN13_V2_DisplayPart(BlackImage);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void Display::refresh(){
 | 
			
		||||
    Paint_Clear(WHITE);
 | 
			
		||||
    EPD_2IN13_V2_Init(EPD_2IN13_V2_FULL);
 | 
			
		||||
    EPD_2IN13_V2_DisplayPartBaseImage(BlackImage);
 | 
			
		||||
    EPD_2IN13_V2_Init(EPD_2IN13_V2_PART);
 | 
			
		||||
    Paint_SelectImage(BlackImage);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void Display::update(){
 | 
			
		||||
    Paint_ClearWindows(0, 0, EPD_2IN13_V2_HEIGHT, EPD_2IN13_V2_WIDTH - Font24.Height, WHITE);
 | 
			
		||||
    Paint_ClearWindows(0, EPD_2IN13_V2_WIDTH - Font24.Height, 170, EPD_2IN13_V2_WIDTH, WHITE);
 | 
			
		||||
    if(views && view_curr >=0)
 | 
			
		||||
      views[view_curr]->drawDisplay();
 | 
			
		||||
    EPD_2IN13_V2_DisplayPart(BlackImage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Display::setViews(DisplayWrapper** view_tab, int8_t size){
 | 
			
		||||
    view_count = size;
 | 
			
		||||
    views = view_tab;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void Display::nextView(){ view_curr++; view_curr = view_curr%view_count;}
 | 
			
		||||
void Display::prevView(){ view_curr--; view_curr = (view_curr+view_count) % view_count;}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
ICON_tpe getWeatherIcon(int id){
 | 
			
		||||
  if(id>=200 && id<300){ //Thunder
 | 
			
		||||
    return ICON_CLOUD_THUNDER;
 | 
			
		||||
  }else if(id>=300 && id<400){//Drizzle
 | 
			
		||||
    return ICON_CLOUD_RAIN;
 | 
			
		||||
  }else if(id>=500 && id<600){//Rain
 | 
			
		||||
    return ICON_CLOUD_RAIN;
 | 
			
		||||
  }else if(id>=600 && id<700){//Snow
 | 
			
		||||
    return ICON_CLOUD_SNOW;
 | 
			
		||||
  }else if(id>=700 && id<800){//Warning
 | 
			
		||||
    return ICON_WARN;
 | 
			
		||||
  }else if(id>=800 && id<900){//Clear & Cloudy
 | 
			
		||||
    if(id==800)      return ICON_SUN;
 | 
			
		||||
    else if(id==801) return ICON_CLOUD_SUN;
 | 
			
		||||
    else             return ICON_CLOUD;
 | 
			
		||||
  }else{
 | 
			
		||||
    return ICON_WARN;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void WeatherDisplay::drawDisplay() {
 | 
			
		||||
    if(cowm == NULL || !cowm->valid_weather) return;
 | 
			
		||||
    JsonObject weather_0 = cowm->weather["weather"][0];
 | 
			
		||||
    JsonObject weather_main = cowm->weather["main"];
 | 
			
		||||
    JsonObject weather_wind = cowm->weather["wind"];
 | 
			
		||||
    JsonObject weather_sys = cowm->weather["sys"];
 | 
			
		||||
    if(!weather_0 || !weather_main || !weather_sys || !weather_wind) return;
 | 
			
		||||
    Paint_DrawIcon(0,8, getWeatherIcon(weather_0["id"]), &FontIcon, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawString_EN(2,EPD_2IN13_V2_WIDTH - 4 - Font16.Height,weather_0["description"], &Font16, WHITE, BLACK);
 | 
			
		||||
    Paint_DrawFltUnit(76,0,weather_main["temp"], "C", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawFltUnit(186,6,weather_main["feels_like"], "C", &Font12, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawIntUnit(76,24,weather_main["pressure"], "hPa", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawIntUnit(76,48,weather_main["humidity"], "%", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawFltUnit(76,72,weather_wind["speed"], "m/s", &Font24, BLACK, WHITE);
 | 
			
		||||
    strDateTime sunrisedt = NTPtime::ConvertUnixTimestamp(NTPtime::adjustTimeZone(weather_sys["sunrise"], 1.0, 1));
 | 
			
		||||
    strDateTime sunsetdt  = NTPtime::ConvertUnixTimestamp(NTPtime::adjustTimeZone(weather_sys["sunset"], 1.0, 1));
 | 
			
		||||
    Paint_DrawTime(20, 6, &sunrisedt, &Font12, WHITE, BLACK);
 | 
			
		||||
    Paint_DrawTime(20, 76, &sunsetdt, &Font12, WHITE, BLACK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TempDisplay::drawDisplay() { 
 | 
			
		||||
    Paint_DrawIcon(0,Font24.Height, ICON_TEMPERATURE,&FontIcon, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawString_EN(2,0,"Temp", &Font24, WHITE, BLACK);
 | 
			
		||||
    Paint_DrawFltUnit(76,0,sensor->heatidx, "C", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawFltUnit(76,36,sensor->temp, "C", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawFltUnit(160,36,sensor->hum, "%", &Font24, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawFltUnit(76,64,sensor->pres, "hPa", &Font24, BLACK, WHITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void AirDisplay::drawDisplay() { 
 | 
			
		||||
    Paint_DrawIcon(0,Font24.Height, ICON_POLUTION,&FontIcon, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawString_EN(2,0,"Air", &Font24, WHITE, BLACK);
 | 
			
		||||
    Paint_DrawIntUnit(150,10, 69,"", &Font24, BLACK, WHITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainDisplay::drawDisplay() { 
 | 
			
		||||
    Paint_DrawIcon(0,0, ICON_LOGO,&FontIcon, BLACK, WHITE);
 | 
			
		||||
    Paint_DrawString_EN(60,0,"MAIN", &Font24, WHITE, BLACK);
 | 
			
		||||
    Paint_DrawIntUnit(0,30, 69,"", &Font24, BLACK, WHITE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CustomDisplay::drawDisplay() { 
 | 
			
		||||
    Paint_DrawString_EN(60,0,"CUSTOM", &Font24, WHITE, BLACK);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								src/display/display.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								src/display/display.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
#ifndef TG_DISPLAY_H
 | 
			
		||||
#define TG_DISPLAY_H
 | 
			
		||||
 | 
			
		||||
#include "../epd/epd_cfg.h"
 | 
			
		||||
#include "../epd/epd_driver.h"
 | 
			
		||||
#include "../epd/epd_paint.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "../ntp/ntp.h"
 | 
			
		||||
#include "../owm/owm.h"
 | 
			
		||||
#include "../sensor/sensor.h" 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
#include <Wire.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <WiFi.h>
 | 
			
		||||
#include <WiFiMulti.h>
 | 
			
		||||
class DisplayWrapper {
 | 
			
		||||
  public:
 | 
			
		||||
    virtual void drawDisplay();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class Display {
 | 
			
		||||
  public:
 | 
			
		||||
    static void setup();
 | 
			
		||||
    static void drawTime(strDateTime* dt);
 | 
			
		||||
    static void refresh();
 | 
			
		||||
    static void update();
 | 
			
		||||
    static void setViews(DisplayWrapper** views, int8_t size);
 | 
			
		||||
 | 
			
		||||
    static void nextView();
 | 
			
		||||
    static void prevView();
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
class WeatherDisplay: public DisplayWrapper {
 | 
			
		||||
   public:
 | 
			
		||||
        WeatherDisplay(OWM* o) : cowm(o){}
 | 
			
		||||
        void drawDisplay();
 | 
			
		||||
    private:
 | 
			
		||||
        OWM* cowm;
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class TempDisplay: public DisplayWrapper {
 | 
			
		||||
    public:
 | 
			
		||||
        TempDisplay(Sensor* s) : sensor(s){}
 | 
			
		||||
        void drawDisplay();
 | 
			
		||||
    private:
 | 
			
		||||
        Sensor* sensor;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AirDisplay: public DisplayWrapper {
 | 
			
		||||
    public:
 | 
			
		||||
        AirDisplay(Sensor* s) : sensor(s){}
 | 
			
		||||
        void drawDisplay();
 | 
			
		||||
    private:
 | 
			
		||||
        Sensor* sensor;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class MainDisplay: public DisplayWrapper {
 | 
			
		||||
    public:
 | 
			
		||||
        void drawDisplay();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CustomDisplay: public DisplayWrapper {
 | 
			
		||||
    public:
 | 
			
		||||
        void drawDisplay();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user