parent
d16bcced8d
commit
5a94ed2816
@ -0,0 +1,213 @@ |
|||||||
|
# ScreenUi |
||||||
|
Automatically exported from code.google.com/p/screenui |
||||||
|
|
||||||
|
``` |
||||||
|
// A Sketch demonstrating ScreenUi using a 20x4 character LCD for output and |
||||||
|
// a rotary encoder with pushbutton for input. |
||||||
|
|
||||||
|
#include <pin.h> |
||||||
|
#include <encoder.h> |
||||||
|
#include <LiquidCrystalFP.h> |
||||||
|
// This is the only required include for ScreenUi. |
||||||
|
// The others above are for a specific set of hardware input |
||||||
|
// and output. |
||||||
|
#include <ScreenUi.h> |
||||||
|
|
||||||
|
// Set up the rotary encoder and LCD. |
||||||
|
#define ENCODER_TYPE ALPS |
||||||
|
|
||||||
|
#define ENCA_PIN 3 |
||||||
|
#define ENCB_PIN 2 |
||||||
|
#define ENTER_PIN 1 |
||||||
|
|
||||||
|
#define LCD_RS_PIN 4 |
||||||
|
#define LCD_ENABLE_PIN 23 |
||||||
|
#define LCD_DATA4_PIN 28 |
||||||
|
#define LCD_DATA5_PIN 29 |
||||||
|
#define LCD_DATA6_PIN 30 |
||||||
|
#define LCD_DATA7_PIN 31 |
||||||
|
|
||||||
|
#define LCD_BRIGHT_PIN 13 |
||||||
|
#define LCD_CONTRAST_PIN 14 |
||||||
|
|
||||||
|
LiquidCrystal lcd(LCD_RS_PIN, LCD_ENABLE_PIN, LCD_DATA4_PIN, LCD_DATA5_PIN, LCD_DATA6_PIN, LCD_DATA7_PIN); |
||||||
|
|
||||||
|
void setup() { |
||||||
|
// Everything here is for setting up the hardware. Nothing ScreenUi specific here. |
||||||
|
lcd.begin(20, 4); |
||||||
|
TCCR2B = 0x01; |
||||||
|
pinMode(LCD_BRIGHT_PIN, OUTPUT); |
||||||
|
pinMode(LCD_CONTRAST_PIN, OUTPUT); |
||||||
|
setBright(128); |
||||||
|
setContrast(98); |
||||||
|
Encoder.begin(ENCODER_TYPE, ENTER_PIN, ENCA_PIN, ENCB_PIN); |
||||||
|
Encoder.setWrap(true); |
||||||
|
Encoder.setMin(-10000); |
||||||
|
Encoder.setMax(10000); |
||||||
|
Encoder.setCount(0); |
||||||
|
Serial.begin(9600); |
||||||
|
Serial.println(); |
||||||
|
Serial.println(); |
||||||
|
Serial.println(); |
||||||
|
} |
||||||
|
|
||||||
|
// The loop() function is where all the ScreenUi magic happens. We'll create a |
||||||
|
// Screen, display it to the user, allow the user to interact and we'll take |
||||||
|
// input from the Components. |
||||||
|
void loop() { |
||||||
|
// Create a new Screen with width 20, height 4. |
||||||
|
Screen screen(20, 4); |
||||||
|
|
||||||
|
Label lbls[32]; |
||||||
|
|
||||||
|
// Some static text that will be at the top of the screen. |
||||||
|
Label titleLabel("RGB Settings"); |
||||||
|
|
||||||
|
// An Input field and a Label to describe it. We pass in the text "0xffee" and |
||||||
|
// any changes the user makes to that text will be reflected in the address |
||||||
|
// variable. |
||||||
|
Label addressLabel("Address:"); |
||||||
|
char *address = "0xffee"; |
||||||
|
Input addressInput(address); |
||||||
|
|
||||||
|
// A List field and a Label to describe it. We add three items to the List for |
||||||
|
// the user to select from. |
||||||
|
Label colorLabel("Color:"); |
||||||
|
List colorList(7); |
||||||
|
colorList.addItem("Red"); |
||||||
|
colorList.addItem("Orange"); |
||||||
|
colorList.addItem("Yellow"); |
||||||
|
|
||||||
|
// A Checkbox field and a Label to describe it. |
||||||
|
Label rgbEnabledLabel("RGB Enabled:"); |
||||||
|
Checkbox rgbEnabledCheckbox; |
||||||
|
|
||||||
|
Label brightnessLabel("Brightness:"); |
||||||
|
Spinner brightnessSpinner(128, 0, 255, 1, true); |
||||||
|
|
||||||
|
Label contrastLabel("Contrast:"); |
||||||
|
Spinner contrastSpinner(128, 0, 255, 1, true); |
||||||
|
|
||||||
|
// A ScrollContainer to allow scrolling through multiple Components. Since our |
||||||
|
// screen is only 4 lines high but we want to show 5 lines of Components, we add |
||||||
|
// three of the widgets to the ScrollContainer. The ScrollContainer will appear |
||||||
|
// in the middle two lines of the display and allow the user to scroll through |
||||||
|
// as many Components as we like. |
||||||
|
// This line creates the ScrollContainer, passing the screen it will be attached |
||||||
|
// to and the width and height for the new ScrollContainer. |
||||||
|
ScrollContainer scrollContainer(&screen, screen.width(), 2); |
||||||
|
// Add the Components to the ScrollContainer, setting their position within it. |
||||||
|
scrollContainer.add(&addressLabel, 0, 0); |
||||||
|
scrollContainer.add(&addressInput, 8, 0); |
||||||
|
scrollContainer.add(&colorLabel, 0, 1); |
||||||
|
scrollContainer.add(&colorList, 6, 1); |
||||||
|
scrollContainer.add(&rgbEnabledLabel, 0, 2); |
||||||
|
scrollContainer.add(&rgbEnabledCheckbox, 12, 2); |
||||||
|
scrollContainer.add(&brightnessLabel, 0, 3); |
||||||
|
scrollContainer.add(&brightnessSpinner, 11, 3); |
||||||
|
scrollContainer.add(&contrastLabel, 0, 4); |
||||||
|
scrollContainer.add(&contrastSpinner, 9, 4); |
||||||
|
|
||||||
|
// A simple Cancel button. |
||||||
|
Button cancelButton("Cancel"); |
||||||
|
|
||||||
|
// A Simple Ok button. |
||||||
|
Button okButton("Ok"); |
||||||
|
|
||||||
|
// Add the title Label, the ScrollContainer and the Cancel and Ok buttons to the |
||||||
|
// screen. |
||||||
|
screen.add(&titleLabel, 0, 0); |
||||||
|
screen.add(&scrollContainer, 0, 1); |
||||||
|
screen.add(&cancelButton, 0, 3); |
||||||
|
screen.add(&okButton, 16, 3); |
||||||
|
|
||||||
|
// Start processing the Screen in a loop. |
||||||
|
while (1) { |
||||||
|
// screen.update() tells the Screen to display itself, accept input and manage |
||||||
|
// it's resources. |
||||||
|
screen.update(); |
||||||
|
// After calling screen.update(), all of the Components have been updated and drawn |
||||||
|
// to the Screen and their inputs are now available for querying. |
||||||
|
setBright(brightnessSpinner.intValue()); |
||||||
|
setContrast(contrastSpinner.intValue()); |
||||||
|
if (okButton.pressed()) { |
||||||
|
// Do some work |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// The next 8 methods are required to be implemented by the user of ScreenUi. These |
||||||
|
// methods are what tie ScreenUi to your specific hardware for input and output. |
||||||
|
// In general, these will be very similar across platforms and can probably be copied |
||||||
|
// from one program to another and slightly modified. |
||||||
|
|
||||||
|
// User defined method that receives input from the input method. ScreenUi calls |
||||||
|
// this method during each update to see how the input state has changed since |
||||||
|
// the last update. ScreenUi expects the function to fill in the values |
||||||
|
// for x, y, selected and cancelled. |
||||||
|
// x and y are the number of inputs in either the x or y axis since the last call |
||||||
|
// to this method. The values can be positive or negative. A common control scheme |
||||||
|
// for a rotary encoder would be negative y for left, positive y for right. For |
||||||
|
// an input method consisting of the buttons on a NES control pad, for instance, might |
||||||
|
// have the D pad control x and y, the A button control selected and the B button |
||||||
|
// control cancelled. |
||||||
|
void Screen::getInputDeltas(int *x, int *y, bool *selected, bool *cancelled) { |
||||||
|
*x = 0; |
||||||
|
*y = Encoder.getDelta(); |
||||||
|
*selected = Encoder.ok(); |
||||||
|
*cancelled = Encoder.cancel(); |
||||||
|
Encoder.setCount(0); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that clears the output device completely. |
||||||
|
void Screen::clear() { |
||||||
|
lcd.clear(); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that creates a custom character in font memory. This is |
||||||
|
// currently used by the Checkbox Component to create a nice check mark. |
||||||
|
void Screen::createCustomChar(uint8_t slot, uint8_t *data) { |
||||||
|
lcd.createChar(slot, data); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that draws the given text at the given x and y position. |
||||||
|
// The text should be drawn exactly as specified with no interpretation, scrolling |
||||||
|
// or wrapping. |
||||||
|
void Screen::draw(uint8_t x, uint8_t y, const char *text) { |
||||||
|
lcd.setCursor(x, y); |
||||||
|
lcd.print(text); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that draws the given custom character at the given x |
||||||
|
// and y position. The custom character will be one specified to the |
||||||
|
// Screen::createCustomChar() method. |
||||||
|
void Screen::draw(uint8_t x, uint8_t y, uint8_t customChar) { |
||||||
|
lcd.setCursor(x, y); |
||||||
|
lcd.write(customChar); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that turns the character cursor on or off. |
||||||
|
void Screen::setCursorVisible(bool visible) { |
||||||
|
visible ? lcd.cursor() : lcd.noCursor(); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method positions the character cursor. |
||||||
|
void Screen::moveCursor(uint8_t x, uint8_t y) { |
||||||
|
lcd.setCursor(x, y); |
||||||
|
} |
||||||
|
|
||||||
|
// User defined method that turns the blinking character on or off. |
||||||
|
void Screen::setBlink(bool blink) { |
||||||
|
blink ? lcd.blink() : lcd.noBlink(); |
||||||
|
} |
||||||
|
|
||||||
|
// Utility function for setting the brightness of the LCD. Not required for ScreenUi. |
||||||
|
void setBright(byte val) { |
||||||
|
analogWrite(LCD_BRIGHT_PIN, 255 - val); |
||||||
|
} |
||||||
|
|
||||||
|
// Utility function for setting the contrast of the LCD. Not required for ScreenUi. |
||||||
|
void setContrast(byte val) { |
||||||
|
analogWrite(LCD_CONTRAST_PIN, val); |
||||||
|
} |
||||||
|
``` |
Loading…
Reference in new issue