Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions examples/UART/uart_menu/uart_menu.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/********************
Arduino generic menu system

Rui Azevedo - ruihfazevedo(@rrob@)gmail.com

output: Serial
input: Serial
*/

#include <Arduino.h>

#include <menu.h>
#include <menuIO/serialOut.h>
#include <menuIO/chainStream.h>
#include <menuIO/serialIn.h>
#include <menuIO/uartOut.h>
#include <SoftwareSerial.h>

using namespace Menu;

#define LEDPIN LED_BUILTIN

SoftwareSerial ss(11, 10);


#define MAX_DEPTH 2

// define menu colors --------------------------------------------------------
#define C_BLACK 0
#define C_BLUE 3
#define C_GRAY 7
#define C_WHITE 15
#define C_YELLOW 31
#define C_RED 1
#define C_GREEN 2
//each color is in the format:
// {{disabled normal,disabled selected},{enabled normal,enabled selected, enabled editing}}
const colorDef<uint8_t> colors[] MEMMODE={
{{C_BLACK,C_BLACK}, {C_BLACK,C_BLUE,C_BLUE}},//bgColor
{{C_GRAY,C_GRAY}, {C_WHITE,C_WHITE,C_WHITE}},//fgColor
{{C_WHITE,C_BLACK}, {C_YELLOW,C_YELLOW,C_RED}},//valColor
{{C_WHITE,C_BLACK}, {C_WHITE,C_YELLOW,C_YELLOW}},//unitColor
{{C_WHITE,C_GRAY}, {C_BLACK,C_BLUE,C_WHITE}},//cursorColor
{{C_WHITE,C_YELLOW},{C_GREEN,C_WHITE,C_WHITE}},//titleColor
};


#define offsetX 0
#define offsetY 0
#define U8_Width 240
#define U8_Height 320

#define LEDPIN LED_BUILTIN


int timeOn=10;
int timeOff=90;

MENU(mainMenu, "Settings menu", Menu::doNothing, Menu::noEvent, Menu::wrapStyle
,FIELD(timeOn,"On","ms",0,100,10,1, Menu::doNothing, Menu::noEvent, Menu::noStyle)
,FIELD(timeOff,"Off","ms",0,100,10,1,Menu::doNothing, Menu::noEvent, Menu::noStyle)
,EXIT("<Back")
);

serialIn serial(Serial);

MENU_INPUTS(in,&serial);

MENU_OUTPUTS(out,MAX_DEPTH
,UART_OUT(ss,colors,uartOut::systemFont::font24,offsetX,offsetY,{0,0,U8_Width/uartOut::systemFont::font24*2,U8_Height/uartOut::systemFont::font24})
,SERIAL_OUT(Serial)
);

NAVROOT(nav,mainMenu,MAX_DEPTH,in,out);

void setup() {
pinMode(LEDPIN, OUTPUT);
Serial.begin(115200);
ss.begin(115200);
while(!Serial);
Serial.println("Menu 4.x");
Serial.println("Use keys + - * /");
Serial.println("to control the menu navigation");
}

void loop() {
nav.doInput();
if (nav.changed(0)) {
//only draw if menu changed for gfx device
nav.doOutput();
}
digitalWrite(LEDPIN, HIGH);
delay(timeOn);
digitalWrite(LEDPIN, LOW);
delay(timeOff);
}

