From caaf8cba13fd173038bc7b68c71bfb7ae329c183 Mon Sep 17 00:00:00 2001 From: KemoNine Date: Sun, 13 Sep 2020 03:41:21 -0400 Subject: [PATCH] Initial setup of diagram list --- hardware/_controller/_controller.ino | 142 ++++++++++++++++++++++-- hardware/_controller/_controller.prj | Bin 7925 -> 9187 bytes hardware/_controller/_controller_GSLC.h | 72 +++++++++--- 3 files changed, 193 insertions(+), 21 deletions(-) diff --git a/hardware/_controller/_controller.ino b/hardware/_controller/_controller.ino index be49952..a59a29c 100644 --- a/hardware/_controller/_controller.ino +++ b/hardware/_controller/_controller.ino @@ -83,16 +83,23 @@ Adafruit_NeoPixel pixels_wing(PIXELS_NUM_WING, PIXELS_WING_PIN, NEO_GRB + NEO_KH // GUI state globals bool textChanged = false; bool popupOnScreen = false; +int listDiagramsSize = -1; +int listDiagramSelection = -1; +int listDiagramsRowsShown = 0; // Various loop handlers void handlerKeyboard(); void handlerBatteryLevel(); void processRingBuffer(); void sdCardInfo(); +void listNext(gslc_tsElemRef*); +void listPrevious(gslc_tsElemRef*); // Save some element references for direct access // +gslc_tsElemRef* m_SliderDiagrams = NULL; gslc_tsElemRef* m_pElemBatteryLevel= NULL; +gslc_tsElemRef* m_pElemLsDiagrams = NULL; gslc_tsElemRef* m_pElemRd1152 = NULL; gslc_tsElemRef* m_pElemRd96 = NULL; gslc_tsElemRef* m_pElemRdUART0 = NULL; @@ -137,11 +144,57 @@ bool CbBtnCommon(void* pvGui,void *pvElemRef,gslc_teTouch eTouch,int16_t nX,int1 // // // -// -// +bool CbListbox(void* pvGui, void* pvElemRef, int16_t nSelId) +{ + gslc_tsGui* pGui = (gslc_tsGui*)(pvGui); + gslc_tsElemRef* pElemRef = (gslc_tsElemRef*)(pvElemRef); + gslc_tsElem* pElem = gslc_GetElemFromRef(pGui, pElemRef); + char acTxt[MAX_STR + 1]; + + if (pElemRef == NULL) { + return false; + } + + // From the element's ID we can determine which listbox was active. + switch (pElem->nId) { +// + case E_ELEM_LS_DIA: + if (nSelId != XLISTBOX_SEL_NONE) { + gslc_ElemXListboxGetItem(&m_gui, pElemRef, nSelId, acTxt, MAX_STR); + } + break; + +// + default: + break; + } + return true; +} // // // +bool CbSlidePos(void* pvGui,void* pvElemRef,int16_t nPos) +{ + gslc_tsGui* pGui = (gslc_tsGui*)(pvGui); + gslc_tsElemRef* pElemRef = (gslc_tsElemRef*)(pvElemRef); + gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); + int16_t nVal; + + // From the element's ID we can determine which slider was updated. + switch (pElem->nId) { +// + case E_SLR_DIAGRAMS: + // Fetch the slider position + nVal = gslc_ElemXSliderGetPos(pGui,m_SliderDiagrams); + break; + +// + default: + break; + } + + return true; +} // // // @@ -214,11 +267,41 @@ void setup() { // Create the GUI input mapping (pin event to GUI action) gslc_InitInputMap(&m_gui, m_asInputMap, MAX_INPUT_MAP); gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_UP, GSLC_ACTION_FOCUS_NEXT, 0); - gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_DN, GSLC_ACTION_FOCUS_PREV, 0); + gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_DN, GSLC_ACTION_FOCUS_PREV, 0); gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_LF, GSLC_ACTION_FOCUS_NEXT, 0); gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_RT, GSLC_ACTION_FOCUS_PREV, 0); gslc_InputMapAdd(&m_gui, GSLC_INPUT_PIN_ASSERT, KBD_SW_OK, GSLC_ACTION_SELECT, 0); + // Setup list of diagrams + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Raspberry Pi"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Friendly Arm M4"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Orange Pi v1"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Banana Pi"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "O-Droid HC2"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Arduino (AVR)"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Ardunio (ARM)"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Cisco Console"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "APC Console"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Raritan Console"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Adafruit Feather"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "Adafruit Metro"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 01]"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 02]"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 03]"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 04]"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 05]"); + gslc_ElemXListboxAddItem(&m_gui, m_pElemLsDiagrams, "[Unused 06]"); + gslc_ElemXListboxSetSel(&m_gui, m_pElemLsDiagrams, listDiagramSelection); + + // Set diagrams slider max equal to the number of elements + listDiagramsSize = gslc_ElemXListboxGetItemCnt(&m_gui, m_pElemLsDiagrams); + gslc_tsXSlider* pSlider = (gslc_tsXSlider*)gslc_GetXDataFromRef(&m_gui,m_SliderDiagrams,GSLC_TYPEX_SLIDER,__LINE__); + pSlider->nPosMax = listDiagramsSize; + + // Figure out how many rows are shown for diagrams list and cache (needed for scrolling) + gslc_tsXListbox* pListBox = (gslc_tsXListbox*)gslc_GetXDataFromRef(&m_gui,m_pElemLsDiagrams,GSLC_TYPEX_LISTBOX,__LINE__); + listDiagramsRowsShown = pListBox->nRows; + // Set neopixels to standard start state pixels_wing.clear(); pixels_wing.show(); @@ -286,6 +369,12 @@ void handlerKeyboard() { } // Raspberry Pi Screen Flip else if (gslc_GetPageCur(&m_gui) == E_CONF_RPI) { + sdCardInfo(); + gslc_ElemSetTxtStr(&m_gui, m_pElemStatusText, "Wiring Diagrams"); + gslc_SetPageCur(&m_gui, E_WIRING); + } + // Wiring Diagram Screen Flip + else if (gslc_GetPageCur(&m_gui) == E_WIRING) { sdCardInfo(); gslc_ElemSetTxtStr(&m_gui, m_pElemStatusText, "SD Card"); gslc_SetPageCur(&m_gui, E_SD_CARD); @@ -298,10 +387,24 @@ void handlerKeyboard() { } // Add keys to the key buffer that are mapped to UI functions (only for config screens) else if (key.key == KBD_SW_UP - || key.key == KBD_SW_DN - || key.key == KBD_SW_LF - || key.key == KBD_SW_RT - || key.key == KBD_SW_OK) { + || key.key == KBD_SW_LF) { + if (gslc_GetPageCur(&m_gui) == E_WIRING) { + listPreviousDiagrams(); + } + else { + uiKeyBuffer.push(key.key); + } + } + else if (key.key == KBD_SW_DN + || key.key == KBD_SW_RT) { + if (gslc_GetPageCur(&m_gui) == E_WIRING) { + listNextDiagrams(); + } + else { + uiKeyBuffer.push(key.key); + } + } + else if (key.key == KBD_SW_OK) { uiKeyBuffer.push(key.key); } // Process keys 'normally' @@ -376,6 +479,31 @@ void handlerBatteryLevel() { pixels_board.show(); } +// ------------------------------------------------ +// List next/previous handlers (no way to do this with the std kbd stuff) +// ------------------------------------------------ +void diagramsScrollUpdate() { + gslc_ElemXListboxSetSel(&m_gui, m_pElemLsDiagrams, listDiagramSelection); + gslc_ElemXSliderSetPos(&m_gui, m_SliderDiagrams, listDiagramSelection); + gslc_ElemXListboxSetScrollPos(&m_gui, m_pElemLsDiagrams, listDiagramSelection); +} +void listNextDiagrams() { + listDiagramSelection++; + if (listDiagramSelection >= listDiagramsSize) { + listDiagramSelection = -1; + } + diagramsScrollUpdate(); +} + +void listPreviousDiagrams() { + listDiagramSelection--; + if (listDiagramSelection < -1) { + listDiagramSelection = listDiagramsSize-1; + } + diagramsScrollUpdate(); +} + + // ------------------------------------------------ // SD Card Info // ------------------------------------------------ diff --git a/hardware/_controller/_controller.prj b/hardware/_controller/_controller.prj index 07c2dd870c8f8e5a5f22aee2933490cc9230ffea..f73a46eb98c1947117eed4ea783f184970668861 100644 GIT binary patch delta 931 zcmZ9Kzi-n(6vy*RB^6RTbbzWQ2#OF;i8weQb%@kEpPjQ6Uux&#xLvBmX&h1~ZIO$e zEL}P?a61zJK~evJiiN*{fel7hcJ9)Ix}0R|bno5wz59IMpUThb#VC_rxID^S+$VW; zzopwcsfMZCPTM~SbKl?9B>-Jd1!B1tfKq(y$+psw`!e(a6vudaPIhQRicF+Q00d^+ zCG0AHe}&l2mPS>FxKd1A$u=yP$=Qhm#9 zHo!yS=*hWSY2=rU`OjWYgCU- zOk#k`fI|X+{a$~F6g4)QB`Y*3c;(3|==q>3YJ!mk60s;5gB)!l7Jpn)*~{G4nSk6? zEJx>R>Uhdd;cRZsCj1d~&Yn`u=-Fxj?UDhhLy|cX&#^i@r&A3M_gv$K<4_0_p5SVU2yddnd!UgTnge z6cL$^f+9^!G~+X4o*4z)&&sxjdMg@&b`r`f>)wr7vmZ|ArP^QtzBmOei-+!KqlU?M6-p*aELnQa5My}XegubeyC;_k3_IvI%_spUB)v`P#{&N|aB{ F)?fHu99RGV delta 107 zcmaFt{?&Fv9up($=6t3N5+a=u-h>Jb!@U // Include extended elements #include "src/guislice/XCheckbox.h" +#include "src/guislice/XListbox.h" #include "src/guislice/XProgress.h" +#include "src/guislice/XSlider.h" #include "src/guislice/XTextbox.h" // @@ -48,11 +50,12 @@ // Enumerations for pages, elements, fonts, images // ------------------------------------------------ // -enum {E_PG_BASE,E_PG_MAIN,E_CONF_RPI,E_SD_CARD}; -enum {E_ELEM_BATT_LEVEL,E_ELEM_RD96,E_ELEM_RD_1152,E_ELEM_RD_UART0 - ,E_ELEM_RD_UART5,E_ELEM_STATUS,E_ELEM_TEXT,E_ELEM_TEXT3 - ,E_ELEM_TEXT4,E_ELEM_TX96,E_ELEM_TX_1152,E_ELEM_TX_SD_INFO - ,E_ELEM_TX_UART1,E_ELEM_TX_UART5,E_STATUS_LINE}; +enum {E_PG_BASE,E_PG_MAIN,E_CONF_RPI,E_WIRING,E_SD_CARD}; +enum {E_ELEM_BATT_LEVEL,E_ELEM_LS_DIA,E_ELEM_RD96,E_ELEM_RD_1152 + ,E_ELEM_RD_UART0,E_ELEM_RD_UART5,E_ELEM_STATUS,E_ELEM_TEXT + ,E_ELEM_TEXT3,E_ELEM_TEXT4,E_ELEM_TX96,E_ELEM_TX_1152 + ,E_ELEM_TX_SD_INFO,E_ELEM_TX_UART1,E_ELEM_TX_UART5,E_SLR_DIAGRAMS + ,E_STATUS_LINE}; enum {E_GRP_SPD,E_GRP_UART}; // Must use separate enum for fonts with MAX_FONT at end to use gslc_FontSet. enum {E_AO_NOTOMONO8PT7B,MAX_FONT}; @@ -66,7 +69,7 @@ enum {E_AO_NOTOMONO8PT7B,MAX_FONT}; // Define the maximum number of elements and pages // ------------------------------------------------ // -#define MAX_PAGE 4 +#define MAX_PAGE 5 #define MAX_ELEM_PG_BASE 3 // # Elems total on page #define MAX_ELEM_PG_BASE_RAM MAX_ELEM_PG_BASE // # Elems in RAM @@ -77,6 +80,9 @@ enum {E_AO_NOTOMONO8PT7B,MAX_FONT}; #define MAX_ELEM_CONF_RPI 10 // # Elems total on page #define MAX_ELEM_CONF_RPI_RAM MAX_ELEM_CONF_RPI // # Elems in RAM +#define MAX_ELEM_WIRING 3 // # Elems total on page +#define MAX_ELEM_WIRING_RAM MAX_ELEM_WIRING // # Elems in RAM + #define MAX_ELEM_SD_CARD 1 // # Elems total on page #define MAX_ELEM_SD_CARD_RAM MAX_ELEM_SD_CARD // # Elems in RAM // @@ -96,8 +102,10 @@ gslc_tsElem m_asPage1Elem[MAX_ELEM_PG_MAIN_RAM]; gslc_tsElemRef m_asPage1ElemRef[MAX_ELEM_PG_MAIN]; gslc_tsElem m_asPage2Elem[MAX_ELEM_CONF_RPI_RAM]; gslc_tsElemRef m_asPage2ElemRef[MAX_ELEM_CONF_RPI]; -gslc_tsElem m_asPage3Elem[MAX_ELEM_SD_CARD_RAM]; -gslc_tsElemRef m_asPage3ElemRef[MAX_ELEM_SD_CARD]; +gslc_tsElem m_asPage3Elem[MAX_ELEM_WIRING_RAM]; +gslc_tsElemRef m_asPage3ElemRef[MAX_ELEM_WIRING]; +gslc_tsElem m_asPage4Elem[MAX_ELEM_SD_CARD_RAM]; +gslc_tsElemRef m_asPage4ElemRef[MAX_ELEM_SD_CARD]; gslc_tsXProgress m_sXBarGauge2; gslc_tsXTextbox m_sTextbox1; char m_acTextboxBuf1[952]; // NRows=17 NCols=56 @@ -105,8 +113,12 @@ gslc_tsXCheckbox m_asXRadio1; gslc_tsXCheckbox m_asXRadio2; gslc_tsXCheckbox m_asXRadio3; gslc_tsXCheckbox m_asXRadio4; -gslc_tsXTextbox m_sTextbox2; -char m_acTextboxBuf2[696]; // NRows=12 NCols=58 +gslc_tsXListbox m_sListbox1; +// - Note that XLISTBOX_BUF_OH_R is extra required per item +char m_acListboxBuf1[512 + XLISTBOX_BUF_OH_R]; +gslc_tsXSlider m_sListScroll1; +gslc_tsXTextbox m_sTextbox3; +char m_acTextboxBuf3[696]; // NRows=12 NCols=58 #define MAX_STR 100 @@ -118,7 +130,9 @@ char m_acTextboxBuf2[696]; // NRows=12 NCols=58 // Element References for direct access // +extern gslc_tsElemRef* m_SliderDiagrams; extern gslc_tsElemRef* m_pElemBatteryLevel; +extern gslc_tsElemRef* m_pElemLsDiagrams; extern gslc_tsElemRef* m_pElemRd1152; extern gslc_tsElemRef* m_pElemRd96; extern gslc_tsElemRef* m_pElemRdUART0; @@ -127,7 +141,7 @@ extern gslc_tsElemRef* m_pElemSDInfo; extern gslc_tsElemRef* m_pElemStatusText; extern gslc_tsElemRef* m_pElemText; extern gslc_tsElemRef* m_pTextSlider; -extern gslc_tsElemRef* m_pTextSliderSDInfo; +extern gslc_tsElemRef* m_pTextSlider3; // // Define debug message function @@ -165,7 +179,8 @@ void InitGUIslice_gen() gslc_PageAdd(&m_gui,E_PG_BASE,m_asBasePage1Elem,MAX_ELEM_PG_BASE_RAM,m_asBasePage1ElemRef,MAX_ELEM_PG_BASE); gslc_PageAdd(&m_gui,E_PG_MAIN,m_asPage1Elem,MAX_ELEM_PG_MAIN_RAM,m_asPage1ElemRef,MAX_ELEM_PG_MAIN); gslc_PageAdd(&m_gui,E_CONF_RPI,m_asPage2Elem,MAX_ELEM_CONF_RPI_RAM,m_asPage2ElemRef,MAX_ELEM_CONF_RPI); - gslc_PageAdd(&m_gui,E_SD_CARD,m_asPage3Elem,MAX_ELEM_SD_CARD_RAM,m_asPage3ElemRef,MAX_ELEM_SD_CARD); + gslc_PageAdd(&m_gui,E_WIRING,m_asPage3Elem,MAX_ELEM_WIRING_RAM,m_asPage3ElemRef,MAX_ELEM_WIRING); + gslc_PageAdd(&m_gui,E_SD_CARD,m_asPage4Elem,MAX_ELEM_SD_CARD_RAM,m_asPage4ElemRef,MAX_ELEM_SD_CARD); // Now mark E_PG_BASE as a "base" page which means that it's elements // are always visible. This is useful for common page elements. @@ -269,14 +284,43 @@ void InitGUIslice_gen() (char*)"9600",0,E_AO_NOTOMONO8PT7B); gslc_ElemSetTxtCol(&m_gui,pElemRef,GSLC_COL_GRAY_LT3); + // ----------------------------------- + // PAGE: E_WIRING + + + // Create wrapping box for listbox E_ELEM_LS_DIA and scrollbar + pElemRef = gslc_ElemCreateBox(&m_gui,GSLC_ID_AUTO,E_WIRING,(gslc_tsRect){3,30,313,200}); + gslc_ElemSetCol(&m_gui,pElemRef,GSLC_COL_GRAY,GSLC_COL_BLACK,GSLC_COL_BLUE_LT2); + + // Create listbox + pElemRef = gslc_ElemXListboxCreate(&m_gui,E_ELEM_LS_DIA,E_WIRING,&m_sListbox1, + (gslc_tsRect){3+2,30+4,313-23,200-7},E_AO_NOTOMONO8PT7B, + (uint8_t*)&m_acListboxBuf1,sizeof(m_acListboxBuf1),-1); + gslc_ElemXListboxSetSize(&m_gui, pElemRef, 12, 1); // 12 rows, 1 columns + gslc_ElemXListboxItemsSetSize(&m_gui, pElemRef, XLISTBOX_SIZE_AUTO, XLISTBOX_SIZE_AUTO); + gslc_ElemSetTxtMarginXY(&m_gui, pElemRef, 5, 0); + gslc_ElemSetTxtCol(&m_gui,pElemRef,GSLC_COL_GRAY_LT3); + gslc_ElemSetCol(&m_gui,pElemRef,GSLC_COL_GRAY,GSLC_COL_BLACK,GSLC_COL_BLUE_LT2); + gslc_ElemXListboxSetSelFunc(&m_gui, pElemRef, &CbListbox); + gslc_ElemXListboxItemsSetGap(&m_gui, pElemRef, 2,GSLC_COL_BLACK); + gslc_ElemSetFrameEn(&m_gui,pElemRef,true); + m_pElemLsDiagrams = pElemRef; + + // Create vertical scrollbar for listbox + pElemRef = gslc_ElemXSliderCreate(&m_gui,E_SLR_DIAGRAMS,E_WIRING,&m_sListScroll1, + (gslc_tsRect){3+313-21,30+4,20,200-8},0,0,0,5,true); + gslc_ElemSetCol(&m_gui,pElemRef,GSLC_COL_GRAY,GSLC_COL_BLACK,GSLC_COL_GRAY); + gslc_ElemXSliderSetPosFunc(&m_gui,pElemRef,&CbSlidePos); + m_SliderDiagrams = pElemRef; + // ----------------------------------- // PAGE: E_SD_CARD // Create textbox - pElemRef = gslc_ElemXTextboxCreate(&m_gui,E_ELEM_TX_SD_INFO,E_SD_CARD,&m_sTextbox2, + pElemRef = gslc_ElemXTextboxCreate(&m_gui,E_ELEM_TX_SD_INFO,E_SD_CARD,&m_sTextbox3, (gslc_tsRect){3,30,323,200},E_AO_NOTOMONO8PT7B, - (char*)&m_acTextboxBuf2,12,58); + (char*)&m_acTextboxBuf3,12,58); gslc_ElemXTextboxWrapSet(&m_gui,pElemRef,true); gslc_ElemSetTxtCol(&m_gui,pElemRef,GSLC_COL_GRAY_LT3); gslc_ElemSetCol(&m_gui,pElemRef,GSLC_COL_GRAY,GSLC_COL_BLACK,GSLC_COL_BLACK);