From af5f0668361e6eb022e5689c2a767e29d4741b32 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Mon, 19 Aug 2019 17:41:18 -0700 Subject: [PATCH] Added Stream Deck Message Panel files --- .../MessagePanel/MessagePanel.ino | 174 ++++++++++++++++++ .../MessagePanel/config.h | 66 +++++++ .../com.adafruit.io.streamDeckPlugin | Bin 0 -> 43382 bytes 3 files changed, 240 insertions(+) create mode 100644 Stream_Deck_Message_Panel/MessagePanel/MessagePanel.ino create mode 100644 Stream_Deck_Message_Panel/MessagePanel/config.h create mode 100644 Stream_Deck_Message_Panel/Stream Deck Plugin/com.adafruit.io.streamDeckPlugin diff --git a/Stream_Deck_Message_Panel/MessagePanel/MessagePanel.ino b/Stream_Deck_Message_Panel/MessagePanel/MessagePanel.ino new file mode 100644 index 000000000..344afbdc7 --- /dev/null +++ b/Stream_Deck_Message_Panel/MessagePanel/MessagePanel.ino @@ -0,0 +1,174 @@ +// Message Panel +// Reads an Adafruit IO Feed, then formats and displays the message +// Author: Melissa LeBlanc-Williams + +#include +#include + +#define BASE_CHAR_WIDTH 6 // 5 pixels + 1 space +#define BASE_CHAR_HEIGHT 8 // 7 pixels + 1 space + +// Most of the signal pins are configurable, but the CLK pin has some +// special constraints. On 8-bit AVR boards it must be on PORTB... +// Pin 8 works on the Arduino Uno & compatibles (e.g. Adafruit Metro), +// Pin 11 works on the Arduino Mega. On 32-bit SAMD boards it must be +// on the same PORT as the RGB data pins (D2-D7)... +// Pin 8 works on the Adafruit Metro M0 or Arduino Zero, +// Pin A4 works on the Adafruit Metro M4 (if using the Adafruit RGB +// Matrix Shield, cut trace between CLK pads and run a wire to A4). + +//#define CLK 8 // USE THIS ON ADAFRUIT METRO M0 ir adapting to use Airlift, etc. +#define CLK A4 // USE THIS ON METRO M4 (not M0) +#define OE 9 +#define LAT 10 +#define A A0 +#define B A1 +#define C A2 +#define D A3 + +RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64); + +#include "config.h" + +// set up the 'counter' feed +AdafruitIO_Feed *counter = io.feed("messagepanel"); + +void drawText(const char *text, bool resetPosition = true, uint16_t color = 0xffff, uint16_t textSize = 1) { + matrix.setTextSize(textSize); // size 1 == 8 pixels high + if (resetPosition) { + matrix.setCursor(0, 0); // start at top left, with 8 pixel of spacing + } + matrix.setTextColor(color); + matrix.print(text); +} + +// This function is called whenever a 'messagepanel' message +// is received from Adafruit IO. it was attached to +// the counter feed in the setup() function above. +void handleMessage(AdafruitIO_Data *data) { + String message = data->toString(); + String plainText = data->toString(); + uint16_t color = matrix.Color333(7, 7, 7); + uint16_t textSize = 1; + uint16_t colorStartIndex = 0, colorEndIndex = 0; + uint16_t sizeStartIndex = 0, sizeEndIndex = 0; + uint16_t strpos = 0; + byte lineLengths[] = {0, 0, 0, 0}; + byte lineNum = 0; + // Calculate line lengths + boolean paramRead = false; + boolean newLine = false; + + matrix.setCursor(0, 0); + matrix.fillScreen(matrix.Color333(0, 0, 0)); + + // Strip out all color data first + while(strpos < plainText.length()) { + colorStartIndex = plainText.indexOf('{'); + colorEndIndex = plainText.indexOf('}'); + plainText.remove(colorStartIndex, colorEndIndex - colorStartIndex + 1); + strpos++; + } + + // Calculate the line lengths in pixels for fixed width text + strpos = 0; + while(strpos < plainText.length()) { + sizeStartIndex = plainText.indexOf('<'); + sizeEndIndex = plainText.indexOf('>'); + + if (strpos == sizeStartIndex) { + textSize = atoi(plainText.substring(sizeStartIndex + 1, sizeEndIndex).c_str()); + plainText.remove(sizeStartIndex, sizeEndIndex - sizeStartIndex + 1); + } + + if (plainText.charAt(strpos) != '\n') { + lineLengths[lineNum] += textSize * BASE_CHAR_WIDTH; + } + + // We want to keep adding up the characters * textSize until we hit a newline character + // or we reach the width of the message panel. Then we go down to the next line + if (plainText.charAt(strpos) == '\n' || lineLengths[lineNum] >= matrix.width()) { + lineNum++; + } + + strpos++; + } + + textSize = 1; + lineNum = 0; + for(uint16_t i=0; i') { + paramRead = false; + textSize = atoi(message.substring(sizeStartIndex, i).c_str()); + } else { + if (paramRead) continue; + + if (matrix.getCursorX() == 0 && matrix.getCursorY() == 0) { + matrix.setCursor(floor((matrix.width() / 2) - (lineLengths[lineNum] / 2)), 0); + } else if (newLine) { + matrix.setCursor(floor((matrix.width() / 2) - (lineLengths[++lineNum] / 2)), matrix.getCursorY()); + newLine = false; + } + drawText(message.substring(i, i+1).c_str(), false, color, textSize); + if (message.charAt(i) == '\n' || matrix.getCursorX() >= matrix.width()) { + newLine = true; + } + } + } +} + +void setup() { + matrix.begin(); + + // fill the screen with 'black' + matrix.fillScreen(matrix.Color333(0, 0, 0)); + // draw some text! + matrix.setTextWrap(true); + drawText("Connecting..."); + Serial.begin(115200); + io.connect(); + + counter->onMessage(handleMessage); + + while(io.mqttStatus() < AIO_CONNECTED) { + drawText("."); + delay(500); + } + + counter->get(); + + Serial.println(); + Serial.println(io.statusText()); +} + +void loop() { + io.run(); +} + +// Input a value 0 to 24 to get a color value. +// The colours are a transition r - g - b - back to r. +uint16_t Wheel(byte WheelPos) { + if(WheelPos < 8) { + return matrix.Color333(7 - WheelPos, WheelPos, 0); + } else if(WheelPos < 16) { + WheelPos -= 8; + return matrix.Color333(0, 7-WheelPos, WheelPos); + } else { + WheelPos -= 16; + return matrix.Color333(0, WheelPos, 7 - WheelPos); + } +} diff --git a/Stream_Deck_Message_Panel/MessagePanel/config.h b/Stream_Deck_Message_Panel/MessagePanel/config.h new file mode 100644 index 000000000..4860fb9ef --- /dev/null +++ b/Stream_Deck_Message_Panel/MessagePanel/config.h @@ -0,0 +1,66 @@ +/************************ Adafruit IO Config *******************************/ + +// visit io.adafruit.com if you need to create an account, +// or if you need your Adafruit IO key. +#define IO_USERNAME "your_username" +#define IO_KEY "your_key" + +/******************************* WIFI **************************************/ + +// the AdafruitIO_WiFi client will work with the following boards: +// - HUZZAH ESP8266 Breakout -> https://www.adafruit.com/products/2471 +// - Feather HUZZAH ESP8266 -> https://www.adafruit.com/products/2821 +// - Feather HUZZAH ESP32 -> https://www.adafruit.com/product/3405 +// - Feather M0 WiFi -> https://www.adafruit.com/products/3010 +// - Feather WICED -> https://www.adafruit.com/products/3056 +// - Adafruit PyPortal -> https://www.adafruit.com/product/4116 +// - Adafruit Metro M4 Express AirLift Lite -> https://www.adafruit.com/product/4000 +// - Adafruit AirLift Breakout -> https://www.adafruit.com/product/4201 +// - Adafruit AirLift Shield -> https://www.adafruit.com/product/4285 +// - Adafruit AirLift FeatherWing -> https://www.adafruit.com/product/4264 + +#define WIFI_SSID "your_ssid" +#define WIFI_PASS "your_pass" + +// uncomment the following line if you are using airlift +// #define USE_AIRLIFT + +// uncomment the following line if you are using winc1500 +// #define USE_WINC1500 + +// comment out the following lines if you are using fona or ethernet +#include "AdafruitIO_WiFi.h" + +#if defined(USE_AIRLIFT) || defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) + // Configure the pins used for the ESP32 connection + #if !defined(SPIWIFI_SS) // if the wifi definition isnt in the board variant + // Don't change the names of these #define's! they match the variant ones + #define SPIWIFI SPI + #define SPIWIFI_SS 10 // Chip select pin + #define NINA_ACK 9 // a.k.a BUSY or READY pin + #define NINA_RESETN 6 // Reset pin + #define NINA_GPIO0 -1 // Not connected + #endif + AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS, SPIWIFI_SS, NINA_ACK, NINA_RESETN, NINA_GPIO0, &SPIWIFI); +#else + AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS); +#endif +/******************************* FONA **************************************/ + +// the AdafruitIO_FONA client will work with the following boards: +// - Feather 32u4 FONA -> https://www.adafruit.com/product/3027 + +// uncomment the following two lines for 32u4 FONA, +// and comment out the AdafruitIO_WiFi client in the WIFI section +// #include "AdafruitIO_FONA.h" +// AdafruitIO_FONA io(IO_USERNAME, IO_KEY); + +/**************************** ETHERNET ************************************/ + +// the AdafruitIO_Ethernet client will work with the following boards: +// - Ethernet FeatherWing -> https://www.adafruit.com/products/3201 + +// uncomment the following two lines for ethernet, +// and comment out the AdafruitIO_WiFi client in the WIFI section +// #include "AdafruitIO_Ethernet.h" +// AdafruitIO_Ethernet io(IO_USERNAME, IO_KEY); \ No newline at end of file diff --git a/Stream_Deck_Message_Panel/Stream Deck Plugin/com.adafruit.io.streamDeckPlugin b/Stream_Deck_Message_Panel/Stream Deck Plugin/com.adafruit.io.streamDeckPlugin new file mode 100644 index 0000000000000000000000000000000000000000..01910733ec40f88329213c410c918d8a322ce844 GIT binary patch literal 43382 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 E0~Ph$YybcN literal 0 HcmV?d00001