diff --git a/Universal_Serial_Adapter/Project.h b/Universal_Serial_Adapter/Project.h new file mode 100644 index 0000000..6b8773a --- /dev/null +++ b/Universal_Serial_Adapter/Project.h @@ -0,0 +1,57 @@ + +// LCD +LCDShield lcd; // Line length max is 16 + +// Buttons +int buttonPins[3] = {3, 4, 5}; + +// Standard colors +#define BACKGROUND BLACK +#define TEXT GRAY +#define HILIGHT GOLD + +// Font sizes +#define CHAR_WIDTH 8 +#define CHAR_HEIGHT 16 + +// Serial modes supported +// Abused in for loops / lookup tables -- DO NOT CHANGE none or set values +enum serialmode { + phone, + db9_norm, + db9_null, + cisco, + none=-1 +}; + +// Map a mode -> text value +char* modeToText[] = { + "Phone UART", + "DB9 - Normal", + "DB9 - Null Mdm", + "Cisco console" +}; + +// Mode info needed +serialmode currentMode = none; +serialmode selectedMode = none; + +// Printing text +void printMode(serialmode aMode); +void setMode(serialmode aMode); +void setSelection(serialmode aMode); + +// Defaults +void setDefaults() { + setMode(phone); + setSelection(phone); +} + +// Figure out offsets +int xLoc(int toSkip) { // Physically -- vertical + return (CHAR_HEIGHT * toSkip) + (CHAR_HEIGHT / 2); +} +int yLoc (int toSkip) { // Physical -- horizontal + return (CHAR_WIDTH * toSkip) + (CHAR_WIDTH / 2); +} + diff --git a/Universal_Serial_Adapter/Serial_Adapter_Project.ino b/Universal_Serial_Adapter/Serial_Adapter_Project.ino new file mode 100644 index 0000000..60fbc25 --- /dev/null +++ b/Universal_Serial_Adapter/Serial_Adapter_Project.ino @@ -0,0 +1,98 @@ +/* + Serial Adapter Project: Dynamic serial TTY passthroughs + by: Mike Crosson + Nusku Networks + date: 2013/03/09 + license: CC-BY SA 3.0 - Creative commons share-alike 3.0 + use this code however you'd like, just keep this license and + attribute. + + This sketch currently only shows the four serial modes and + uses S1-S3 to select the current mode. + + A trailing * after the mode indicates the current mode + + Button Map: + S1: Up + S2: Down + S3: Select/Enter + + Serial Modes: + Phone UART + DB9 Normal + DB9 Null Modem + Cisco console +*/ + +#include + +#include "Project.h" + +void setup() { + /* Set up the button pins as inputs, set pull-up resistor */ + for (int i=0; i<3; i++) { + pinMode(buttonPins[i], INPUT); + digitalWrite(buttonPins[i], HIGH); + } + + /* Initialize the LCD, set the contrast, clear the screen */ + lcd.init(PHILIPS); + lcd.contrast(-63); + lcd.clear(BACKGROUND); + + // Print the modes + // Uses enum trickery -- don't assign values to serialmode enum values + for (int i=0; i<=cisco; i++) { + printMode((serialmode)i); + } + + // Setup defaults + setDefaults(); +} + +void loop() { + if (!digitalRead(buttonPins[0])) { + serialmode newMode = (serialmode)(selectedMode + 1); + if (newMode <= cisco) { + setSelection(newMode); + } + // Wait for release before going on + while(!digitalRead(buttonPins[0])); + } + + if (!digitalRead(buttonPins[1])) { + serialmode newMode = (serialmode)(selectedMode - 1); + if (newMode >= 0) { + setSelection(newMode); + } + // Wait for release before going on + while(!digitalRead(buttonPins[1])); + } + + if (!digitalRead(buttonPins[2])) { + setMode(selectedMode); + // Wait for release before going on + while(!digitalRead(buttonPins[2])); + } +} + +void setMode(serialmode aMode) { + serialmode previousMode = currentMode; + currentMode = aMode; + lcd.setStr(" ", xLoc(previousMode), yLoc(0), TEXT, BACKGROUND); // Clear old * + lcd.setStr("*", xLoc(currentMode), yLoc(0), TEXT, BACKGROUND); // Add new * +} + +void setSelection(serialmode aMode) { + serialmode previousSelection = selectedMode; + selectedMode = aMode; + int previousLength = strlen(modeToText[previousSelection]) * CHAR_WIDTH; + int selectedLength = strlen(modeToText[selectedMode]) * CHAR_WIDTH; + lcd.setLine(xLoc(selectedMode) + CHAR_HEIGHT, yLoc(1), xLoc(selectedMode) + CHAR_HEIGHT, yLoc(1) + selectedLength, HILIGHT); + lcd.setLine(xLoc(previousSelection) + CHAR_HEIGHT, yLoc(1), xLoc(previousSelection) + CHAR_HEIGHT, yLoc(1) + previousLength, BACKGROUND); +} + +void printMode(serialmode aMode) { + lcd.setStr(modeToText[aMode], xLoc(aMode), yLoc(1), TEXT, BACKGROUND); +} +