#include "MenuSystem.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EncButton.h>
EncButton enc(2, 0, 4);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Menu variables
MenuSystem ms;
Menu mm("");
Menu mu1("Display");
MenuItem mu1_mi1("Display1");
MenuItem mu1_mi2("Display2");
MenuItem mu1_mi3("Display3");
Menu mu2("Settings");
MenuItem mu2_mi1("Settings1");
MenuItem mu2_mi2("Settings2");
MenuItem mu2_mi3("Settings3");
Menu mu3("Ethernet");
MenuItem mu3_mi1("Set1");
MenuItem mu3_mi2("Set2");
MenuItem mu3_mi3("Set3");
// Объявления переменных и констант
bool bRanCallback = false;
bool bForward = true;
int line = 30; // переменная для установки настроек в линию
// Функция меню обратного вызова
// В этом примере все пункты меню можно использовать для обратного вызова.
void on_display1_selected(MenuItem* p_menu_item)
{
Serial.println("DISPLAY1 Selected");
display.setCursor(0, 55);
display.print("DISPLAY1 Selected");
bRanCallback = true;
bForward = true;
}
void on_display2_selected(MenuItem* p_menu_item)
{
Serial.println("DISPLAY2 Selected");
display.setCursor(0, 55);
display.print("DISPLAY2 Selected");
//bRanCallback = false;
bForward = true;
}
void on_display3_selected(MenuItem* p_menu_item)
{
Serial.println("DISPLAY3 Selected");
display.setCursor(0, 55);
display.print("DISPLAY3 Selected");
bRanCallback = false;
bForward = true;
}
void on_settings1_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS1 Selected");
display.setCursor(0, 55);
display.print("SETTINGS1 Selected");
bRanCallback = true;
bForward = true;
}
void on_settings2_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS2 Selected");
display.setCursor(0, 55);
display.print("SETTINGS2 Selected");
bRanCallback = false;
bForward = true;
}
void on_settings3_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS3 Selected");
display.setCursor(0, 55);
display.print("SETTINGS3 Selected");
//bRanCallback = false;
bForward = true;
}
void on_set1_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS1 Selected");
display.setCursor(0, 55);
display.print("SETTINGS1 Selected");
bRanCallback = true;
bForward = true;
}
void on_set2_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS2 Selected");
display.setCursor(0, 55);
display.print("SETTINGS2 Selected");
bRanCallback = false;
bForward = true;
}
void on_set3_selected(MenuItem* p_menu_item)
{
Serial.println("SETTINGS3 Selected");
display.setCursor(0, 55);
display.print("SETTINGS3 Selected");
//bRanCallback = false;
bForward = true;
}
// Standard arduino functions
void setup()
{
Serial.begin(9600);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
enc.setBtnLevel(LOW);
enc.setClickTimeout(10);
enc.setDebTimeout(10);
enc.setHoldTimeout(300);
enc.setStepTimeout(10);
///////////////////////////////////////Encoder///////////////////////////////////////
enc.setEncReverse(0);
enc.setEncType(EB_STEP4_LOW);
enc.setFastTimeout(30);
// сбросить счётчик энкодера
enc.counter = 0;
display.display(); // show splashscreen
delay(1000);
display.clearDisplay(); // clears the screen and buffer
// Menu setup
mm.add_menu(&mu1);
mu1.add_item(&mu1_mi1, &on_display1_selected);
mu1.add_item(&mu1_mi2, &on_display2_selected);
mu1.add_item(&mu1_mi3, &on_display3_selected);
mm.add_menu(&mu2);
mu2.add_item(&mu2_mi1, &on_settings1_selected);
mu2.add_item(&mu2_mi2, &on_settings2_selected);
mu2.add_item(&mu2_mi3, &on_settings3_selected);
mm.add_menu(&mu3);
mu3.add_item(&mu3_mi1, &on_set1_selected);
mu3.add_item(&mu3_mi2, &on_set2_selected);
mu3.add_item(&mu3_mi3, &on_set3_selected);
ms.set_root_menu(&mm);
}
void loop()
{
enc.tick();
/*
//OLED set up
display.display();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
line = 15; //line variable reset
//Serial.println("//OLED set up");
// Display Title
display.setCursor(10, 0);
display.println("MENU CONFIGURATION");
display.setCursor(0, 5);
display.print("_____________________");
display.setCursor(110, 15);
//Serial.println("//OLED");
*/
// Display the menu
if (enc.action()) {
//OLED set up
display.display();
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
line = 15; //line variable reset
Serial.println("//OLED set up");
// Display Title
display.setCursor(10, 0);
display.println("MENU CONFIGURATION");
display.setCursor(0, 5);
display.print("_____________________");
display.setCursor(110, 15);
Serial.println("//OLED");
Menu const* cp_menu = ms.get_current_menu();
MenuComponent const* cp_menu_sel = cp_menu->get_selected();
for (int i = 0; i < cp_menu->get_num_menu_components(); ++i)
{
MenuComponent const* cp_m_comp = cp_menu->get_menu_component(i);
Serial.println(cp_m_comp->get_name());
display.setCursor(10, line);
display.print(cp_m_comp->get_name());
if (cp_menu_sel == cp_m_comp) {
Serial.print("<<< ");
display.setCursor(0, line);
display.write(">");
}
line = line + 10;
Serial.println("");
}
if (enc.left())
{
ms.prev();
}
if (enc.right())
{
ms.next();
}
/*if (enc.hold())
{
ms.back();
ms.display();
}*/
if (enc.click())
{
ms.select();
}
}
// Wait for two seconds so the output is viewable
///delay(1500);
}