diff --git a/Universal_Serial_Adapter/Project.h b/Universal_Serial_Adapter/Project.h index d4fb82f..25ca184 100644 --- a/Universal_Serial_Adapter/Project.h +++ b/Universal_Serial_Adapter/Project.h @@ -6,39 +6,15 @@ 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: Select/Enter - S3: Down - - Serial Modes: - Phone UART - DB9 Normal - DB9 Null Modem - Cisco console */ -// LCD -LCDShield lcd; // Line length max is 16 - -// Buttons -int buttonPins[3] = {3, 4, 5}; +#include // 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 { @@ -51,12 +27,7 @@ enum serialmode { }; // Map a mode -> text value -char* modeToText[] = { - "Phone UART", - "DB9 - Normal", - "DB9 - Null Mdm", - "Cisco console" -}; +extern char* modeToText[]; // Line speeds supported // Abused in for loops / lookup talbes -- DO NOT CHANGE none or set values @@ -78,36 +49,16 @@ struct linespeedinfo { }; // Known and supported line speeds -linespeedinfo linespeeds[] = { - {"2400b", 2400}, - {"9600b", 9600}, - {"19.2k", 19200}, - {"38.4k", 38400}, - {"57.5k", 57600}, - {"115k", 115200} -}; +extern linespeedinfo linespeeds[]; + +// LCD +extern LCDShield lcd; // Line length max is 16 + +// Buttons +extern int buttonPins[]; // Mode info needed -serialmode currentMode = none; -serialmode selectedMode = none; -linespeed currentLineSpeed = zero; - -// Printing text -void printMode(serialmode aMode); -void printLineSpeed(linespeedinfo linespeed); - -// Various sets for mode/selection/linespeed -void setMode(serialmode aMode); -void setSelection(serialmode aMode); -void setLineSpeed(linespeed aLineSpeed); - -// Figure out offsets for text printing -int xLoc(float toSkip) { // Physically -- vertical - return (CHAR_HEIGHT * toSkip) + (CHAR_HEIGHT / 2); -} -int yLoc (float toSkip) { // Physical -- horizontal - return (CHAR_WIDTH * toSkip) + (CHAR_WIDTH / 2); -} - - +extern serialmode currentMode; +extern serialmode selectedMode; +extern linespeed currentLineSpeed; diff --git a/Universal_Serial_Adapter/UI.cpp b/Universal_Serial_Adapter/UI.cpp new file mode 100644 index 0000000..4fc8746 --- /dev/null +++ b/Universal_Serial_Adapter/UI.cpp @@ -0,0 +1,160 @@ +/* + 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. +*/ + +#include + +#include "Project.h" +#include "UI.h" + +// Figure out offsets for text printing +int xLoc(float toSkip) { // Physically -- vertical + return (CHAR_HEIGHT * toSkip) + (CHAR_HEIGHT / 2); +} +int yLoc (float toSkip) { // Physical -- horizontal + return (CHAR_WIDTH * toSkip) + (CHAR_WIDTH / 2); +} + +void setLineSpeed(linespeed aLineSpeed) { + if (aLineSpeed >= maxlinespeed) { + currentLineSpeed = (linespeed)0; + } + else { + currentLineSpeed = aLineSpeed; + } + bool sel = selectedMode == modelinespeed ? true : false; + printLineSpeed(currentLineSpeed, sel); +} + +void setMode(serialmode aMode) { + if (aMode != modelinespeed) { + serialmode previousMode = currentMode; + currentMode = aMode; + + lcd.setStr(" ", xLoc(previousMode), yLoc(0), TEXT, BACKGROUND); + lcd.setStr("*", xLoc(currentMode), yLoc(0), TEXT, BACKGROUND); + } + else { + setLineSpeed((linespeed)(currentLineSpeed + 1)); + } +} + +void setSelection(serialmode aMode) { + serialmode previousSelection = selectedMode; + selectedMode = aMode; + + int yLocOne = yLoc(1); + + int xSelected = 0; + if (selectedMode != modelinespeed) { + xSelected = xLoc(selectedMode) + CHAR_HEIGHT; + } + + int xPrevious = 0; + if (previousSelection != modelinespeed) { + xPrevious = xLoc(previousSelection) + CHAR_HEIGHT; + } + + int previousLength = 0; + if (previousSelection != modelinespeed) { + previousLength = strlen(modeToText[previousSelection]) * CHAR_WIDTH; + } + + int selectedLength = 0; + if (selectedMode != modelinespeed) { + selectedLength = strlen(modeToText[selectedMode]) * CHAR_WIDTH; + } + + if (selectedMode != modelinespeed) { + lcd.setLine(xSelected, yLocOne, xSelected, yLocOne + selectedLength, HILIGHT); + } + else { + printLineSpeed(currentLineSpeed, true); + } + + if (previousSelection != modelinespeed) { + lcd.setLine(xPrevious, yLocOne, xPrevious, yLocOne + previousLength, BACKGROUND); + } + else { + printLineSpeed(currentLineSpeed, false); + } +} + +void printTitles() { + lcd.setStr(" RX Ln Spd Tx ", xLoc(5), 0, TEXT, BACKGROUND); +} + +void printMode(serialmode aMode) { + lcd.setStr(modeToText[aMode], xLoc(aMode), yLoc(1), TEXT, BACKGROUND); +} + +void printLineSpeed(linespeed aLineSpeed, bool selected) { + int xPosText = xLoc(6); + int yPosText = yLoc(5); + + int xPosLine = xLoc(7); + int yPosLine = yLoc(5); + + char* toPrint = linespeeds[aLineSpeed].description; + int length = strlen(toPrint); + + lcd.setStr(" ", xPosText, yPosText, BACKGROUND, BACKGROUND); + lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + 7 * CHAR_WIDTH, BACKGROUND); + + lcd.setStr(toPrint, xPosText, yPosText, TEXT, BACKGROUND); + if (selected) { + lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + length * CHAR_WIDTH, HILIGHT); + } +} + +void printRx(bool show) { + int vertXPosStart = xLoc(6.25); + int vertYPosStart = yLoc(1.5); + int vertXPosEnd = xLoc(7.25); + int vertYPosEnd = yLoc(1.5); + + int lftXPosStart = vertXPosEnd; + int lftYPosStart = vertYPosStart; + int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); + int lftYPosEnd = vertYPosStart - CHAR_WIDTH; + + int rtXPosStart = vertXPosEnd; + int rtYPosStart = vertYPosStart; + int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); + int rtYPosEnd = vertYPosStart + CHAR_WIDTH; + + int color = show ? EMERALD : BACKGROUND; + + lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); + lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); + lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); +} + +void printTx(bool show) { + int vertXPosStart = xLoc(6.25); + int vertYPosStart = yLoc(13.5); + int vertXPosEnd = xLoc(7.25); + int vertYPosEnd = yLoc(13.5); + + int lftXPosStart = vertXPosStart; + int lftYPosStart = vertYPosStart; + int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); + int lftYPosEnd = vertYPosStart - CHAR_WIDTH; + + int rtXPosStart = vertXPosStart; + int rtYPosStart = vertYPosStart; + int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); + int rtYPosEnd = vertYPosStart + CHAR_WIDTH; + + int color = show ? SKYBLUE : BACKGROUND; + + lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); + lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); + lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); +} diff --git a/Universal_Serial_Adapter/UI.h b/Universal_Serial_Adapter/UI.h new file mode 100644 index 0000000..11e4d55 --- /dev/null +++ b/Universal_Serial_Adapter/UI.h @@ -0,0 +1,27 @@ +/* + 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. +*/ + +// Font sizes +#define CHAR_WIDTH 8 +#define CHAR_HEIGHT 16 + +void setLineSpeed(linespeed aLineSpeed); +void setMode(serialmode aMode); +void setSelection(serialmode aMode); + +void printTitles(); +void printMode(serialmode aMode); +void printLineSpeed(linespeed aLineSpeed, bool selected); +void printRx(bool show); +void printTx(bool show); + +int xLoc(float toSkip); +int yLoc (float toSkip); + diff --git a/Universal_Serial_Adapter/Universal_Serial_Adapter.ino b/Universal_Serial_Adapter/Universal_Serial_Adapter.ino index 4ab9641..77bac91 100644 --- a/Universal_Serial_Adapter/Universal_Serial_Adapter.ino +++ b/Universal_Serial_Adapter/Universal_Serial_Adapter.ino @@ -6,27 +6,48 @@ 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: Select/Enter - S3: Down - - Serial Modes: - Phone UART - DB9 Normal - DB9 Null Modem - Cisco console */ #include #include "Project.h" +#include "UI.h" + +// Map a mode -> text value +char* modeToText[4] = { + "Phone UART", + "DB9 - Normal", + "DB9 - Null Mdm", + "Cisco console" +}; + +// Known and supported line speeds +linespeedinfo linespeeds[6] = { + {"2400b", 2400}, + {"9600b", 9600}, + {"19.2k", 19200}, + {"38.4k", 38400}, + {"57.5k", 57600}, + {"115k", 115200} +}; + +// LCD +LCDShield lcd; // Line length max is 16 + +// Buttons +int buttonPins[3] = {3, 4, 5}; + +// Mode info needed +serialmode currentMode = none; +serialmode selectedMode = none; +linespeed currentLineSpeed = zero; + +// Defaults +void setDefaults() { + setMode(phone); + setSelection(phone); + setLineSpeed(oneNineteenTwoK); +} void setup() { /* Set up the button pins as inputs, set pull-up resistor */ @@ -81,148 +102,3 @@ void loop() { while(!digitalRead(buttonPins[0])); } } - -// Defaults -void setDefaults() { - setMode(phone); - setSelection(phone); - setLineSpeed(oneNineteenTwoK); -} - -void setLineSpeed(linespeed aLineSpeed) { - if (aLineSpeed >= maxlinespeed) { - currentLineSpeed = (linespeed)0; - } - else { - currentLineSpeed = aLineSpeed; - } - bool sel = selectedMode == modelinespeed ? true : false; - printLineSpeed(currentLineSpeed, sel); -} - -void setMode(serialmode aMode) { - if (aMode != modelinespeed) { - serialmode previousMode = currentMode; - currentMode = aMode; - - lcd.setStr(" ", xLoc(previousMode), yLoc(0), TEXT, BACKGROUND); - lcd.setStr("*", xLoc(currentMode), yLoc(0), TEXT, BACKGROUND); - } - else { - setLineSpeed((linespeed)(currentLineSpeed + 1)); - } -} - -void setSelection(serialmode aMode) { - serialmode previousSelection = selectedMode; - selectedMode = aMode; - - int yLocOne = yLoc(1); - - int xSelected = 0; - if (selectedMode != modelinespeed) { - xSelected = xLoc(selectedMode) + CHAR_HEIGHT; - } - - int xPrevious = 0; - if (previousSelection != modelinespeed) { - xPrevious = xLoc(previousSelection) + CHAR_HEIGHT; - } - - int previousLength = 0; - if (previousSelection != modelinespeed) { - previousLength = strlen(modeToText[previousSelection]) * CHAR_WIDTH; - } - - int selectedLength = 0; - if (selectedMode != modelinespeed) { - selectedLength = strlen(modeToText[selectedMode]) * CHAR_WIDTH; - } - - if (selectedMode != modelinespeed) { - lcd.setLine(xSelected, yLocOne, xSelected, yLocOne + selectedLength, HILIGHT); - } - else { - printLineSpeed(currentLineSpeed, true); - } - - if (previousSelection != modelinespeed) { - lcd.setLine(xPrevious, yLocOne, xPrevious, yLocOne + previousLength, BACKGROUND); - } - else { - printLineSpeed(currentLineSpeed, false); - } -} - -void printTitles() { - lcd.setStr(" RX Ln Spd Tx ", xLoc(5), 0, TEXT, BACKGROUND); -} - -void printMode(serialmode aMode) { - lcd.setStr(modeToText[aMode], xLoc(aMode), yLoc(1), TEXT, BACKGROUND); -} - -void printLineSpeed(linespeed aLineSpeed, bool selected) { - int xPosText = xLoc(6); - int yPosText = yLoc(5); - - int xPosLine = xLoc(7); - int yPosLine = yLoc(5); - - char* toPrint = linespeeds[aLineSpeed].description; - int length = strlen(toPrint); - - lcd.setStr(" ", xPosText, yPosText, BACKGROUND, BACKGROUND); - lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + 7 * CHAR_WIDTH, BACKGROUND); - - lcd.setStr(toPrint, xPosText, yPosText, TEXT, BACKGROUND); - if (selected) { - lcd.setLine(xPosLine, yPosLine, xPosLine, yPosLine + length * CHAR_WIDTH, HILIGHT); - } -} - -void printRx(bool show) { - int vertXPosStart = xLoc(6.25); - int vertYPosStart = yLoc(1.5); - int vertXPosEnd = xLoc(7.25); - int vertYPosEnd = yLoc(1.5); - - int lftXPosStart = vertXPosEnd; - int lftYPosStart = vertYPosStart; - int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int lftYPosEnd = vertYPosStart - CHAR_WIDTH; - - int rtXPosStart = vertXPosEnd; - int rtYPosStart = vertYPosStart; - int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int rtYPosEnd = vertYPosStart + CHAR_WIDTH; - - int color = show ? EMERALD : BACKGROUND; - - lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); - lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); - lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); -} - -void printTx(bool show) { - int vertXPosStart = xLoc(6.25); - int vertYPosStart = yLoc(13.5); - int vertXPosEnd = xLoc(7.25); - int vertYPosEnd = yLoc(13.5); - - int lftXPosStart = vertXPosStart; - int lftYPosStart = vertYPosStart; - int lftXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int lftYPosEnd = vertYPosStart - CHAR_WIDTH; - - int rtXPosStart = vertXPosStart; - int rtYPosStart = vertYPosStart; - int rtXPosEnd = vertXPosStart + (CHAR_HEIGHT / 2); - int rtYPosEnd = vertYPosStart + CHAR_WIDTH; - - int color = show ? SKYBLUE : BACKGROUND; - - lcd.setLine(vertXPosStart, vertYPosStart, vertXPosEnd, vertYPosEnd, color); - lcd.setLine(lftXPosStart, lftYPosStart, lftXPosEnd, lftYPosEnd, color); - lcd.setLine(rtXPosStart, rtYPosStart, rtXPosEnd, rtYPosEnd, color); -}