ThingPulse OLED SSD1306
Dependents: Turtle_RadioShuttle mbed-os5-F303-18650-Manager-tp4056 Kretanje_kroz_izbornike_OLED128x64_4tipke
Diff: OLEDDisplayUi.h
- Revision:
- 0:56dd5df33ab4
- Child:
- 1:9270c15c6aea
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OLEDDisplayUi.h Wed Apr 10 14:15:31 2019 +0000
@@ -0,0 +1,313 @@
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn
+ * Copyright (c) 2018 by Fabrice Weinberg
+ * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * ThingPulse invests considerable time and money to develop these open source libraries.
+ * Please support us by buying our products (and not the clones) from
+ * https://thingpulse.com
+ *
+ */
+
+#ifndef OLEDDISPLAYUI_h
+#define OLEDDISPLAYUI_h
+
+#ifdef ARDUINO
+#include <Arduino.h>
+#elif __MBED__
+#include <mbed.h>
+#else
+#error "Unkown operating system"
+#endif
+
+#include "OLEDDisplay.h"
+
+//#define DEBUG_OLEDDISPLAYUI(...) Serial.printf( __VA_ARGS__ )
+
+#ifndef DEBUG_OLEDDISPLAYUI
+#define DEBUG_OLEDDISPLAYUI(...)
+#endif
+
+enum AnimationDirection {
+ SLIDE_UP,
+ SLIDE_DOWN,
+ SLIDE_LEFT,
+ SLIDE_RIGHT
+};
+
+enum IndicatorPosition {
+ TOP,
+ RIGHT,
+ BOTTOM,
+ LEFT
+};
+
+enum IndicatorDirection {
+ LEFT_RIGHT,
+ RIGHT_LEFT
+};
+
+enum FrameState {
+ IN_TRANSITION,
+ FIXED
+};
+
+
+const uint8_t ANIMATION_activeSymbol[] PROGMEM = {
+ 0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00
+};
+
+const uint8_t ANIMATION_inactiveSymbol[] PROGMEM = {
+ 0x00, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x00
+};
+
+
+// Structure of the UiState
+struct OLEDDisplayUiState {
+ uint64_t lastUpdate;
+ uint16_t ticksSinceLastStateSwitch;
+
+ FrameState frameState;
+ uint8_t currentFrame;
+
+ bool isIndicatorDrawen;
+
+ // Normal = 1, Inverse = -1;
+ int8_t frameTransitionDirection;
+
+ bool manuelControll;
+
+ // Custom data that can be used by the user
+ void* userData;
+};
+
+struct LoadingStage {
+ const char* process;
+ void (*callback)();
+};
+
+typedef void (*FrameCallback)(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);
+typedef void (*OverlayCallback)(OLEDDisplay *display, OLEDDisplayUiState* state);
+typedef void (*LoadingDrawFunction)(OLEDDisplay *display, LoadingStage* stage, uint8_t progress);
+
+class OLEDDisplayUi {
+ private:
+ OLEDDisplay *display;
+
+ // Symbols for the Indicator
+ IndicatorPosition indicatorPosition;
+ IndicatorDirection indicatorDirection;
+
+ const uint8_t* activeSymbol;
+ const uint8_t* inactiveSymbol;
+
+ bool shouldDrawIndicators;
+
+ // Values for the Frames
+ AnimationDirection frameAnimationDirection;
+
+ int8_t lastTransitionDirection;
+
+ uint16_t ticksPerFrame; // ~ 5000ms at 30 FPS
+ uint16_t ticksPerTransition; // ~ 500ms at 30 FPS
+
+ bool autoTransition;
+
+ FrameCallback* frameFunctions;
+ uint8_t frameCount;
+
+ // Internally used to transition to a specific frame
+ int8_t nextFrameNumber;
+
+ // Values for Overlays
+ OverlayCallback* overlayFunctions;
+ uint8_t overlayCount;
+
+ // Will the Indicator be drawen
+ // 3 Not drawn in both frames
+ // 2 Drawn this frame but not next
+ // 1 Not drown this frame but next
+ // 0 Not known yet
+ uint8_t indicatorDrawState;
+
+ // Loading screen
+ LoadingDrawFunction loadingDrawFunction;
+
+ // UI State
+ OLEDDisplayUiState state;
+
+ // Bookeeping for update
+ uint8_t updateInterval;
+
+ uint8_t getNextFrameNumber();
+ void drawIndicator();
+ void drawFrame();
+ void drawOverlays();
+ void tick();
+ void resetState();
+
+ public:
+
+ OLEDDisplayUi(OLEDDisplay *display);
+
+ /**
+ * Initialise the display
+ */
+ void init();
+
+ /**
+ * Configure the internal used target FPS
+ */
+ void setTargetFPS(uint8_t fps);
+
+ // Automatic Controll
+ /**
+ * Enable automatic transition to next frame after the some time can be configured with `setTimePerFrame` and `setTimePerTransition`.
+ */
+ void enableAutoTransition();
+
+ /**
+ * Disable automatic transition to next frame.
+ */
+ void disableAutoTransition();
+
+ /**
+ * Set the direction if the automatic transitioning
+ */
+ void setAutoTransitionForwards();
+ void setAutoTransitionBackwards();
+
+ /**
+ * Set the approx. time a frame is displayed
+ */
+ void setTimePerFrame(uint16_t time);
+
+ /**
+ * Set the approx. time a transition will take
+ */
+ void setTimePerTransition(uint16_t time);
+
+ // Customize indicator position and style
+
+ /**
+ * Draw the indicator.
+ * This is the defaut state for all frames if
+ * the indicator was hidden on the previous frame
+ * it will be slided in.
+ */
+ void enableIndicator();
+
+ /**
+ * Don't draw the indicator.
+ * This will slide out the indicator
+ * when transitioning to the next frame.
+ */
+ void disableIndicator();
+
+ /**
+ * Enable drawing of indicators
+ */
+ void enableAllIndicators();
+
+ /**
+ * Disable draw of indicators.
+ */
+ void disableAllIndicators();
+
+ /**
+ * Set the position of the indicator bar.
+ */
+ void setIndicatorPosition(IndicatorPosition pos);
+
+ /**
+ * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING
+ */
+ void setIndicatorDirection(IndicatorDirection dir);
+
+ /**
+ * Set the symbol to indicate an active frame in the indicator bar.
+ */
+ void setActiveSymbol(const uint8_t* symbol);
+
+ /**
+ * Set the symbol to indicate an inactive frame in the indicator bar.
+ */
+ void setInactiveSymbol(const uint8_t* symbol);
+
+
+ // Frame settings
+
+ /**
+ * Configure what animation is used to transition from one frame to another
+ */
+ void setFrameAnimation(AnimationDirection dir);
+
+ /**
+ * Add frame drawing functions
+ */
+ void setFrames(FrameCallback* frameFunctions, uint8_t frameCount);
+
+ // Overlay
+
+ /**
+ * Add overlays drawing functions that are draw independent of the Frames
+ */
+ void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount);
+
+
+ // Loading animation
+ /**
+ * Set the function that will draw each step
+ * in the loading animation
+ */
+ void setLoadingDrawFunction(LoadingDrawFunction loadingFunction);
+
+
+ /**
+ * Run the loading process
+ */
+ void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount);
+
+
+ // Manual Control
+ void nextFrame();
+ void previousFrame();
+
+ /**
+ * Switch without transition to frame `frame`.
+ */
+ void switchToFrame(uint8_t frame);
+
+ /**
+ * Transition to frame `frame`, when the `frame` number is bigger than the current
+ * frame the forward animation will be used, otherwise the backwards animation is used.
+ */
+ void transitionToFrame(uint8_t frame);
+
+ // State Info
+ OLEDDisplayUiState* getUiState();
+
+ int8_t update();
+};
+#endif
+
Helmut Tschemernjak