diff --git a/examples/MicroViewWidgetDemo/MicroViewWidgetDemo.ino b/examples/MicroViewWidgetDemo/MicroViewWidgetDemo.ino
new file mode 100644
index 0000000..d172ad5
--- /dev/null
+++ b/examples/MicroViewWidgetDemo/MicroViewWidgetDemo.ino
@@ -0,0 +1,353 @@
+/*
+ MicroView Arduino Library
+ Copyright (C) 2014 GeekAmmo
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include
+
+// The Arduino build process doesn't create a prototype for the spin function,
+// (probably because it has a function pointer as a parameter)
+// so it's added here.
+void spin(int16_t lowVal, int16_t highVal, int16_t stepSize,
+ unsigned long stepDelay, void (*drawFunction)(int16_t val));
+
+MicroViewWidget *widget1, *widget2;
+
+int16_t prevVal; // previous widget value
+
+void setup() {
+ uView.begin();
+}
+
+void loop() {
+ /* ==================== Demo 1 ====================
+ Horizontal slider style 0, with and without numeric value.
+ Range 0 to 100.
+ ================================================ */
+ demoNumber(1);
+
+ widget1 = new MicroViewSlider(4, 16, 0, 100);
+ widget2 = new MicroViewSlider(4, 32, 0, 100, WIDGETSTYLE0 + WIDGETNOVALUE);
+
+ spin(0, 100, 5, 100, update2widgets);
+
+ delete widget1;
+ delete widget2;
+
+ /* ==================== Demo 2 ====================
+ Horizontal slider style 1, with and without numeric value.
+ Range 100 to 200.
+ ================================================ */
+ demoNumber(2);
+
+ widget1 = new MicroViewSlider(0, 10, 100, 200, WIDGETSTYLE1);
+ widget2 = new MicroViewSlider(0, 32, 100, 200, WIDGETSTYLE1 + WIDGETNOVALUE);
+
+ spin(100, 200, 5, 100, update2widgets);
+
+ delete widget1;
+ delete widget2;
+
+ /* ==================== Demo 3 ====================
+ Vertical slider style 2, with and without numeric value.
+ Range 0 to 5000.
+ ================================================ */
+ demoNumber(3);
+
+ widget1 = new MicroViewSlider(10, 12, 0, 5000, WIDGETSTYLE2);
+ widget2 = new MicroViewSlider(48, 12, 0, 5000, WIDGETSTYLE2 + WIDGETNOVALUE);
+
+ spin(0, 5000, 250, 100, update2widgets);
+
+ delete widget1;
+ delete widget2;
+
+ /* ==================== Demo 4 ====================
+ Vertical slider style 3, with and without numeric value.
+ Range -20 to 20.
+ ================================================ */
+ demoNumber(4);
+
+ widget1 = new MicroViewSlider(16, 4, -20, 20, WIDGETSTYLE3);
+ widget2 = new MicroViewSlider(54, 4, -20, 20, WIDGETSTYLE3 + WIDGETNOVALUE);
+
+ spin(-20, 20, 2, 100, update2widgets);
+
+ delete widget1;
+ delete widget2;
+
+ /* ==================== Demo 5 ====================
+ Gauge style 0, with and without numeric value.
+ Range 0 to 200.
+ ================================================ */
+ demoNumber(5);
+
+ widget1 = new MicroViewGauge(15, 24, 0, 200, WIDGETSTYLE0);
+ widget2 = new MicroViewGauge(48, 24, 0, 200, WIDGETSTYLE0 + WIDGETNOVALUE);
+
+ spin(0, 200, 10, 100, update2widgets);
+
+ delete widget1;
+ delete widget2;
+
+ /* ==================== Demo 6 ====================
+ Gauge style 1, with numeric value.
+ Range -10 to 150.
+ ================================================ */
+ demoNumber(6);
+
+ widget1 = new MicroViewGauge(32, 24, -10, 150, WIDGETSTYLE1);
+
+ spin(-10, 150, 8, 100, update1widget);
+
+ delete widget1;
+
+ /* ==================== Demo 7 ====================
+ Gauge style 1, with no numeric value.
+ Range 0 to 240.
+ ================================================ */
+ demoNumber(7);
+
+ widget1 = new MicroViewGauge(32, 24, 0, 240, WIDGETSTYLE1 + WIDGETNOVALUE);
+
+ spin(0, 240, 4, 33, update1widget);
+
+ delete widget1;
+
+ /* ==================== Demo 8 ====================
+ Slider style 0, with no numeric value.
+ Value manually displayed in hexadecimal.
+ Range 0 to 0xff.
+ ================================================ */
+ demoNumber(8);
+
+ widget1 = new MicroViewSlider(4, 16, 0, 0xff, WIDGETSTYLE0 + WIDGETNOVALUE);
+
+ spin(0, 0xff, 5, 39, customSlider0);
+
+ delete widget1;
+
+ /* ==================== Demo 9 ====================
+ Slider style 1, with no numeric value.
+ Value manually displayed, centred above the slider.
+ Range -30000 to 30000.
+ ================================================ */
+ demoNumber(9);
+
+ widget1 = new MicroViewSlider(2, 24, -30000, 30000, WIDGETSTYLE1 + WIDGETNOVALUE);
+
+ spin(-30000, 30000, 1500, 50, customSlider1);
+
+ delete widget1;
+
+ /* ==================== Demo 10 ====================
+ Slider style 2, with no numeric value.
+ Value manually displayed.
+ Pointer moves from low at the top to high at the bottom.
+ Range 0 to 600.
+ Note: The widget getValue() method will return a wrong
+ value. It is changed to reverse the pointer direction.
+ ================================================ */
+ demoNumber(10);
+
+ widget1 = new MicroViewSlider(20, 10, 0, 600, WIDGETSTYLE2 + WIDGETNOVALUE);
+
+ spin(0, 600, 30, 100, customSlider2);
+
+ delete widget1;
+
+ /* ==================== Demo 11 ====================
+ Slider style 3, with no numeric value.
+ Value manually displayed, beside the pointer.
+ Range 0 to 11.
+ "These go to eleven!" - Nigel Tufnel of Spinal Tap.
+ ================================================ */
+ demoNumber(11);
+
+ widget1 = new MicroViewSlider(24, 2, 0, 11, WIDGETSTYLE3 + WIDGETNOVALUE);
+ prevVal = widget1->getValue();
+
+ spin(0, 11, 1, 250, customSlider3);
+
+ delete widget1;
+
+ /* ==================== Demo 12 ====================
+ Gauge style 0, with no numeric value.
+ Value manually displayed beneath, with a decimal point,
+ in a larger font.
+ "km/h" added to the bottom of the gauge.
+ For simplicity, the range and values are actually
+ 10 times what is to be displayed, so they can be set,
+ stored and manipulated as integers.
+ Range 0.0 to 20.0 (actually 0 to 200).
+ ================================================ */
+ demoNumber(12);
+
+ widget1 = new MicroViewGauge(35, 17, 0, 200, WIDGETSTYLE0 + WIDGETNOVALUE);
+
+ // draw the fixed "km/h" text
+ uView.setCursor(widget1->getX() - 11, widget1->getY() + 11);
+ uView.print("km/h");
+
+ spin(0, 200, 1, 40, customGauge0);
+
+ delete widget1;
+
+ /* ==================== Demo 13 ====================
+ Gauge style 1, with no numeric value.
+ Value manually displayed beneath, as a letter.
+ Range 1 to 26 (A to Z).
+ ================================================ */
+ demoNumber(13);
+
+ widget1 = new MicroViewGauge(36, 24, 1, 26, WIDGETSTYLE1 + WIDGETNOVALUE);
+
+ spin( 1, 26, 1, 200, customGauge1);
+
+ delete widget1;
+
+/* ================== end of loop() ================== */
+}
+
+// Function to update widget1
+void update1widget(int16_t val) {
+ widget1->setValue(val);
+}
+
+// Function to update widget1 and widget2
+void update2widgets(int16_t val) {
+ widget1->setValue(val);
+ widget2->setValue(val);
+}
+
+// Update function for Demo 8
+void customSlider0(int16_t val) {
+ widget1->setValue(val);
+ uView.setCursor(widget1->getX() + 34, widget1->getY() + 1);
+ uView.print("0x");
+ if (val < 0x10) { // add leading 0 if necessary. Only 2 digits supported.
+ uView.print('0');
+ }
+ uView.print(val, HEX);
+}
+
+// Update function for Demo 9
+void customSlider1(int16_t val) {
+ uint8_t offsetY = widget1->getY() - 10;
+ uint8_t offsetX = widget1->getX() + 14;
+ uView.setCursor(offsetX, offsetY);
+ uView.print(" "); // erase the previous value in case it's longer
+ // calculate the offset to centre the value
+ offsetX += ((widget1->getMaxValLen() - getInt16PrintLen(val)) * 3);
+ uView.setCursor(offsetX, offsetY);
+ uView.print(val);
+ widget1->setValue(val);
+}
+
+// Update function for Demo 10
+void customSlider2(int16_t val) {
+ uView.setCursor(widget1->getX() + 1, widget1->getY() + 24);
+ widget1->drawNumValue(val);
+ // calculate to reverse the pointer direction
+ widget1->setValue((int16_t) ((int32_t) widget1->getMaxValue() +
+ (int32_t) widget1->getMinValue() -
+ (int32_t) val));
+}
+
+// Update function for Demo 11
+void customSlider3(int16_t val) {
+ int16_t maxVal = widget1->getMaxValue();
+ uint16_t range = (uint16_t) (maxVal - widget1->getMinValue());
+ uint8_t offsetX = widget1->getX() + 9;
+
+ // erase previous value.
+ // pointer position is calculated the same way as the widget code.
+ uint8_t offsetY = (float)(uint16_t)(maxVal - prevVal) / (float)range * 40;
+ uView.setCursor(offsetX, offsetY);
+ uView.print(" "); // This is being lazy. Should calculate width for value.
+
+ // draw new value
+ offsetY = (float)(uint16_t)(maxVal - val) / (float)range * 40;
+ uView.setCursor(offsetX, offsetY);
+ widget1->drawNumValue(val);
+
+ widget1->setValue(val);
+}
+
+// Update function for Demo 12
+void customGauge0(int16_t val) {
+ widget1->setValue(val);
+
+ uView.setCursor(widget1->getX() - 17, widget1->getY() + 19);
+ uView.setFontType(1);
+ // add leading space if necessary, to right justify.
+ // only 2 digit (plus decimal) numbers are supported.
+ if (val < 100) {
+ uView.print(' ');
+ }
+ uView.print((float)val / 10, 1);
+ uView.setFontType(0);
+}
+
+// Update function for Demo 13
+void customGauge1(int16_t val) {
+ widget1->setValue(val);
+ uView.setCursor(widget1->getX() - 2, widget1->getY() + 9);
+ uView.print((char)(val + 'A' - 1));
+}
+
+// Clear the screen buffer and draw the demo number in the corner
+void demoNumber(int num) {
+ uView.clear(PAGE);
+ uView.setCursor(0, 0);
+ uView.print(num);
+ uView.print(":");
+}
+
+// Spin up, then down, through the values.
+//
+// For each value, call the update function and display the new screen.
+void spin(int16_t lowVal, int16_t highVal, int16_t stepSize,
+ unsigned long stepDelay, void (*drawFunction)(int16_t val)) {
+ drawFunction(lowVal);
+ uView.display();
+ delay(1500);
+
+ for (int16_t i = lowVal + stepSize; i <= highVal; i += stepSize) {
+ drawFunction(i);
+ uView.display();
+ prevVal = i;
+ delay(stepDelay);
+ if ((i == 0) && (lowVal != 0)) { // pause briefly for a value of 0
+ delay(750);
+ }
+ }
+
+ delay(1500);
+
+ for (int16_t i = highVal; i >= lowVal; i -= stepSize) {
+ drawFunction(i);
+ uView.display();
+ prevVal = i;
+ delay(stepDelay);
+ if ((i == 0) && (lowVal != 0)) { // pause briefly for a value of 0
+ delay(750);
+ }
+ }
+
+ delay(1500);
+}
+