Justin Howard / Mbed 2 deprecated AdaFruit_RGBLCD

Dependencies:   AdaFruit_RGBLCDShield MCP23017 mbed RTclock

Dependents:   SX1276_GPS

Fork of MCP_test by Wim Huiskamp

Committer:
vtraveller
Date:
Mon Aug 11 19:11:43 2014 +0000
Revision:
13:9641bc42db92
Child:
15:d1eaddb363be
Created a scrollable menu system based on modules to work against the Adafruit RGB LCD library.; Modules can be created and installed as menu items with display, cursor and edit capabilities.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vtraveller 13:9641bc42db92 1 #include "mbed.h"
vtraveller 13:9641bc42db92 2 #include "module.h"
vtraveller 13:9641bc42db92 3 #include "extra_chars.h"
vtraveller 13:9641bc42db92 4 #include "Adafruit_RGBLCDShield.h"
vtraveller 13:9641bc42db92 5
vtraveller 13:9641bc42db92 6 #include "MenuManager.h"
vtraveller 13:9641bc42db92 7
vtraveller 13:9641bc42db92 8 MenuManager::MenuManager
vtraveller 13:9641bc42db92 9 (
vtraveller 13:9641bc42db92 10 Module ** in_pModules,
vtraveller 13:9641bc42db92 11 size_t in_nModules,
vtraveller 13:9641bc42db92 12 Adafruit_RGBLCDShield & in_cLCD
vtraveller 13:9641bc42db92 13 )
vtraveller 13:9641bc42db92 14 : m_pModules(in_pModules)
vtraveller 13:9641bc42db92 15 , m_nModules(in_nModules)
vtraveller 13:9641bc42db92 16 , m_cLCD(in_cLCD)
vtraveller 13:9641bc42db92 17 , m_eMode(eModeMenu)
vtraveller 13:9641bc42db92 18 , m_nMenuPos(0)
vtraveller 13:9641bc42db92 19 , m_nIndex(0)
vtraveller 13:9641bc42db92 20 , m_nCursorX(0)
vtraveller 13:9641bc42db92 21 , m_nCursorY(0)
vtraveller 13:9641bc42db92 22 {
vtraveller 13:9641bc42db92 23 }
vtraveller 13:9641bc42db92 24
vtraveller 13:9641bc42db92 25 void MenuManager::changeModule(bool in_bUp)
vtraveller 13:9641bc42db92 26 {
vtraveller 13:9641bc42db92 27 size_t nModule = (m_nMenuPos + m_nCursorY) % m_nModules;
vtraveller 13:9641bc42db92 28 m_pModules[nModule]->change(m_nIndex,in_bUp);
vtraveller 13:9641bc42db92 29 }
vtraveller 13:9641bc42db92 30
vtraveller 13:9641bc42db92 31 void MenuManager::createChars()
vtraveller 13:9641bc42db92 32 {
vtraveller 13:9641bc42db92 33 //uint8_t k_aUp[] = { 0x4,0xe,0x1f,0x15,0x4,0x4,0x4,0x4 };
vtraveller 13:9641bc42db92 34 //uint8_t k_aDown[] = { 0x4,0x4,0x4,0x4,0x15,0x1f,0xe,0x4 };
vtraveller 13:9641bc42db92 35
vtraveller 13:9641bc42db92 36 uint8_t k_aUp[] = { 0x0,0x0,0x4,0xe,0x1f,0x0,0x0 };
vtraveller 13:9641bc42db92 37 uint8_t k_aDown[] = { 0x0,0x0,0x1f,0xe,0x4,0x0,0x0 };
vtraveller 13:9641bc42db92 38 uint8_t k_aRight[] = { 0x0,0x8,0xc,0xe,0xc,0x8,0x0 };
vtraveller 13:9641bc42db92 39 uint8_t k_aLeft[] = { 0x0,0x2,0x6,0xe,0x6,0x2,0x0 };
vtraveller 13:9641bc42db92 40 uint8_t k_aDegree[] = { 0xc,0x12,0x12,0xc,0x0,0x0,0x0,0x0 };
vtraveller 13:9641bc42db92 41
vtraveller 13:9641bc42db92 42 m_cLCD.createChar(eUp,k_aUp);
vtraveller 13:9641bc42db92 43 m_cLCD.createChar(eDown,k_aDown);
vtraveller 13:9641bc42db92 44 m_cLCD.createChar(eRight,k_aRight);
vtraveller 13:9641bc42db92 45 m_cLCD.createChar(eLeft,k_aLeft);
vtraveller 13:9641bc42db92 46 m_cLCD.createChar(eDegree,k_aDegree);
vtraveller 13:9641bc42db92 47 }
vtraveller 13:9641bc42db92 48
vtraveller 13:9641bc42db92 49 void MenuManager::initialise()
vtraveller 13:9641bc42db92 50 {
vtraveller 13:9641bc42db92 51 // Initialise LCD
vtraveller 13:9641bc42db92 52 m_cLCD.begin(16,2);
vtraveller 13:9641bc42db92 53 createChars();
vtraveller 13:9641bc42db92 54
vtraveller 13:9641bc42db92 55 m_cLCD.setCursor(0,0);
vtraveller 13:9641bc42db92 56 m_cLCD._putc(eUp);
vtraveller 13:9641bc42db92 57
vtraveller 13:9641bc42db92 58 m_cLCD.setCursor(0,1);
vtraveller 13:9641bc42db92 59 m_cLCD._putc(eDown);
vtraveller 13:9641bc42db92 60
vtraveller 13:9641bc42db92 61 m_nCursorX = 2;
vtraveller 13:9641bc42db92 62 m_nCursorY = 0;
vtraveller 13:9641bc42db92 63 }
vtraveller 13:9641bc42db92 64
vtraveller 13:9641bc42db92 65 void MenuManager::loop()
vtraveller 13:9641bc42db92 66 {
vtraveller 13:9641bc42db92 67 m_eMode = eModeMenu;
vtraveller 13:9641bc42db92 68 m_nMenuPos = 0;
vtraveller 13:9641bc42db92 69 m_nIndex = 0;
vtraveller 13:9641bc42db92 70
vtraveller 13:9641bc42db92 71 initialise();
vtraveller 13:9641bc42db92 72
vtraveller 13:9641bc42db92 73 showModules(m_nMenuPos);
vtraveller 13:9641bc42db92 74
vtraveller 13:9641bc42db92 75 while (true)
vtraveller 13:9641bc42db92 76 {
vtraveller 13:9641bc42db92 77 uint8_t nKeys = m_cLCD.readButtons();
vtraveller 13:9641bc42db92 78 if (nKeys)
vtraveller 13:9641bc42db92 79 {
vtraveller 13:9641bc42db92 80 processKeys(nKeys);
vtraveller 13:9641bc42db92 81 }
vtraveller 13:9641bc42db92 82 else
vtraveller 13:9641bc42db92 83 {
vtraveller 13:9641bc42db92 84 switch (m_eMode)
vtraveller 13:9641bc42db92 85 {
vtraveller 13:9641bc42db92 86 case eModeMenu:
vtraveller 13:9641bc42db92 87 showModules(true);
vtraveller 13:9641bc42db92 88
vtraveller 13:9641bc42db92 89 int nOffsetX = m_pModules[m_nMenuPos]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 90 m_cLCD.setCursor(m_nCursorY + nOffsetX,m_nCursorY);
vtraveller 13:9641bc42db92 91 break;
vtraveller 13:9641bc42db92 92 }
vtraveller 13:9641bc42db92 93 }
vtraveller 13:9641bc42db92 94
vtraveller 13:9641bc42db92 95 wait(0.2);
vtraveller 13:9641bc42db92 96 }
vtraveller 13:9641bc42db92 97 }
vtraveller 13:9641bc42db92 98
vtraveller 13:9641bc42db92 99 void MenuManager::processKeys(uint8_t in_nKeys)
vtraveller 13:9641bc42db92 100 {
vtraveller 13:9641bc42db92 101 // Change mode based on select
vtraveller 13:9641bc42db92 102 if (in_nKeys & BUTTON_SELECT)
vtraveller 13:9641bc42db92 103 {
vtraveller 13:9641bc42db92 104 m_eMode = (EModes)((m_eMode + 1) % eModeLast);
vtraveller 13:9641bc42db92 105
vtraveller 13:9641bc42db92 106 // Start at top corner
vtraveller 13:9641bc42db92 107 if (eModeSelect == m_eMode)
vtraveller 13:9641bc42db92 108 {
vtraveller 13:9641bc42db92 109 m_nIndex = 0;
vtraveller 13:9641bc42db92 110 m_nCursorY = 0;
vtraveller 13:9641bc42db92 111 }
vtraveller 13:9641bc42db92 112 }
vtraveller 13:9641bc42db92 113
vtraveller 13:9641bc42db92 114 switch (m_eMode)
vtraveller 13:9641bc42db92 115 {
vtraveller 13:9641bc42db92 116 case eModeMenu:
vtraveller 13:9641bc42db92 117 setCursor(false,false);
vtraveller 13:9641bc42db92 118 showTracking(false);
vtraveller 13:9641bc42db92 119
vtraveller 13:9641bc42db92 120 if (in_nKeys & BUTTON_UP) m_nMenuPos--;
vtraveller 13:9641bc42db92 121 if (in_nKeys & BUTTON_DOWN) m_nMenuPos++;
vtraveller 13:9641bc42db92 122
vtraveller 13:9641bc42db92 123 m_nMenuPos = m_nMenuPos % m_nModules;
vtraveller 13:9641bc42db92 124 break;
vtraveller 13:9641bc42db92 125
vtraveller 13:9641bc42db92 126 case eModeSelect:
vtraveller 13:9641bc42db92 127 setCursor(true,false);
vtraveller 13:9641bc42db92 128 showTracking(true);
vtraveller 13:9641bc42db92 129
vtraveller 13:9641bc42db92 130 if (m_nCursorY > 0 && (in_nKeys & BUTTON_UP)) m_nCursorY--;
vtraveller 13:9641bc42db92 131 if ((m_nCursorY < m_cLCD.lines() - 1) && (in_nKeys & BUTTON_DOWN)) m_nCursorY++;
vtraveller 13:9641bc42db92 132
vtraveller 13:9641bc42db92 133 if (in_nKeys & BUTTON_LEFT) m_nIndex--;
vtraveller 13:9641bc42db92 134 if (in_nKeys & BUTTON_RIGHT) m_nIndex++;
vtraveller 13:9641bc42db92 135 break;
vtraveller 13:9641bc42db92 136
vtraveller 13:9641bc42db92 137 case eModeChange:
vtraveller 13:9641bc42db92 138 setCursor(false,true);
vtraveller 13:9641bc42db92 139 showTracking(true);
vtraveller 13:9641bc42db92 140
vtraveller 13:9641bc42db92 141 if (in_nKeys & (BUTTON_UP | BUTTON_DOWN))
vtraveller 13:9641bc42db92 142 {
vtraveller 13:9641bc42db92 143 bool bUp = (in_nKeys & BUTTON_UP) ? true : false;
vtraveller 13:9641bc42db92 144 changeModule(bUp);
vtraveller 13:9641bc42db92 145 }
vtraveller 13:9641bc42db92 146
vtraveller 13:9641bc42db92 147 if (in_nKeys & BUTTON_LEFT) m_nIndex--;
vtraveller 13:9641bc42db92 148 if (in_nKeys & BUTTON_RIGHT) m_nIndex++;
vtraveller 13:9641bc42db92 149 break;
vtraveller 13:9641bc42db92 150 }
vtraveller 13:9641bc42db92 151
vtraveller 13:9641bc42db92 152 updateDisplay();
vtraveller 13:9641bc42db92 153 }
vtraveller 13:9641bc42db92 154
vtraveller 13:9641bc42db92 155 void MenuManager::setCursor(bool in_bCursor,bool in_bBlink)
vtraveller 13:9641bc42db92 156 {
vtraveller 13:9641bc42db92 157 if (in_bCursor) m_cLCD.cursor(); else m_cLCD.noCursor();
vtraveller 13:9641bc42db92 158 if (in_bBlink) m_cLCD.blink(); else m_cLCD.noBlink();
vtraveller 13:9641bc42db92 159 }
vtraveller 13:9641bc42db92 160
vtraveller 13:9641bc42db92 161 void MenuManager::showModules(bool in_bRefresh)
vtraveller 13:9641bc42db92 162 {
vtraveller 13:9641bc42db92 163 m_cLCD.setCursor(2,0);
vtraveller 13:9641bc42db92 164
vtraveller 13:9641bc42db92 165 if (m_pModules[m_nMenuPos]->canRefresh() || !in_bRefresh) m_pModules[m_nMenuPos]->show();
vtraveller 13:9641bc42db92 166
vtraveller 13:9641bc42db92 167 size_t nPos = (m_nMenuPos + 1) % m_nModules;
vtraveller 13:9641bc42db92 168 m_cLCD.setCursor(2,1);
vtraveller 13:9641bc42db92 169
vtraveller 13:9641bc42db92 170 if (m_pModules[nPos]->canRefresh() || !in_bRefresh) m_pModules[nPos]->show();
vtraveller 13:9641bc42db92 171 }
vtraveller 13:9641bc42db92 172
vtraveller 13:9641bc42db92 173 void MenuManager::showTracking(bool in_bShow)
vtraveller 13:9641bc42db92 174 {
vtraveller 13:9641bc42db92 175 if (in_bShow)
vtraveller 13:9641bc42db92 176 {
vtraveller 13:9641bc42db92 177 m_cLCD.setCursor(1,0);
vtraveller 13:9641bc42db92 178 m_cLCD._putc(eLeft);
vtraveller 13:9641bc42db92 179
vtraveller 13:9641bc42db92 180 m_cLCD.setCursor(1,1);
vtraveller 13:9641bc42db92 181 m_cLCD._putc(eRight);
vtraveller 13:9641bc42db92 182 }
vtraveller 13:9641bc42db92 183 else
vtraveller 13:9641bc42db92 184 {
vtraveller 13:9641bc42db92 185 m_cLCD.setCursor(1,0);
vtraveller 13:9641bc42db92 186 m_cLCD._putc(' ');
vtraveller 13:9641bc42db92 187
vtraveller 13:9641bc42db92 188 m_cLCD.setCursor(1,1);
vtraveller 13:9641bc42db92 189 m_cLCD._putc(' ');
vtraveller 13:9641bc42db92 190 }
vtraveller 13:9641bc42db92 191 }
vtraveller 13:9641bc42db92 192
vtraveller 13:9641bc42db92 193 void MenuManager::updateDisplay()
vtraveller 13:9641bc42db92 194 {
vtraveller 13:9641bc42db92 195 showModules();
vtraveller 13:9641bc42db92 196
vtraveller 13:9641bc42db92 197 size_t nCurrent = (m_nMenuPos + m_nCursorY) % m_nModules;
vtraveller 13:9641bc42db92 198
vtraveller 13:9641bc42db92 199 int nOffsetX = m_pModules[nCurrent]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 200
vtraveller 13:9641bc42db92 201 // If we didn't have anything, move the line
vtraveller 13:9641bc42db92 202 if (-1 == nOffsetX)
vtraveller 13:9641bc42db92 203 {
vtraveller 13:9641bc42db92 204 m_nCursorY = (m_nCursorY + 1) % m_cLCD.lines();
vtraveller 13:9641bc42db92 205
vtraveller 13:9641bc42db92 206 nCurrent = (m_nMenuPos + m_nCursorY) % m_nModules;
vtraveller 13:9641bc42db92 207
vtraveller 13:9641bc42db92 208 m_nIndex = 0;
vtraveller 13:9641bc42db92 209 nOffsetX = m_pModules[nCurrent]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 210 }
vtraveller 13:9641bc42db92 211
vtraveller 13:9641bc42db92 212 if ((size_t)-1 != m_nIndex)
vtraveller 13:9641bc42db92 213 {
vtraveller 13:9641bc42db92 214 // Move cursor to new position
vtraveller 13:9641bc42db92 215 m_cLCD.setCursor(m_nCursorX + nOffsetX,m_nCursorY);
vtraveller 13:9641bc42db92 216 }
vtraveller 13:9641bc42db92 217 else
vtraveller 13:9641bc42db92 218 {
vtraveller 13:9641bc42db92 219 // If nothing to show - hide everything
vtraveller 13:9641bc42db92 220 setCursor(false,false);
vtraveller 13:9641bc42db92 221 }
vtraveller 13:9641bc42db92 222 }