#ifndef __screen #define __screen #include class ScreenManager; class BaseScreen { private: ScreenManager* mScreenManager; protected: ScreenManager* getScreenManager(); uint32_t getCurrentTime(); LiquidCrystal* getDisplay(); public: BaseScreen(ScreenManager* screenManager) { mScreenManager = screenManager; } virtual ~BaseScreen() {} virtual void onShow() = 0; virtual void onHide() = 0; virtual void onButton() = 0; virtual void onEncoder(int32_t lastPosition, int32_t newPosition) = 0; virtual void onTick() = 0; }; class ScreenManager { private: LiquidCrystal* mDisplay; uint32_t* mCurrentTime; BaseScreen* mCurrent = NULL; public: ScreenManager(LiquidCrystal* display, uint32_t* currentTime) { mDisplay = display; mCurrentTime = currentTime; } inline BaseScreen* getCurrent() { return mCurrent; } inline uint32_t getCurrentTime() { return *mCurrentTime; } inline LiquidCrystal* getDisplay() { return mDisplay; } template void show() { if (mCurrent != NULL) { mCurrent->onHide(); delete mCurrent; } mCurrent = new T(this); mCurrent->onShow(); } }; #endif