Skip to content
Open
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
139 changes: 91 additions & 48 deletions src/M5StackSAM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ void M5SAM::clearList(){
}

void M5SAM::addList(String inStr){
if(inStr.length()<=M5SAM_LIST_MAX_LABEL_SIZE and inStr.length()>0 and list_count < M5SAM_LIST_MAX_COUNT){
if(inStr.length()<=listMaxLabelSize and inStr.length()>0 and list_count < M5SAM_LIST_MAX_COUNT){
list_labels[list_count] = inStr;
list_count++;
}
if(list_count>0){
if(list_count > M5SAM_LIST_PAGE_LABELS){
list_lastpagelines = list_count % M5SAM_LIST_PAGE_LABELS;
if(list_count > listPagination){
list_lastpagelines = list_count % listPagination;
if(list_lastpagelines>0){
list_pages = (list_count - list_lastpagelines) / M5SAM_LIST_PAGE_LABELS;
list_pages = (list_count - list_lastpagelines) / listPagination;
list_pages++;
}else{
list_pages = list_count / M5SAM_LIST_PAGE_LABELS;
list_pages = list_count / listPagination;
}
}else{
list_pages = 1;
Expand All @@ -58,69 +58,72 @@ byte M5SAM::getListID(){
return list_idx;
}
void M5SAM::setListID(byte idx) {
if(idx< list_page * M5SAM_LIST_PAGE_LABELS + list_lines){
if(idx< list_page * listPagination + list_lines){
list_idx = idx;
}
list_page = list_idx / M5SAM_LIST_PAGE_LABELS;
list_page = list_idx / listPagination;
}

String M5SAM::getListString(){
return list_labels[list_idx];
}

void M5SAM::nextList(){
if(list_idx< list_page * M5SAM_LIST_PAGE_LABELS + list_lines - 1){
void M5SAM::nextList( bool renderAfter ){
if(list_idx< list_page * listPagination + list_lines - 1){
list_idx++;
}else{
if(list_page<list_pages - 1){
list_page++;
}else{
list_page = 0;
}
list_idx = list_page * M5SAM_LIST_PAGE_LABELS;
list_idx = list_page * listPagination;
}
showList();
if( renderAfter ) showList();
}

void M5SAM::drawListItem(byte inIDX, byte postIDX){
if(inIDX==list_idx){
M5.Lcd.drawString(list_labels[inIDX],15,80+(postIDX*20),2);
M5.Lcd.drawString(">",3,80+(postIDX*20),2);
M5.Lcd.drawString(list_labels[inIDX],15,listPageLabelsOffset+(postIDX*20),2);
M5.Lcd.drawString(">",3,listPageLabelsOffset+(postIDX*20),2);
}else{
M5.Lcd.drawString(list_labels[inIDX],15,80+(postIDX*20),2);
M5.Lcd.drawString(list_labels[inIDX],15,listPageLabelsOffset+(postIDX*20),2);
}
}

void M5SAM::showList(){
windowClr();
byte labelid = 0;
M5.Lcd.drawCentreString(listCaption,M5.Lcd.width()/2,45,2);
M5.Lcd.setTextDatum( listCaptionDatum );
//M5.Lcd.drawCentreString(listCaption,M5.Lcd.width()/2,45,2);
M5.Lcd.drawString(listCaption, listCaptionXPos, listCaptionYPos, 2);
M5.Lcd.setTextDatum( TL_DATUM );
if((list_page + 1) == list_pages){
if(list_lastpagelines == 0 and list_count >= M5SAM_LIST_PAGE_LABELS){
list_lines = M5SAM_LIST_PAGE_LABELS;
for(byte i = 0;i<M5SAM_LIST_PAGE_LABELS;i++){
labelid = i+(list_page*M5SAM_LIST_PAGE_LABELS);
if(list_lastpagelines == 0 and list_count >= listPagination){
list_lines = listPagination;
for(byte i = 0;i<listPagination;i++){
labelid = i+(list_page*listPagination);
drawListItem(labelid,i);
}
}else{
if(list_pages>1){
list_lines = list_lastpagelines;
for(byte i = 0;i<list_lastpagelines;i++){
labelid = i+(list_page*M5SAM_LIST_PAGE_LABELS);
labelid = i+(list_page*listPagination);
drawListItem(labelid,i);
}
}else{
list_lines = list_count;
for(byte i = 0;i<list_count;i++){
labelid = i+(list_page*M5SAM_LIST_PAGE_LABELS);
labelid = i+(list_page*listPagination);
drawListItem(labelid,i);
}
}
}
}else{
list_lines = M5SAM_LIST_PAGE_LABELS;
for(byte i = 0;i<M5SAM_LIST_PAGE_LABELS;i++){
labelid = i+(list_page*M5SAM_LIST_PAGE_LABELS);
list_lines = listPagination;
for(byte i = 0;i<listPagination;i++){
labelid = i+(list_page*listPagination);
drawListItem(labelid,i);
}
}
Expand Down Expand Up @@ -148,7 +151,7 @@ void M5SAM::GoToLevel(byte inlevel){

void M5SAM::execute(){
if(menuList[levelIDX][menuIDX].gotoLevel==-1){
(*menuList[levelIDX][menuIDX].function)();
(*menuList[levelIDX][menuIDX].function)();
}else{
GoToLevel(menuList[levelIDX][menuIDX].gotoLevel);
}
Expand Down Expand Up @@ -218,18 +221,8 @@ String M5SAM::keyboardGetString(){
return tmp_str;
}

void M5SAM::btnRestore(){
M5.Lcd.setTextColor(menutextcolor);
M5.Lcd.fillRoundRect(0,M5.Lcd.height()-28,M5.Lcd.width(),28,3,0x00);
M5.Lcd.fillRoundRect(31,M5.Lcd.height()-28,60,28,3,menucolor);
M5.Lcd.fillRoundRect(126,M5.Lcd.height()-28,60,28,3,menucolor);
M5.Lcd.fillRoundRect(221,M5.Lcd.height()-28,60,28,3,menucolor);
M5.Lcd.drawCentreString(lastBtnTittle[0],31+30,M5.Lcd.height()-28+6,2);
M5.Lcd.drawCentreString(lastBtnTittle[1],126+30,M5.Lcd.height()-28+6,2);
M5.Lcd.drawCentreString(lastBtnTittle[2],221+30,M5.Lcd.height()-28+6,2);
M5.Lcd.setTextColor(menutextcolor,windowcolor);
}

/*
void M5SAM::keyboardEnable(){
pinMode(5, INPUT);
attachInterrupt(digitalPinToInterrupt(5), keyboardIRQ, FALLING);
Expand All @@ -250,22 +243,72 @@ void M5SAM::keyboardIRQ(){
}
_keyboardIRQRcvd = HIGH;
}
*/

#ifdef ARDUINO_ODROID_ESP32

#define BUTTON_WIDTH 60
#define BUTTON_HWIDTH BUTTON_WIDTH/2 // 30
#define BUTTON_HEIGHT 28
uint16_t buttonsXOffset[4] = {
1, 72, 188, 260
};

void M5SAM::drawMenu(String inmenuttl, String inbtnAttl, String intSpeakerttl, String inbtnBttl, String inbtnCttl, unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intxtcolor) {
lastBtnTittle[1] = intSpeakerttl;
drawMenu(inmenuttl, inbtnAttl, inbtnBttl, inbtnCttl, inmenucolor, inwindowcolor, intxtcolor);
}
void M5SAM::drawAppMenu(String inmenuttl, String inbtnAttl, String intSpeakerttl, String inbtnBttl, String inbtnCttl){
drawMenu(inmenuttl, inbtnAttl, intSpeakerttl, inbtnBttl, inbtnCttl, menucolor, windowcolor, menutextcolor);
M5.Lcd.setTextColor(menutextcolor,windowcolor);
}

#else

#define BUTTON_WIDTH 60
#define BUTTON_HWIDTH BUTTON_WIDTH/2 // 30
#define BUTTON_HEIGHT 28
uint16_t buttonsXOffset[3] = {
31, 126, 221
};

#endif

void M5SAM::btnRestore(){
M5.Lcd.setTextColor(menutextcolor);
M5.Lcd.fillRoundRect(0,M5.Lcd.height()-BUTTON_HEIGHT,M5.Lcd.width(),BUTTON_HEIGHT,3,0x00);
for( byte i=0; i<BUTTONS_COUNT; i++ ) {
M5.Lcd.fillRoundRect(buttonsXOffset[i],M5.Lcd.height()-BUTTON_HEIGHT,BUTTON_WIDTH,BUTTON_HEIGHT,3,menucolor);
if( lastBtnTittle[i] != "" ) {
M5.Lcd.drawCentreString(lastBtnTittle[i],buttonsXOffset[i]+BUTTON_HWIDTH,M5.Lcd.height()-BUTTON_HEIGHT+6,2);
}
}
M5.Lcd.setTextColor(menutextcolor,windowcolor);
}

void M5SAM::drawMenu(String inmenuttl, String inbtnAttl, String inbtnBttl, String inbtnCttl, unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intxtcolor){
lastBtnTittle[0] = inbtnAttl;
lastBtnTittle[1] = inbtnBttl;
lastBtnTittle[2] = inbtnCttl;
M5.Lcd.fillRoundRect(31,M5.Lcd.height()-28,60,28,3,inmenucolor);
M5.Lcd.fillRoundRect(126,M5.Lcd.height()-28,60,28,3,inmenucolor);
M5.Lcd.fillRoundRect(221,M5.Lcd.height()-28,60,28,3,inmenucolor);
M5.Lcd.fillRoundRect(0,0,M5.Lcd.width(),28,3,inmenucolor);
void M5SAM::drawMenu(String inmenuttl, String inbtnAttl, String inbtnBttl, String inbtnCttl, unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intxtcolor) {
#ifdef ARDUINO_ODROID_ESP32
lastBtnTittle[0] = inbtnAttl;
//lastBtnTittle[1] = "";
lastBtnTittle[2] = inbtnBttl;
lastBtnTittle[3] = inbtnCttl;
#else
lastBtnTittle[0] = inbtnAttl;
lastBtnTittle[1] = inbtnBttl;
lastBtnTittle[2] = inbtnCttl;
#endif
for( byte i=0; i<BUTTONS_COUNT; i++ ) {
M5.Lcd.fillRoundRect(buttonsXOffset[i],M5.Lcd.height()-BUTTON_HEIGHT,BUTTON_WIDTH,BUTTON_HEIGHT,3,inmenucolor);
}
M5.Lcd.fillRoundRect(0,0,M5.Lcd.width(),BUTTON_HEIGHT,3,inmenucolor);
M5.Lcd.fillRoundRect(0,32,M5.Lcd.width(),M5.Lcd.height()-32-32,3,inwindowcolor);

M5.Lcd.setTextColor(intxtcolor);
M5.Lcd.drawCentreString(inmenuttl,M5.Lcd.width()/2,6,2);

M5.Lcd.drawCentreString(inbtnAttl,31+30,M5.Lcd.height()-28+6,2);
M5.Lcd.drawCentreString(inbtnBttl,126+30,M5.Lcd.height()-28+6,2);
M5.Lcd.drawCentreString(inbtnCttl,221+30,M5.Lcd.height()-28+6,2);
for( byte i=0; i<BUTTONS_COUNT; i++ ) {
if( lastBtnTittle[i] != "" ) {
M5.Lcd.drawCentreString(lastBtnTittle[i],buttonsXOffset[i]+BUTTON_HWIDTH,M5.Lcd.height()-BUTTON_HEIGHT+6,2);
}
}
}

35 changes: 27 additions & 8 deletions src/M5StackSAM.h
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
#include <M5Stack.h>

/*
// why was it even here ?
#if defined(WIRING) && WIRING >= 100
#include <Wiring.h>
#elif defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

*/
#ifndef M5StackSAM_h
#define M5StackSAM_h

#define M5SAM_MENU_TITLE_MAX_SIZE 24
#define M5SAM_BTN_TITLE_MAX_SIZE 6
#define M5SAM_MAX_SUBMENUS 8

#define M5SAM_LIST_MAX_COUNT 32
#define M5SAM_LIST_MAX_LABEL_SIZE 36
#ifndef M5SAM_LIST_MAX_COUNT
#define M5SAM_LIST_MAX_COUNT 128
#endif

#define M5SAM_LIST_MAX_LABEL_SIZE 36 // list labels will be trimmed
#define M5SAM_LIST_PAGE_LABELS 6

volatile static uint8_t _keyboardIRQRcvd;
volatile static uint8_t _keyboardChar;

#ifdef ARDUINO_ODROID_ESP32
#define BUTTONS_COUNT 4
#else
#define BUTTONS_COUNT 3
#endif

class M5SAM {
public:
Expand All @@ -32,6 +41,9 @@ class M5SAM {
void windowClr();
void setColorSchema(unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intextcolor);
void drawAppMenu(String inmenuttl, String inbtnAttl, String inbtnBttl, String inbtnCttl);
#ifdef ARDUINO_ODROID_ESP32
void drawAppMenu(String inmenuttl, String inbtnAttl, String intSpeakerttl, String inbtnBttl, String inbtnCttl);
#endif
void GoToLevel(byte inlevel);
unsigned int getrgb(byte inred, byte ingrn, byte inblue);
void addMenuItem(byte levelID, const char *menu_title,const char *btnA_title,const char *btnB_title,const char *btnC_title, signed char goto_level, void(*function)());
Expand All @@ -41,11 +53,17 @@ class M5SAM {
byte getListID();
void setListID(byte idx);
String getListString();
void nextList();
void nextList( bool renderAfter = true );
void addList(String inLabel);
void setListCaption(String inCaption);
String keyboardGetString();
String lastBtnTittle[3];
String lastBtnTittle[BUTTONS_COUNT];
uint8_t listMaxLabelSize = M5SAM_LIST_MAX_LABEL_SIZE; // list labels will be trimmed
uint8_t listPagination = M5SAM_LIST_PAGE_LABELS;
uint8_t listPageLabelsOffset = 80; // initially 80, pixels offset from top screen for list items
uint8_t listCaptionDatum = TC_DATUM; // initially TC_DATUM=top centered, TL_DATUM=top left (default), top/right/bottom/left
uint16_t listCaptionXPos = 160; // initially M5.Lcd.width()/2, text cursor position-x for list caption
uint16_t listCaptionYPos = 45; // initially 45, text cursor position-x for list caption

private:
String listCaption;
Expand All @@ -55,16 +73,17 @@ class M5SAM {
void keyboardEnable();
void keyboardDisable();
static void keyboardIRQ();

void drawMenu(String inmenuttl, String inbtnAttl, String inbtnBttl, String inbtnCttl, unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intxtcolor);
#ifdef ARDUINO_ODROID_ESP32
void drawMenu(String inmenuttl, String inbtnAttl, String intSpeakerttl, String inbtnBttl, String inbtnCttl, unsigned int inmenucolor, unsigned int inwindowcolor, unsigned int intxtcolor);
#endif
struct MenuCommandCallback {
char title[M5SAM_MENU_TITLE_MAX_SIZE + 1];
char btnAtitle[M5SAM_BTN_TITLE_MAX_SIZE + 1];
char btnBtitle[M5SAM_BTN_TITLE_MAX_SIZE + 1];
char btnCtitle[M5SAM_BTN_TITLE_MAX_SIZE + 1];
signed char gotoLevel;
void (*function)();

};
String list_labels[M5SAM_LIST_MAX_COUNT];
byte list_lastpagelines;
Expand Down