/*
┌────── Move
│ ───┬─Start
│ └─Stop
├───Settings
│ ───────┬─Stepper X
│ │ ────────┬─XDirect
│ │ ├─Speed
│ │ └─Steps
│ └─Stepper Y
│ ────────┬─YDirect
│ ├─Speed
│ └─Steps
└─ Disable steppers
────────┐
├─Disable stepper X
└─Disable stepper Y
*/
#include <U8g2lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C display(U8X8_PIN_NONE);
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 12
// [6][6][20] - magic numbers :(
char Menu[6][6][20] = {
{"Move", "Settings", "Disable"},
{"Start", "Stop", "Back"},
{"Stepper X", "Stepper Y", "Back"},
{"DisStep. X", "DisStep. Y", "Back"},
{"XDirect", "Speed", "Steps", "Back"},
{"YDirect", "Speed", "Steps", "Back"}
};
byte menuLen (byte i){
for (int j = 0; j < 6; j++)
if (strlen(Menu[i][j]) == 0) return j;
}
int cursor = 0;
byte cursor_prev = 0;
byte menuIndex = 0;
#define lastPressDELAY 1000
long lastPress = 0;
bool lastPressFlag = 0;
void drawSelect(){
Serial.println("drawSelect cursor = "+String(cursor));
display.setCursor(0, cursor_prev);
display.print(' ');
display.setCursor(0, cursor);
display.print('=');
}
void drawSelectParametr(){
Serial.println("parameter cursor = "+String(cursor));
display.setCursor(0, 5);
display.print("parametr");
}
void switchMenu(){
switch (menuIndex) {
case 0: //ArrMenu {"Move", "Settings", "!able steppers"}
menuIndex = cursor + 1;
// menuIndex = (cursor == 0)? 1 : ((cursor == 1)? 2 : 3);
showMenu();
break;
case 1: //ArrMove {"Start", "Stop", "Back"}
switch (cursor) {
case 2:
menuIndex = 0;
showMenu();
break;
case 0:
drawSelect();
drawSelectParametr();
break;
case 1:
break;
}
break;
case 2: //ArrSettings {"Stepper X", "Stepper Y", "Back"}
menuIndex = (cursor == 2)? 0 : cursor+4;
showMenu();
break;
case 3: //ArrDisSteps {"DisStep. X", "DisStep. Y", "Back"}
switch (cursor) {
case 2:
menuIndex = 0;
showMenu();
break;
case 0:
break;
case 1:
break;
}
break;
case 4: //ArrStepperX {"XDirect", "Speed", "Steps", "Back"};
switch (cursor) {
case 3:
menuIndex = 2;
showMenu();
break;
case 0:
break;
case 1:
break;
case 2:
break;
}
break;
case 5: //ArrStepperX {"YDirect", "Speed", "Steps", "Back"};
switch (cursor) {
case 3:
menuIndex = 2;
showMenu();
break;
case 0:
break;
case 1:
break;
case 2:
break;
}
break;
}
}
void setup() {
Serial.begin(9600);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
display.begin();
display.setPowerSave(0);
display.setFont(u8x8_font_pxplusibmcgathin_f);
showMenu();
}
void loop() {
if (digitalRead(ENCODER_SW) == LOW) {
delay(200);
switchMenu();
}
if (cursor_prev != cursor) {
display.setCursor(0, cursor_prev);
display.print(' ');
display.setCursor(0, cursor);
display.print('>');
cursor_prev = cursor;
}
}
void showMenu() {
display.clearDisplay();
Serial.println("Menu index = " + String(menuIndex));
for (int i = 0; i < menuLen(menuIndex); i++) {
Serial.println(Menu[menuIndex][i]);
display.drawString(2, i, Menu[menuIndex][i]);
}
cursor = 0;
display.setCursor(0, 0);
display.print('>');
}
void readEncoder() {
if (digitalRead(ENCODER_DT)) cursor++;
else cursor--;
byte menuSize = menuLen(menuIndex);
if (cursor > (menuSize - 1)) cursor = 0;
if (cursor < 0) cursor = (menuSize - 1);
Serial.println("cursor = "+String(cursor));
}