add display fade logic via a task
This commit is contained in:
		
							parent
							
								
									86edbbc541
								
							
						
					
					
						commit
						4ce4739ab0
					
				
					 2 changed files with 65 additions and 2 deletions
				
			
		|  | @ -58,9 +58,15 @@ void Display::setupTouchScreen(){ | ||||||
|     touch.begin(128); // Initialize touchscreen and set sensitivity threshold
 |     touch.begin(128); // Initialize touchscreen and set sensitivity threshold
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Display::setBrightness(uint8_t brigthness) | void Display::setBrightness(uint8_t brightness) | ||||||
| { | { | ||||||
|     ledcWrite(LCD_BACKLIGHT_LEDC_CHANNEL, brigthness); |   mAwakeBrightness = brightness; | ||||||
|  |   startFade(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Display::setCurrentBrightness(uint8_t brightness){ | ||||||
|  |   mBrightness = brightness; | ||||||
|  |   ledcWrite(LCD_BACKLIGHT_LEDC_CHANNEL, mBrightness); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Display::turnOff() | void Display::turnOff() | ||||||
|  | @ -102,6 +108,40 @@ void Display::screenInput(lv_indev_drv_t *indev_driver, lv_indev_data_t *data){ | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Display::fadeImpl(void* ){ | ||||||
|  |   bool fadeDone = false; | ||||||
|  |   while(!fadeDone){ | ||||||
|  |     fadeDone = getInstance()->fade(); | ||||||
|  |     vTaskDelay(3 / portTICK_PERIOD_MS); // 3 miliseconds between steps 
 | ||||||
|  |     // 0 - 255 will take about .75 seconds to fade up. 
 | ||||||
|  |   } | ||||||
|  |   vTaskDelete(getInstance()->mDisplayFadeTask); | ||||||
|  |   getInstance()->mDisplayFadeTask = nullptr; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool Display::fade(){ | ||||||
|  |   //Early return no fade needed. 
 | ||||||
|  |   if (mBrightness == mAwakeBrightness || | ||||||
|  |       isAsleep && mBrightness == 0){return true;}  | ||||||
|  |    | ||||||
|  |   bool fadeDown = isAsleep || mBrightness > mAwakeBrightness;  | ||||||
|  |   if (fadeDown){ | ||||||
|  |     setCurrentBrightness(mBrightness - 1); | ||||||
|  |     auto setPoint = isAsleep ? 0 : mAwakeBrightness; | ||||||
|  |     return mBrightness == setPoint; | ||||||
|  |   }else{ | ||||||
|  |     setCurrentBrightness(mBrightness + 1); | ||||||
|  |     return mBrightness == mAwakeBrightness; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Display::startFade(){ | ||||||
|  |   if(mDisplayFadeTask != nullptr){// Already have fade task no need to start another.
 | ||||||
|  |     xTaskCreate(&Display::fadeImpl, "Display Fade Task", | ||||||
|  |                   1024, nullptr, 5, &mDisplayFadeTask); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Display::flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { | void Display::flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) { | ||||||
|   uint32_t w = (area->x2 - area->x1 + 1); |   uint32_t w = (area->x2 - area->x1 + 1); | ||||||
|   uint32_t h = (area->y2 - area->y1 + 1); |   uint32_t h = (area->y2 - area->y1 + 1); | ||||||
|  |  | ||||||
|  | @ -22,15 +22,31 @@ class Display: public DisplayAbstract | ||||||
|     public: |     public: | ||||||
|         static std::shared_ptr<Display> getInstance(); |         static std::shared_ptr<Display> getInstance(); | ||||||
|          |          | ||||||
|  |         /// @brief Set brightness setting and fade to it
 | ||||||
|  |         /// @param brightness 
 | ||||||
|         virtual void setBrightness(uint8_t brightness) override; |         virtual void setBrightness(uint8_t brightness) override; | ||||||
|         virtual void turnOff() override; |         virtual void turnOff() override; | ||||||
|      |      | ||||||
|         void onTouch(Notification<TS_Point>::HandlerTy aTouchHandler); |         void onTouch(Notification<TS_Point>::HandlerTy aTouchHandler); | ||||||
| 
 | 
 | ||||||
|  |         void wake() {isAsleep = false; startFade();} | ||||||
|  |         void sleep() {isAsleep = true; startFade();} | ||||||
|  | 
 | ||||||
|     protected: |     protected: | ||||||
|         virtual void flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p); |         virtual void flushDisplay(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p); | ||||||
|         virtual void screenInput(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) override; |         virtual void screenInput(lv_indev_drv_t *indev_driver, lv_indev_data_t *data) override; | ||||||
|          |          | ||||||
|  |         /// @brief Fade toward brightness based on isAwake
 | ||||||
|  |         /// @return True - Fade complete
 | ||||||
|  |         ///         False - Fade set point not reached 
 | ||||||
|  |         bool fade(); | ||||||
|  |         /// @brief Start the Fade task 
 | ||||||
|  |         void startFade(); | ||||||
|  |          | ||||||
|  |         /// @brief Set the actual display brightness right now
 | ||||||
|  |         /// @param brightness 
 | ||||||
|  |         void setCurrentBrightness(uint8_t brightness); | ||||||
|  | 
 | ||||||
|     private: |     private: | ||||||
|         Display(int backlight_pin, int enable_pin); |         Display(int backlight_pin, int enable_pin); | ||||||
|         void setupTFT(); |         void setupTFT(); | ||||||
|  | @ -44,4 +60,11 @@ class Display: public DisplayAbstract | ||||||
|         TS_Point touchPoint; |         TS_Point touchPoint; | ||||||
|         TS_Point oldPoint; |         TS_Point oldPoint; | ||||||
|         Notification<TS_Point> mTouchEvent; |         Notification<TS_Point> mTouchEvent; | ||||||
|  | 
 | ||||||
|  |         TaskHandle_t mDisplayFadeTask = nullptr; | ||||||
|  |         static void fadeImpl(void* aBrightness); | ||||||
|  | 
 | ||||||
|  |         uint8_t mBrightness = 0; // Current display brightness
 | ||||||
|  |         uint8_t mAwakeBrightness = 100; // Current setting for brightness when awake
 | ||||||
|  |         bool isAsleep = false; | ||||||
| }; | }; | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue