From dbf6cfe85a748d75664b7982782c5d42eced61b8 Mon Sep 17 00:00:00 2001 From: Oleksiy Date: Tue, 1 Aug 2023 14:30:48 +0300 Subject: [PATCH] Custom font and some progress on the menu --- Software/Gravity/Gravity.ino | 21 +++++ Software/Gravity/UI.ino | 172 +++++++++++++++++++++++++++-------- 2 files changed, 155 insertions(+), 38 deletions(-) diff --git a/Software/Gravity/Gravity.ino b/Software/Gravity/Gravity.ino index 7dc2335..e582bf1 100644 --- a/Software/Gravity/Gravity.ino +++ b/Software/Gravity/Gravity.ino @@ -146,6 +146,27 @@ const unsigned char splash_logo[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +const uint8_t velvetscreen[597] U8G2_FONT_SECTION("velvetscreen") = + "I\0\2\2\3\3\3\3\4\5\5\0\0\5\0\5\0\0\363\0\0\2\70!\6)\251\254\0\42\6\23" + "\317$\25#\12-\351UC\345\241*\0$\11,\331\215\24e\32\11%\12-\351\250\244r\245\222\0" + "&\11-\351\351*\311\250\2'\5\21\257\10(\6*\271\251\62)\10*\271\304\224\24\0*\11-\351" + "V\325jF\0+\7\33\313\245\225\0,\5\21\251\10-\5\13\315\14.\5\11\251\4/\7$\331\307" + "\66\0\60\10,\331\251h&\5\61\7+\311\310\326\0\62\11,\331l\224T\36\1\63\11,\331l\224" + "\64\32\11\64\10,\331D\71t\1\65\11,\331\14\275\321H\0\66\11,\331\251\274bR\0\67\10," + "\331\214\34\353\10\70\11,\331\251\230TL\12\71\11,\331\251\230vR\0:\6\31\253\244\0;\6!" + "\251$\1<\7+\311\246\272\0=\6\33\313\354\1>\7+\311\344\252\4\77\11,\331l\224\64\216\0" + "@\12-\351\255J\215\14\27\0A\10,\331\251\70\246\14B\11,\331\254\70R\34\2C\11,\331\251" + "\250cR\0D\10,\331\254h\216\4E\10,\331\14=\364\10F\10,\331\14\275r\6G\10,\331" + "\215\234f\32H\10,\331D\71\246\14I\6)\251\14\1J\10,\331\327\62)\0K\11,\331D\225" + "d*\3L\7,\331\344\366\10M\11-\351\344\265\222\326\1N\11-\351\344\251\222\334\1O\10,\331" + "\251h&\5P\11,\331\254\70R\316\0Q\10,\331\251h\305\24R\10,\331\254\70R\63S\11," + "\331\215\214\64\32\11T\7+\311\254\330\2U\10,\331DgR\0V\12-\351d\235\312\224#\0W" + "\12-\351d\225TR]\0X\11,\331D\231T\224\1Y\12-\351\344Tg\224Q\4Z\7+\311" + "\314T\16[\6*\271\254J\134\11$\331d\224QF\1]\6*\271\250j^\5\23\317\65_\6\14" + "\331\214\0o\7[\333\214\64\2p\11-\351-\265\227Z\0q\7-\351\35_\13r\10+\311D\65" + "T\4s\7-\351\334\366\30t\7-\351\374G\0u\10-\351\334*\351\61v\5\211\335\4w\12-" + "\351\255J\215\234\26\0x\6\33\311\244\16\0\0\0\4\377\377\0"; + void setup() { Serial.begin(9600); diff --git a/Software/Gravity/UI.ino b/Software/Gravity/UI.ino index 897fed7..0c87a35 100644 --- a/Software/Gravity/UI.ino +++ b/Software/Gravity/UI.ino @@ -6,7 +6,9 @@ void updateScreen() { //BPM Tab if (displayTab == 0) { //BPM - u8g2.setFont(u8g2_font_5x7_tr); + + u8g2.setFont(velvetscreen); + //Menu items if (masterClockMode == 0 && bpmModulationRange == 0) { lastMenuItem = 1; @@ -16,74 +18,165 @@ void updateScreen() { lastMenuItem = 0; } if (menuItem == 0 && insideTab) { - u8g2.drawButtonUTF8(4, 8, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "CLK:" ); + u8g2.drawButtonUTF8(59, 6, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "MODE:" ); } else { - u8g2.drawButtonUTF8(4, 8, U8G2_BTN_BW0, 20, 3, 2, "CLK:" ); + u8g2.drawButtonUTF8(59, 6, U8G2_BTN_BW0, 20, 3, 2, "MODE:" ); } if (masterClockMode == 0) { if (menuItem == 1) { - u8g2.drawButtonUTF8(4, 20, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "MOD:" ); + u8g2.drawButtonUTF8(59, 16, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "MODUL:" ); } else { - u8g2.drawButtonUTF8(4, 20, U8G2_BTN_BW0, 20, 3, 2, "MOD:" ); + u8g2.drawButtonUTF8(59, 16, U8G2_BTN_BW0, 20, 3, 2, "MODUL:" ); } if (bpmModulationRange != 0) { if (menuItem == 2) { - u8g2.drawButtonUTF8(4, 32, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "RNG:" ); + u8g2.drawButtonUTF8(59, 26, U8G2_BTN_BW0|U8G2_BTN_INV, 20, 3, 2, "RANGE:" ); } else { - u8g2.drawButtonUTF8(4, 32, U8G2_BTN_BW0, 20, 3, 2, "RNG:" ); + u8g2.drawButtonUTF8(59, 26, U8G2_BTN_BW0, 20, 3, 2, "RANGE:" ); } } } //Values if (menuItem == 0 && insideTab && masterClockMode == 0) { - u8g2.drawButtonUTF8(31, 8, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "INT" ); + u8g2.drawButtonUTF8(91, 6, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "INT" ); } else if ((menuItem != 0 || !insideTab) && masterClockMode == 0) { - u8g2.drawButtonUTF8(31, 8, U8G2_BTN_BW0, 30, 4, 2, "INT" ); + u8g2.drawButtonUTF8(91, 6, U8G2_BTN_BW0, 30, 4, 2, "INT" ); } if (menuItem == 0 && masterClockMode == 1) { - u8g2.drawButtonUTF8(31, 8, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "EXT" ); + u8g2.drawButtonUTF8(91, 6, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "EXT" ); } else if (menuItem != 0 && masterClockMode == 1) { - u8g2.drawButtonUTF8(31, 8, U8G2_BTN_BW0, 30, 4, 2, "EXT" ); + u8g2.drawButtonUTF8(91, 6, U8G2_BTN_BW0, 30, 4, 2, "EXT" ); } if (masterClockMode == 0) { if (menuItem == 1 && bpmModulationRange != 0 && bpmModulationChannel == 0) { - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "CV1" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "CV1" ); } else if (menuItem != 1 && bpmModulationRange != 0 && bpmModulationChannel == 0) { - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0, 30, 3, 2, "CV1" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0, 30, 3, 2, "CV1" ); } if (menuItem == 1 && bpmModulationRange != 0 && bpmModulationChannel == 1) { - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "CV2" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "CV2" ); } else if (menuItem != 1 && bpmModulationRange != 0 && bpmModulationChannel == 1){ - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0, 30, 3, 2, "CV2" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0, 30, 3, 2, "CV2" ); } if (menuItem == 1 && bpmModulationRange == 0) { - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "OFF" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, "OFF" ); } else if (menuItem != 1 && bpmModulationRange == 0) { - u8g2.drawButtonUTF8(31, 20, U8G2_BTN_BW0, 30, 4, 2, "OFF" ); + u8g2.drawButtonUTF8(91, 16, U8G2_BTN_BW0, 30, 4, 2, "OFF" ); } String bpmModStr = String(bpmModulationRange * 10); char bpmModChar[3]; bpmModStr.toCharArray(bpmModChar, 3); if (menuItem == 2 && bpmModulationRange != 0) { - u8g2.drawButtonUTF8(31, 32, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, bpmModChar ); + u8g2.drawButtonUTF8(91, 26, U8G2_BTN_BW0|U8G2_BTN_INV, 30, 4, 2, bpmModChar ); } else if (menuItem != 2 && bpmModulationRange != 0) { - u8g2.drawButtonUTF8(31, 32, U8G2_BTN_BW0, 30, 4, 2, bpmModChar ); + u8g2.drawButtonUTF8(91, 26, U8G2_BTN_BW0, 30, 4, 2, bpmModChar ); } } String bpmStr = String(bpm); char bpmChar[5]; bpmStr.toCharArray(bpmChar, 5); - u8g2.setFont(u8g2_font_logisoso26_tn); + u8g2.setFont(u8g2_font_logisoso24_tn); if (!insideTab && shiftBtnPushed) { - u8g2.drawButtonUTF8(96, 28, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, 62, 0, 0, bpmChar ); - u8g2.setFont(u8g2_font_7x13B_mr); - u8g2.drawButtonUTF8(96, 44, U8G2_BTN_BW1|U8G2_BTN_HCENTER, 62, 0, 0, "BPM" ); - } else if (menuItem != 2 && bpmModulationRange != 0) { - u8g2.drawButtonUTF8(96, 28, U8G2_BTN_BW0|U8G2_BTN_HCENTER, 64, 0, 0, bpmChar ); - u8g2.setFont(u8g2_font_7x13B_mr); - u8g2.drawButtonUTF8(96, 44, U8G2_BTN_BW0|U8G2_BTN_HCENTER, 64, 0, 0, "BPM" ); + u8g2.drawButtonUTF8(28, 26, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, 56, 0, 0, bpmChar ); + u8g2.setFont(velvetscreen); + u8g2.drawButtonUTF8(29, 40, U8G2_BTN_BW1|U8G2_BTN_HCENTER, 55, 0, 2, "BPM" ); + } else { + u8g2.drawButtonUTF8(28, 26, U8G2_BTN_BW0|U8G2_BTN_HCENTER, 56, 0, 0, bpmChar ); + u8g2.setFont(velvetscreen); + u8g2.drawButtonUTF8(29, 40, U8G2_BTN_BW0|U8G2_BTN_HCENTER, 55, 0, 2, "BPM" ); + } + + } + //Channel Tabs + else { + //Menu items + lastMenuItem = 3; + + byte menuItemWidth = 32; + if (menuItem == 0 && insideTab) { + u8g2.drawButtonUTF8(2, 6, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "MODE:" ); + } else { + u8g2.drawButtonUTF8(2, 6, U8G2_BTN_BW0, menuItemWidth, 2, 2, "MODE:" ); + } + if (menuItem == 1 && insideTab && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "OFFSET:" ); + } else if ((menuItem != 1 || insideTab) && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0, menuItemWidth, 2, 2, "OFFSET:" ); + } + if (menuItem == 1 && insideTab && channels[displayTab - 1].mode == 1) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "SUBDIV:" ); + } else if ((menuItem != 1 || insideTab) && channels[displayTab - 1].mode == 1) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0, menuItemWidth, 2, 2, "SUBDIV:" ); + } + if (menuItem == 1 && insideTab && channels[displayTab - 1].mode == 2) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "EDIT" ); + } else if ((menuItem != 1 || insideTab) && channels[displayTab - 1].mode == 2) { + u8g2.drawButtonUTF8(2, 16, U8G2_BTN_BW0, menuItemWidth, 2, 2, "EDIT" ); + } + if (menuItem == 2 && insideTab) { + u8g2.drawButtonUTF8(2, 26, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "CV1:" ); + } else { + u8g2.drawButtonUTF8(2, 26, U8G2_BTN_BW0, menuItemWidth, 2, 2, "CV1:" ); + } + if (menuItem == 3 && insideTab) { + u8g2.drawButtonUTF8(2, 36, U8G2_BTN_BW0|U8G2_BTN_INV, menuItemWidth, 2, 2, "CV2:" ); + } else { + u8g2.drawButtonUTF8(2, 36, U8G2_BTN_BW0, menuItemWidth, 2, 2, "CV2:" ); + } + + String valueStr; + char valueChar[8]; + + //Values + byte valueWidth = 28; + if (menuItem == 0 && insideTab && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0|U8G2_BTN_INV, valueWidth, 2, 2, "CLOCK" ); + } else if ((menuItem != 0 || !insideTab) && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0, valueWidth, 3, 2, "CLOCK" ); + } else if (menuItem == 0 && insideTab && channels[displayTab - 1].mode == 1) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0|U8G2_BTN_INV, valueWidth, 2, 2, "RAND" ); + } else if ((menuItem != 0 || !insideTab) && channels[displayTab - 1].mode == 1) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0, valueWidth, 3, 2, "RAND" ); + } else if (menuItem == 0 && insideTab && channels[displayTab - 1].mode == 2) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0|U8G2_BTN_INV, valueWidth, 2, 2, "SEQ" ); + } else if ((menuItem != 0 || !insideTab) && channels[displayTab - 1].mode == 2) { + u8g2.drawButtonUTF8(menuItemWidth+6, 6, U8G2_BTN_BW0, valueWidth, 3, 2, "SEQ" ); + } + + if (channels[displayTab - 1].mode == 0) { + valueStr = String(channels[displayTab - 1].offset) + "/"; + valueStr = valueStr + String(channelPulsesPerCycle[displayTab-1]+1); + } else if (channels[displayTab - 1].mode == 1 && subDivs[channels[displayTab - 1].subDiv] > 0) { + valueStr = "/" + String(subDivs[channels[displayTab - 1].subDiv]); + } else if (channels[displayTab - 1].mode == 1 && subDivs[channels[displayTab - 1].subDiv] < 0) { + valueStr = "x" + String(abs(subDivs[channels[displayTab - 1].subDiv])); + } + valueStr.toCharArray(valueChar, 8); + + if (menuItem == 1 && insideTab && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(menuItemWidth+6, 16, U8G2_BTN_BW0|U8G2_BTN_INV, valueWidth, 2, 2, valueChar ); + } else if ((menuItem != 1 || !insideTab) && channels[displayTab - 1].mode == 0) { + u8g2.drawButtonUTF8(menuItemWidth+6, 16, U8G2_BTN_BW0, valueWidth, 3, 2, valueChar ); + } + + if (channels[displayTab - 1].mode == 0 && subDivs[channels[displayTab - 1].subDiv] > 0) { + valueStr = "/" + String(subDivs[channels[displayTab - 1].subDiv]); + } else if (channels[displayTab - 1].mode == 0 && subDivs[channels[displayTab - 1].subDiv] < 0) { + valueStr = "x" + String(abs(subDivs[channels[displayTab - 1].subDiv])); + } else if (channels[displayTab - 1].mode == 1) { + valueStr = String(channels[displayTab - 1].random) + "0%"; + } else if (channels[displayTab - 1].mode == 2) { + valueStr = "A" + String(channels[displayTab - 1].random + 1); + } + valueStr.toCharArray(valueChar, 8); + + u8g2.setFont(u8g2_font_logisoso24_tr); + if (!insideTab && shiftBtnPushed) { + u8g2.drawButtonUTF8(96, 26, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, 56, 0, 0, valueChar ); + } else { + u8g2.drawButtonUTF8(96, 26, U8G2_BTN_BW0|U8G2_BTN_HCENTER, 56, 0, 0, valueChar ); } } @@ -239,32 +332,35 @@ void updateScreen() { */ //Tabs - u8g2.drawHLine(0, 51, 128); - u8g2.setFont(u8g2_font_5x7_tr); - + u8g2.drawHLine(0, 53, 128); + u8g2.setFont(velvetscreen); + byte yPos = 61; + byte xWidth = 12; if (displayTab == 0) { if (insideTab == true || shiftBtnPushed == true) { - u8g2.drawButtonUTF8(4, 60, U8G2_BTN_BW1, 0, 3, 2, "BPM" ); + u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_HCENTER, xWidth-2, 0, 2, "w" ); } else { - u8g2.drawButtonUTF8(4, 60, U8G2_BTN_BW1|U8G2_BTN_INV, 0, 3, 2, "BPM" ); + u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, xWidth-2, 0, 2, "w" ); } } else { - u8g2.drawButtonUTF8(4, 60, U8G2_BTN_BW0, 0, 3, 2, "BPM" ); + u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW0|U8G2_BTN_HCENTER, xWidth, 0, 2, "w" ); } for (int i = 1; i <= 6; i++) { + String tabNameStr = String(i); + char tabNameChar[3]; + tabNameStr.toCharArray(tabNameChar, 3); if (displayTab == i) { - if (insideTab == true || shiftBtnPushed == true) { //hot mess, but for some reason it didn't want to take string/char variables - u8g2.drawButtonUTF8(i*13 + 13, 60, U8G2_BTN_BW1, 0, 3, 2, (i == 1) ? "1" : (i == 2) ? "2" : (i == 3) ? "3" : (i == 4) ? "4" : (i == 5) ? "5" : (i == 5) ? "5" : (i == 6) ? "6" : "0"); + if (insideTab == true || shiftBtnPushed == true) { + u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_HCENTER, xWidth-2, 0, 2, tabNameChar); } else { - u8g2.drawButtonUTF8(i*13 + 13, 60, U8G2_BTN_BW1|U8G2_BTN_INV, 0, 3, 2, (i == 1) ? "1" : (i == 2) ? "2" : (i == 3) ? "3" : (i == 4) ? "4" : (i == 5) ? "5" : (i == 5) ? "5" : (i == 6) ? "6" : "0"); + u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, xWidth-2, 0, 2, tabNameChar); } } else { - u8g2.drawButtonUTF8(i*13 + 13, 60, U8G2_BTN_BW0, 0, 3, 2, (i == 1) ? "1" : (i == 2) ? "2" : (i == 3) ? "3" : (i == 4) ? "4" : (i == 5) ? "5" : (i == 5) ? "5" : (i == 6) ? "6" : "0"); + u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW0|U8G2_BTN_HCENTER, xWidth, 0, 2, tabNameChar); } } - //u8g2.sendBuffer(); } while ( u8g2.nextPage() ); } \ No newline at end of file