7 changes: 7 additions & 0 deletions src/macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
#define TFT_OUT(...) ON(TFT_OUT,__COUNTER__,__VA_ARGS__)
#define U8GLIB_OUT(...) ON(U8GLIB_OUT,__COUNTER__,__VA_ARGS__)
#define U8G2_OUT(...) ON(U8G2_OUT,__COUNTER__,__VA_ARGS__)
#define UART_OUT(...) ON(UART_OUT,__COUNTER__,__VA_ARGS__)
#define UCG_OUT(...) ON(UCG_OUT,__COUNTER__,__VA_ARGS__)
#define U8X8_OUT(...) ON(U8X8_OUT,__COUNTER__,__VA_ARGS__)
#define UTFT_OUT(...) ON(UTFT_OUT,__COUNTER__,__VA_ARGS__)
Expand Down Expand Up @@ -130,6 +131,11 @@ Menu::idx_t id##Tops##n[md];\
PANELS(id##Panels##n,__VA_ARGS__);\
Menu::u8g2Out id##n(gfx,color,id##Tops##n,id##Panels##n,fontW,fontH,offsetX,offsetY);

#define VAR_UART_OUT(id,md,n,gfx,color,font,offsetX,offsetY,...)\
Menu::idx_t id##Tops##n[md];\
PANELS(id##Panels##n,__VA_ARGS__);\
Menu::uartOut id##n(gfx,color,id##Tops##n,id##Panels##n,font,offsetX,offsetY);

#define VAR_UCG_OUT(id,md,n,gfx,color,fontW,fontH,offsetX,offsetY,...)\
Menu::idx_t id##Tops##n[md];\
PANELS(id##Panels##n,__VA_ARGS__);\
Expand All @@ -153,6 +159,7 @@ Menu::utftOut id##n(gfx,color,id##Tops##n,id##Panels##n,fontW,fontH);
#define REF_ADAGFX_OUT(id,md,n,...) &id##n,
#define REF_U8GLIB_OUT(id,md,n,...) &id##n,
#define REF_U8G2_OUT(id,md,n,...) &id##n,
#define REF_UART_OUT(id,md,n,...) &id##n,
#define REF_UCG_OUT(id,md,n,...) &id##n,
#define REF_U8X8_OUT(id,md,n,...) &id##n,
#define REF_UTFT_OUT(id,md,n,...) &id##n,
Expand Down
168 changes: 168 additions & 0 deletions src/menuIO/uartOut.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
/* -*- C++ -*- */

/********************
Oct. 2016 Stephen Denne https://github.com/datacute
Based on U8GLibOut.h from Rui Azevedo - ruihfazevedo(@rrob@)gmail.com
Original from: https://github.com/christophepersoz

Use graphics screens as menu output, based on U8G2 graphic display
www.r-site.net

***/
#ifndef RSITE_ARDUINOP_MENU_UART
#define RSITE_ARDUINOP_MENU_UART
#include "menuDefs.h"

namespace Menu {

class uartOut:public gfxOut {
public:
enum systemFont {
font16 = 16,
font24 = 24,
font32 = 32
};
int8_t offsetX=0;
int8_t offsetY=0;
int cursorX = 0;
int cursorY = 0;
char buf[100];
int currentColor = 0;
int m_bgColor = 0;
systemFont m_Font;
Stream& stream;
const colorDef<uint8_t> (&colors)[nColors];
uartOut(
Stream& stream,
const colorDef<uint8_t> (&c)[nColors],
idx_t* t,
panelsList &p,
systemFont font = font24,
idx_t offsetX=0,
idx_t offsetY=0,
int fontMarginY=1
) :gfxOut(font/2,font,t,p,(styles)(menuOut::redraw|menuOut::rasterDraw)),stream(stream),colors(c)
{
this->offsetX=offsetX;
this->offsetY=offsetY;
this->fontMarginY=fontMarginY;
this->m_Font = font;
}

size_t write(uint8_t ch) override
{
sprintf(buf,"SBC(%d);DCV%d(%d,%d,'%c',%d);", m_bgColor, m_Font, cursorX, cursorY - resY + fontMarginY, (char)ch, currentColor);
sendCommand(buf);
cursorX = cursorX + resX;
return 1;
}

inline uint8_t getColor(colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) const
{
return memByte(&(stat==enabledStatus?colors[color].enabled[selected+edit]:colors[color].disabled[selected]));
}

void setBgColor(colorDefs c,bool selected=false,status s=enabledStatus,bool edit=false)
{
m_bgColor = getColor(c,selected,s,edit);
}

void setColor(colorDefs c,bool selected=false,status s=enabledStatus,bool edit=false) override
{
currentColor = getColor(c,selected,s,edit);
}

void clearLine(idx_t ln,idx_t panelNr=0,colorDefs color=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override
{
const panel p=panels[panelNr];
setBgColor(color,selected,stat,edit);
drawBox(p.x*resX + offsetX, (p.y+ln)*resY + offsetY, maxX()*resX, resY);
}

void clear() override
{
sendCommand("CLR(7);");
panels.reset();
}

void clear(idx_t panelNr) override
{
const panel p=panels[panelNr];
setBgColor(bgColor,false,enabledStatus,false);;
drawBox(p.x*resX + offsetX,p.y*resY + offsetY,p.w*resX,p.h*resY);
panels.nodes[panelNr]=NULL;
}

void box(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override
{
const panel p=panels[panelNr];
setBgColor(c, selected, stat, edit);
drawFrame((p.x+x)*resX,(p.y+y)*resY, w*resX, h*resY);
}

void rect(idx_t panelNr,idx_t x,idx_t y,idx_t w=1,idx_t h=1,colorDefs c=bgColor,bool selected=false,status stat=enabledStatus,bool edit=false) override
{
const panel p=panels[panelNr];
setBgColor(c, selected, stat, edit);
drawBox((p.x+x)*resX, (p.y+y)*resY, w*resX, h*resY);
}

void setCursor(idx_t x,idx_t y,idx_t panelNr=0) override
{
const panel p=panels[panelNr];
cursorX = (p.x+x)*resX+fontMarginX + offsetX;
cursorY = (p.y+y+1)*resY-fontMarginY + offsetY;
}

void drawCursor(idx_t ln,bool selected,status stat,bool edit=false,idx_t panelNr=0) override
{
const panel p=panels[panelNr];
setBgColor(cursorColor,selected,stat);
drawFrame(p.x*resX + offsetX, (p.y+ln)*resY + offsetY, maxX()*resX, resY);
}

idx_t printRaw(const char* at,idx_t len) override
{
sprintf_P(buf,PSTR("SBC(%d);DCV%d(%d,%d,'%S',%d);"), m_bgColor, m_Font, cursorX, cursorY - resY + fontMarginY, at, currentColor);
sendCommand(buf);
cursorX = cursorX + strlen_P(at)*resX;
return strlen_P(at);
}

private:

void checkStreamReady()
{
int cnt = 0, timeOutCounter = 1000;
while (timeOutCounter-- > 0)
{
delay(1);
if (stream.available() > 0)
{
stream.read();
if (++cnt == 4) break;
}
}
}

void sendCommand(char * cmd)
{
stream.println(cmd);
//Serial.println(cmd);
checkStreamReady();
}

void drawFrame(int x, int y, int w, int h)
{
sprintf(buf, "BOX(%d,%d,%d,%d,%d);", x, y, x + w, y + h, m_bgColor);
sendCommand(buf);
}

void drawBox(int x, int y, int w, int h)
{
sprintf(buf, "BOXF(%d,%d,%d,%d,%d);", x, y, x + w, y + h, m_bgColor);
sendCommand(buf);
}
};
}
#endif //RSITE_ARDUINOP_MENU_UART