Initial menu commit
parent
993fdf6809
commit
12528dac1e
|
|
@ -0,0 +1,23 @@
|
|||
;PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[platformio]
|
||||
src_dir = printermonitor
|
||||
|
||||
[common]
|
||||
lib_deps = LinkedList@dac3874d28,
|
||||
KeyPad@3.1.1
|
||||
[env:d1_mini]
|
||||
platform = espressif8266
|
||||
board = d1_mini
|
||||
framework = arduino
|
||||
upload_speed = 2000000
|
||||
monitor_speed = 115200
|
||||
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
#include "Command.h"
|
||||
|
||||
Command::Command () {
|
||||
|
||||
}
|
||||
|
||||
void Command::execute () {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
Command();
|
||||
void execute (void);
|
||||
};
|
||||
|
|
@ -0,0 +1,193 @@
|
|||
#include "Menu.h"
|
||||
#include "MenuFonts.h"
|
||||
|
||||
Menu::Menu()
|
||||
{
|
||||
menuItems = LinkedList<MenuItem *>();
|
||||
}
|
||||
|
||||
Menu::Menu(String menuTitle)
|
||||
{
|
||||
MenuTitle = menuTitle;
|
||||
Menu();
|
||||
}
|
||||
|
||||
void Menu::processKey(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '0':
|
||||
doExit();
|
||||
break;
|
||||
case '*':
|
||||
if (startPage > 0)
|
||||
{
|
||||
startPage = startPage - 1;
|
||||
}
|
||||
break;
|
||||
case '#':
|
||||
if (startPage < getMaxPage())
|
||||
{
|
||||
startPage++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::doExit(void)
|
||||
{
|
||||
if (exitCallback != NULL)
|
||||
{
|
||||
exitCallback();
|
||||
}
|
||||
}
|
||||
int Menu::getMaxPage()
|
||||
{
|
||||
return ceil(menuItems.size() / MENU_MAX_DISPLAY_ITEMS);
|
||||
}
|
||||
void Menu::drawMenu(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
|
||||
{
|
||||
if (displayMillis + MENU_TIMEOUT < millis())
|
||||
{
|
||||
doExit();
|
||||
return;
|
||||
}
|
||||
display->setColor(WHITE);
|
||||
display->setFont((const uint8_t *)ArialMT_Plain_10);
|
||||
display->setTextAlignment(TEXT_ALIGN_CENTER);
|
||||
|
||||
display->fillRect(0, 0, 128, 11);
|
||||
|
||||
display->setColor(BLACK);
|
||||
display->drawString(64, 0, MenuTitle);
|
||||
display->setColor(WHITE);
|
||||
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
|
||||
bool hasPrevPage = startPage > 0;
|
||||
bool hasNextPage = true;
|
||||
int startIndex = startPage * MENU_MAX_DISPLAY_ITEMS;
|
||||
int endIndex = startIndex + MENU_MAX_DISPLAY_ITEMS;
|
||||
if (endIndex + startIndex > menuItems.size() - 1)
|
||||
{
|
||||
endIndex = menuItems.size();
|
||||
hasNextPage = false;
|
||||
}
|
||||
|
||||
int xPos = 0;
|
||||
int yPos = MENU_ITEM_START_POS_Y;
|
||||
char startKey = '1';
|
||||
bool isSecondColumn = false;
|
||||
|
||||
for (int i = startIndex; i < endIndex; i++)
|
||||
{
|
||||
MenuItem *menuItem = menuItems[i];
|
||||
|
||||
drawRegularKeyboardButtonIcon(display, xPos, yPos, startKey, false, true);
|
||||
startKey++;
|
||||
|
||||
display->setFont((const uint8_t *)DialogInput_plain_11);
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display->drawString(xPos + REGULAR_KEYPAD_BUTTON_ICON_WIDTH + 2, yPos - 1, menuItem->ItemName);
|
||||
if (!isSecondColumn)
|
||||
{
|
||||
display->setColor(BLACK);
|
||||
// Clear string remainder
|
||||
display->fillRect(xPos + MENU_ITEM_SECOND_COLUMN_START_X, yPos, xPos + MENU_ITEM_SECOND_COLUMN_START_X + MENU_ITEM_SECOND_COLUMN_START_X, yPos + MENU_ITEM_HEIGHT);
|
||||
display->setColor(WHITE);
|
||||
}
|
||||
|
||||
yPos = yPos + MENU_ITEM_HEIGHT;
|
||||
|
||||
if (floor(MENU_MAX_DISPLAY_ITEMS / 2) - 1 == i)
|
||||
{
|
||||
isSecondColumn = true;
|
||||
yPos = MENU_ITEM_START_POS_Y;
|
||||
xPos = MENU_ITEM_SECOND_COLUMN_START_X;
|
||||
}
|
||||
|
||||
display->fillRect(0, MENU_BOTTOM_BAR_LINE, 128, 64 - MENU_BOTTOM_BAR_LINE + 1);
|
||||
|
||||
/* bottomBarStart = 44;
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display->setFont(ArialMT_Plain_10);
|
||||
display->setColor(BLACK);
|
||||
display->drawString(SMALL_KEYPAD_BUTTON_ICON_WIDTH + 1, bottomBarStart - 2, "Enter manually");
|
||||
//display->drawString(44 + SMALL_KEYPAD_BUTTON_ICON_WIDTH+1, bottomBarStart-1, "Exit");
|
||||
//display->drawString(88 + SMALL_KEYPAD_BUTTON_ICON_WIDTH+1, bottomBarStart-1, "Next");
|
||||
|
||||
drawSmallKeyboardButtonIcon(display, 1, bottomBarStart, '7', true, true);
|
||||
//drawSmallKeyboardButtonIcon(display, 44, bottomBarStart, '0');
|
||||
//drawSmallKeyboardButtonIcon(display, 88, bottomBarStart, '#');
|
||||
*/
|
||||
int bottomBarStart = 54;
|
||||
|
||||
if (hasNextPage)
|
||||
{
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display->setFont(ArialMT_Plain_10);
|
||||
display->setColor(BLACK);
|
||||
display->drawString(88 + SMALL_KEYPAD_BUTTON_ICON_WIDTH + 1, bottomBarStart - 2, "Next");
|
||||
drawSmallKeyboardButtonIcon(display, 89, bottomBarStart, '#', true, true);
|
||||
}
|
||||
|
||||
if (hasPrevPage)
|
||||
{
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display->setFont(ArialMT_Plain_10);
|
||||
display->setColor(BLACK);
|
||||
display->drawString(SMALL_KEYPAD_BUTTON_ICON_WIDTH + 1, bottomBarStart - 2, "Prev");
|
||||
drawSmallKeyboardButtonIcon(display, 1, bottomBarStart, '*', true, true);
|
||||
}
|
||||
|
||||
display->setTextAlignment(TEXT_ALIGN_LEFT);
|
||||
display->setFont(ArialMT_Plain_10);
|
||||
display->setColor(BLACK);
|
||||
display->drawString(44 + SMALL_KEYPAD_BUTTON_ICON_WIDTH + 1, bottomBarStart - 2, "Exit");
|
||||
|
||||
drawSmallKeyboardButtonIcon(display, 45, bottomBarStart, '0', true, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::drawKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, const uint8_t *font, int16_t iconWidth, int16_t iconHeight, int16_t xOffset, int16_t yOffset, bool inverted, bool filled)
|
||||
{
|
||||
OLEDDISPLAY_COLOR foregroundColor = WHITE;
|
||||
OLEDDISPLAY_COLOR backgroundColor = BLACK;
|
||||
|
||||
if (inverted)
|
||||
{
|
||||
foregroundColor = BLACK;
|
||||
backgroundColor = WHITE;
|
||||
}
|
||||
|
||||
display->setFont(font);
|
||||
display->setTextAlignment(TEXT_ALIGN_CENTER_BOTH);
|
||||
|
||||
display->setColor(foregroundColor);
|
||||
if (filled)
|
||||
{
|
||||
|
||||
display->fillRect(x, y, iconWidth, iconHeight);
|
||||
display->setColor(backgroundColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
display->drawRect(x, y, iconWidth, iconHeight);
|
||||
}
|
||||
|
||||
display->drawString(x + xOffset + iconWidth / 2, y + yOffset + iconHeight / 2, String(keyButton));
|
||||
|
||||
display->setColor(WHITE);
|
||||
}
|
||||
|
||||
void Menu::drawRegularKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, bool inverted, bool filled)
|
||||
{
|
||||
drawKeyboardButtonIcon(display, x, y, keyButton, (const uint8_t *)Open_Sans_ExtraBold_14,
|
||||
REGULAR_KEYPAD_BUTTON_ICON_WIDTH, REGULAR_KEYPAD_BUTTON_ICON_HEIGHT, REGULAR_KEYPAD_BUTTON_ICON_X_OFFSET, REGULAR_KEYPAD_BUTTON_ICON_Y_OFFSET, inverted, filled);
|
||||
}
|
||||
|
||||
void Menu::drawSmallKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, bool inverted, bool filled)
|
||||
{
|
||||
drawKeyboardButtonIcon(display, x, y, keyButton, (const uint8_t *)ArialMT_Plain_10,
|
||||
SMALL_KEYPAD_BUTTON_ICON_WIDTH, SMALL_KEYPAD_BUTTON_ICON_HEIGHT, SMALL_KEYPAD_BUTTON_ICON_X_OFFSET, SMALL_KEYPAD_BUTTON_ICON_Y_OFFSET, inverted, filled);
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
#include <Arduino.h>
|
||||
#include "MenuItem.h"
|
||||
#include <LinkedList.h>
|
||||
#include <OLEDDisplay.h>
|
||||
#include <OLEDDisplayUi.h>
|
||||
|
||||
#define MENU_TIMEOUT 5000
|
||||
|
||||
#define MENU_MAX_DISPLAY_ITEMS 4
|
||||
#define MENU_ITEM_START_POS_Y 14
|
||||
#define MENU_ITEM_SECOND_COLUMN_START_X 64
|
||||
#define MENU_ITEM_HEIGHT 14
|
||||
|
||||
#define MENU_BOTTOM_BAR_LINE 43
|
||||
|
||||
#define REGULAR_KEYPAD_BUTTON_ICON_WIDTH 12
|
||||
#define REGULAR_KEYPAD_BUTTON_ICON_HEIGHT 12
|
||||
#define REGULAR_KEYPAD_BUTTON_ICON_X_OFFSET 0
|
||||
#define REGULAR_KEYPAD_BUTTON_ICON_Y_OFFSET 0
|
||||
|
||||
#define SMALL_KEYPAD_BUTTON_ICON_WIDTH 7
|
||||
#define SMALL_KEYPAD_BUTTON_ICON_HEIGHT 9
|
||||
#define SMALL_KEYPAD_BUTTON_ICON_X_OFFSET 1
|
||||
#define SMALL_KEYPAD_BUTTON_ICON_Y_OFFSET 0
|
||||
|
||||
class Menu
|
||||
{
|
||||
public:
|
||||
Menu();
|
||||
Menu(String menuTitle);
|
||||
String MenuTitle;
|
||||
void drawMenu(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
|
||||
void processKey(char c);
|
||||
int getMaxPage();
|
||||
void (*exitCallback)(void) = NULL;
|
||||
int startPage = 0;
|
||||
LinkedList<MenuItem *> menuItems;
|
||||
unsigned long displayMillis;
|
||||
private:
|
||||
void doExit (void);
|
||||
void drawRegularKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, bool inverted, bool filled);
|
||||
void drawSmallKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, bool inverted, bool filled);
|
||||
void drawKeyboardButtonIcon(OLEDDisplay *display, int16_t x, int16_t y, char keyButton, const uint8_t *font, int16_t iconWidth, int16_t iconHeight, int16_t xOffset, int16_t yOffset, bool inverted, bool filled);
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,10 @@
|
|||
#include <Arduino.h>
|
||||
#include "MenuItem.h"
|
||||
|
||||
MenuItem::MenuItem() {
|
||||
|
||||
}
|
||||
MenuItem::MenuItem(String itemName)
|
||||
{
|
||||
ItemName = itemName;
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
#include <Arduino.h>
|
||||
|
||||
class MenuItem {
|
||||
public:
|
||||
String ItemName;
|
||||
MenuItem();
|
||||
MenuItem (String itemName);
|
||||
};
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
#include "PreheatMenu.h"
|
||||
|
||||
PreheatMenu::PreheatMenu () {
|
||||
MenuTitle = "Preheat Menu";
|
||||
}
|
||||
|
||||
void PreheatMenu::RetrieveTemperatures () {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#include "Menu.h"
|
||||
|
||||
class PreheatMenu: public Menu {
|
||||
public:
|
||||
PreheatMenu();
|
||||
void RetrieveTemperatures();
|
||||
};
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#include <Arduino.h>
|
||||
#include "TemperatureMenuItem.h"
|
||||
|
||||
TemperatureMenuItem::TemperatureMenuItem(String itemName)
|
||||
{
|
||||
ItemName = itemName;
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
#include "MenuItem.h"
|
||||
|
||||
class TemperatureMenuItem : public MenuItem
|
||||
{
|
||||
public:
|
||||
TemperatureMenuItem(String itemName);
|
||||
int bed;
|
||||
int chamber;
|
||||
int extruder;
|
||||
bool has_bed_temp;
|
||||
bool has_extruder_temp;
|
||||
bool has_chamber_temp;
|
||||
};
|
||||
|
|
@ -27,6 +27,7 @@ SOFTWARE.
|
|||
#include "OctoPrintClient.h"
|
||||
|
||||
OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) {
|
||||
temperaturePresets = LinkedList<TemperaturePreset *>();
|
||||
updatePrintClient(ApiKey, server, port, user, pass, psu);
|
||||
}
|
||||
|
||||
|
|
@ -285,6 +286,53 @@ void OctoPrintClient::getPrinterPsuState() {
|
|||
}
|
||||
}
|
||||
|
||||
void OctoPrintClient::getTemperaturePresets()
|
||||
{
|
||||
if (!validate())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
String apiPostData = "GET /api/settings HTTP/1.1";
|
||||
WiFiClient printClient = getSubmitRequest(apiPostData);
|
||||
if (printerData.error != "")
|
||||
{
|
||||
return;
|
||||
}
|
||||
const size_t bufferSize3 = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(1) + 20 * JSON_OBJECT_SIZE(4) + 245;
|
||||
DynamicJsonBuffer jsonBuffer3(bufferSize3);
|
||||
|
||||
printClient.find("\"temperature\": ");
|
||||
do
|
||||
{
|
||||
JsonObject &root3 = jsonBuffer3.parseObject(printClient);
|
||||
|
||||
if (!root3.success())
|
||||
{
|
||||
Serial.println("Not succssful");
|
||||
}
|
||||
else
|
||||
{
|
||||
temperaturePresets.clear();
|
||||
|
||||
JsonArray &temperature_profiles = root3["profiles"];
|
||||
|
||||
for (int i = 0; i < temperature_profiles.size(); i++)
|
||||
{
|
||||
TemperaturePreset *preset = new TemperaturePreset();
|
||||
|
||||
preset->bed = temperature_profiles[i]["bed"];
|
||||
preset->chamber = temperature_profiles[i]["chamber"];
|
||||
preset->extruder = temperature_profiles[i]["extruder"];
|
||||
|
||||
preset->PresetName = temperature_profiles[i]["name"].as<String>();
|
||||
}
|
||||
}
|
||||
} while (printClient.findUntil(",", "]"));
|
||||
|
||||
printClient.stop(); //stop client
|
||||
}
|
||||
|
||||
// Reset all PrinterData
|
||||
void OctoPrintClient::resetPrintData() {
|
||||
printerData.averagePrintTime = "";
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ SOFTWARE.
|
|||
#include <ESP8266WiFi.h>
|
||||
#include "libs/ArduinoJson/ArduinoJson.h"
|
||||
#include <base64.h>
|
||||
#include <LinkedList.h>
|
||||
#include "TemperaturePreset.h"
|
||||
|
||||
class OctoPrintClient {
|
||||
|
||||
|
|
@ -76,6 +78,9 @@ public:
|
|||
void getPrinterJobResults();
|
||||
void getPrinterPsuState();
|
||||
void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu);
|
||||
void getTemperaturePresets();
|
||||
|
||||
LinkedList<TemperaturePreset *> temperaturePresets;
|
||||
|
||||
String getAveragePrintTime();
|
||||
String getEstimatedPrintTime();
|
||||
|
|
|
|||
|
|
@ -49,10 +49,29 @@ SOFTWARE.
|
|||
#include "OctoPrintClient.h"
|
||||
#include "OpenWeatherMapClient.h"
|
||||
#include "WeatherStationFonts.h"
|
||||
#include "Menu/MenuFonts.h"
|
||||
#include "FS.h"
|
||||
#include "SH1106Wire.h"
|
||||
#include "SSD1306Wire.h"
|
||||
#include "OLEDDisplayUi.h"
|
||||
#include "libs/Keypad_tw/Keypad_tw.h"
|
||||
#include "Menu/Menu.h"
|
||||
|
||||
#define KEYPAD_I2CADDR 0x27 // keypad on PCF8574A
|
||||
|
||||
const byte KEYPAD_ROWS = 4; //four rows
|
||||
const byte KEYPAD_COLS = 4; //three columns
|
||||
char KEYPAD_KEYS[KEYPAD_ROWS][KEYPAD_COLS] = {
|
||||
{'1','2','3','A'},
|
||||
{'4','5','6','B'},
|
||||
{'7','8','9','C'},
|
||||
{'*','0','#','D'}
|
||||
};
|
||||
// Digitran keypad, bit numbers of PCF8574 i/o port
|
||||
byte KEYPAD_ROWPINS[KEYPAD_ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
|
||||
byte KEYPAD_COLPINS[KEYPAD_COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad
|
||||
|
||||
|
||||
|
||||
//******************************
|
||||
// Start Settings
|
||||
|
|
@ -68,7 +87,7 @@ String PrinterAuthUser = ""; // only used if you have haproxy or basic athe
|
|||
String PrinterAuthPass = ""; // only used with haproxy or basic auth (only needed if you must authenticate)
|
||||
|
||||
// Weather Configuration
|
||||
boolean DISPLAYWEATHER = true; // true = show weather when not printing / false = no weather
|
||||
boolean DISPLAYWEATHER = false; // true = show weather when not printing / false = no weather
|
||||
String WeatherApiKey = ""; // Your API Key from http://openweathermap.org/
|
||||
// Default City Location (use http://openweathermap.org/find to find city ID)
|
||||
int CityIDs[] = { 5304391 }; //Only USE ONE for weather marquee
|
||||
|
|
@ -86,7 +105,7 @@ char* www_password = "password"; // Password for the Web Interface
|
|||
// Date and Time
|
||||
float UtcOffset = -7; // Hour offset from GMT for your timezone
|
||||
boolean IS_24HOUR = false; // 23:00 millitary 24 hour clock
|
||||
int minutesBetweenDataRefresh = 15;
|
||||
int minutesBetweenDataRefresh = 1;
|
||||
boolean DISPLAYCLOCK = true; // true = Show Clock when not printing / false = turn off display when not printing
|
||||
|
||||
// Display Settings
|
||||
|
|
@ -104,7 +123,7 @@ boolean USE_FLASH = true; // true = System LED will Flash on Service Calls; fals
|
|||
boolean HAS_PSU = false; // Set to true if https://github.com/kantlivelong/OctoPrint-PSUControl/ in use
|
||||
|
||||
// OTA Updates
|
||||
boolean ENABLE_OTA = true; // this will allow you to load firmware to the device over WiFi (see OTA for ESP8266)
|
||||
boolean ENABLE_OTA = false; // this will allow you to load firmware to the device over WiFi (see OTA for ESP8266)
|
||||
String OTA_Password = ""; // Set an OTA password here -- leave blank if you don't want to be prompted for password
|
||||
|
||||
//******************************
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
#include "TemperaturePreset.h"
|
||||
|
||||
TemperaturePreset::TemperaturePreset() {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
#include <Arduino.h>
|
||||
|
||||
class TemperaturePreset
|
||||
{
|
||||
public:
|
||||
TemperaturePreset();
|
||||
String PresetName;
|
||||
int bed;
|
||||
int chamber;
|
||||
int extruder;
|
||||
bool has_bed_temp;
|
||||
bool has_extruder_temp;
|
||||
bool has_chamber_temp;
|
||||
};
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
||
|
||||
|| @file Keypad_tw.h
|
||||
|| @version 1.0 - Convert Keypad_I2C to use TinyWireM library for ATtiny micros
|
||||
|| @version 2.0 - PCF8575 support added by Paul Williamson
|
||||
|| @author G. D. (Joe) Young, ptw
|
||||
|| @contact "G. D. (Joe) Young" <gdyoung@islandnet.com>
|
||||
||
|
||||
|| @description
|
||||
|| | Keypad_tw provides an interface for using matrix keypads that
|
||||
|| | are attached with I2C port expanders. It supports multiple keypads,
|
||||
|| | user selectable pins, and user defined keymaps.
|
||||
|| |
|
||||
|| | This version replaces all references to Wire functions (TwoWire) with
|
||||
|| | their TinyWireM (USI_TWI) equivalents
|
||||
|| #
|
||||
||
|
||||
|| @license
|
||||
|| | This library is free software; you can redistribute it and/or
|
||||
|| | modify it under the terms of the GNU Lesser General Public
|
||||
|| | License as published by the Free Software Foundation; version
|
||||
|| | 2.1 of the License.
|
||||
|| |
|
||||
|| | This library 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
|
||||
|| | Lesser General Public License for more details.
|
||||
|| |
|
||||
|| | You should have received a copy of the GNU Lesser General Public
|
||||
|| | License along with this library; if not, write to the Free Software
|
||||
|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|| #
|
||||
||
|
||||
*/
|
||||
|
||||
#include "Keypad_tw.h"
|
||||
|
||||
// Let the user define a keymap - assume the same row/column count as defined in constructor
|
||||
void Keypad_tw::begin(char *userKeymap) {
|
||||
Keypad::begin(userKeymap);
|
||||
pinState = pinState_set( );
|
||||
}
|
||||
|
||||
|
||||
// Initialize tw
|
||||
void Keypad_tw::begin(void) {
|
||||
// pinState = 0xff;
|
||||
pinState = pinState_set( );
|
||||
}
|
||||
#if 0
|
||||
// Initialize tw //TinyWireM does not allow re-assigning bus adr
|
||||
void Keypad_tw::begin(byte address) {
|
||||
twaddr = address;
|
||||
USI_TWI::begin(address);
|
||||
// pinState = 0xff;
|
||||
pinState = pinState_set( );
|
||||
}
|
||||
|
||||
// Initialize tw
|
||||
void Keypad_tw::begin(int address) {
|
||||
twaddr = address;
|
||||
USI_TWI::begin(address);
|
||||
// pinState = 0xff;
|
||||
pinState = pinState_set( );
|
||||
}
|
||||
#endif
|
||||
|
||||
void Keypad_tw::pin_write(byte pinNum, boolean level) {
|
||||
word mask = 1<<pinNum;
|
||||
if( level == HIGH ) {
|
||||
pinState |= mask;
|
||||
} else {
|
||||
pinState &= ~mask;
|
||||
}
|
||||
port_write( pinState );
|
||||
} // twxWrite( )
|
||||
|
||||
|
||||
int Keypad_tw::pin_read(byte pinNum) {
|
||||
word mask = 0x1<<pinNum;
|
||||
Wire.requestFrom((int)twaddr, (int)twwidth);
|
||||
word pinVal = Wire.read( );
|
||||
if (twwidth > 1) {
|
||||
pinVal |= Wire.read( ) << 8;
|
||||
}
|
||||
pinVal &= mask;
|
||||
if( pinVal == mask ) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Keypad_tw::port_write( word twportval ) {
|
||||
Wire.beginTransmission((int)twaddr);
|
||||
Wire.write( twportval & 0x00FF);
|
||||
if (twwidth > 1) {
|
||||
Wire.write( twportval >> 8 );
|
||||
}
|
||||
Wire.endTransmission();
|
||||
pinState = twportval;
|
||||
} // port_write( )
|
||||
|
||||
word Keypad_tw::pinState_set( ) {
|
||||
Wire.requestFrom( (int)twaddr, (int)twwidth );
|
||||
pinState = Wire.read( );
|
||||
if (twwidth > 1) {
|
||||
pinState |= Wire.read( ) << 8;
|
||||
}
|
||||
return pinState;
|
||||
} // set_pinState( )
|
||||
|
||||
|
||||
/*
|
||||
|| @changelog
|
||||
|| | 1.0 2015-05-24 - Joe Young : initial conversion from Wire to TinyWireM
|
||||
|| |
|
||||
|| | 2.0 2013-08-31 - Paul Williamson : Added i2cwidth parameter for PCF8575 support
|
||||
|| |
|
||||
|| | 1.0 2012-07-12 - Joe Young : Initial Release
|
||||
|| #
|
||||
*/
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
||
|
||||
|| @file Keypad_tw.h
|
||||
|| @version 1.0 - Convert Keypad_I2C to use TinyWireM library for ATtiny micros
|
||||
|| @version 2.0 - PCF8575 support added by Paul Williamson
|
||||
|| @author G. D. (Joe) Young, ptw
|
||||
|| @contact "G. D. (Joe) Young" <gdyoung@islandnet.com>
|
||||
||
|
||||
|| @description
|
||||
|| | Keypad_tw provides an interface for using matrix keypads that
|
||||
|| | are attached to I2C port expanders. It supports multiple keypads,
|
||||
|| | user selectable pins, and user defined keymaps.
|
||||
|| |
|
||||
|| | This version replaces all references to Wire functions (TwoWire) with
|
||||
|| | their TinyWireM (USI_TWI) equivalents
|
||||
|| #
|
||||
||
|
||||
|| @license
|
||||
|| | This library is free software; you can redistribute it and/or
|
||||
|| | modify it under the terms of the GNU Lesser General Public
|
||||
|| | License as published by the Free Software Foundation; version
|
||||
|| | 2.1 of the License.
|
||||
|| |
|
||||
|| | This library 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
|
||||
|| | Lesser General Public License for more details.
|
||||
|| |
|
||||
|| | You should have received a copy of the GNU Lesser General Public
|
||||
|| | License along with this library; if not, write to the Free Software
|
||||
|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|| #
|
||||
||
|
||||
*/
|
||||
|
||||
#ifndef KEYPAD_tw_H
|
||||
#define KEYPAD_tw_H
|
||||
|
||||
#include "Keypad.h"
|
||||
#include <Wire.h>
|
||||
|
||||
#define PCF8574 1 // PCF8574 I/O expander device is 1 byte wide
|
||||
#define PCF8574A 1 // PCF8574A I/O expander device is 1 byte wide
|
||||
#define PCF8575 2 // PCF8575 I/O expander device is 2 bytes wide
|
||||
|
||||
class Keypad_tw : public Keypad {
|
||||
public:
|
||||
Keypad_tw(char* userKeymap, byte* row, byte* col, byte numRows, byte numCols, byte address, byte width = 1) :
|
||||
Keypad(userKeymap, row, col, numRows, numCols) { twaddr = address; twwidth = width;}
|
||||
|
||||
|
||||
// Keypad function
|
||||
void begin(char *userKeymap);
|
||||
// Wire function
|
||||
void begin(void);
|
||||
// Wire function
|
||||
// void begin(byte address); //TinyWireM does not allow re-assigning bus adr
|
||||
// Wire function
|
||||
// void begin(int address);
|
||||
|
||||
void pin_mode(byte pinNum, byte mode) {}
|
||||
void pin_write(byte pinNum, boolean level);
|
||||
int pin_read(byte pinNum);
|
||||
// read initial value for pinState
|
||||
word pinState_set( );
|
||||
// write a whole byte or word (depending on the port expander chip) to tw port
|
||||
void port_write( word twportval );
|
||||
|
||||
private:
|
||||
// tw device address
|
||||
byte twaddr;
|
||||
// tw port expander device width in bytes (1 for 8574, 2 for 8575)
|
||||
byte twwidth;
|
||||
// tw pin_write state persistant storage
|
||||
// least significant byte is used for 8-bit port expanders
|
||||
word pinState;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // KEYPAD_tw_H
|
||||
|
||||
/*
|
||||
|| @changelog
|
||||
|| | 1.0 2015-05-24 - Joe Young : initial conversion from Wire to TinyWireM
|
||||
|| |
|
||||
|| | 2.0 2013-08-31 - Paul Williamson : Added twwidth parameter for PCF8575 support
|
||||
|| |
|
||||
|| | 1.0 2012-07-12 - Joe Young : Initial Release
|
||||
|| #
|
||||
*/
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue