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:
Thu Aug 14 10:47:27 2014 +0000
Revision:
17:731a47339cb8
Parent:
15:d1eaddb363be
Child:
20:93c70a1869ee
Added mode indication to modules (allows them to change behavior based on mode changes.  Means you can have a module change state but not commit the change until you leave that state.

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 17:731a47339cb8 17 , m_eMode(Module::eModeLast)
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 17:731a47339cb8 67 setMode(Module::eModeMenu);
vtraveller 17:731a47339cb8 68
vtraveller 13:9641bc42db92 69 m_nMenuPos = 0;
vtraveller 13:9641bc42db92 70 m_nIndex = 0;
vtraveller 13:9641bc42db92 71
vtraveller 13:9641bc42db92 72 initialise();
vtraveller 13:9641bc42db92 73
vtraveller 13:9641bc42db92 74 showModules(m_nMenuPos);
vtraveller 13:9641bc42db92 75
vtraveller 13:9641bc42db92 76 while (true)
vtraveller 13:9641bc42db92 77 {
vtraveller 13:9641bc42db92 78 uint8_t nKeys = m_cLCD.readButtons();
vtraveller 13:9641bc42db92 79 if (nKeys)
vtraveller 13:9641bc42db92 80 {
vtraveller 13:9641bc42db92 81 processKeys(nKeys);
vtraveller 13:9641bc42db92 82 }
vtraveller 13:9641bc42db92 83 else
vtraveller 13:9641bc42db92 84 {
vtraveller 13:9641bc42db92 85 switch (m_eMode)
vtraveller 13:9641bc42db92 86 {
vtraveller 17:731a47339cb8 87 case Module::eModeMenu:
vtraveller 13:9641bc42db92 88 showModules(true);
vtraveller 13:9641bc42db92 89
vtraveller 13:9641bc42db92 90 int nOffsetX = m_pModules[m_nMenuPos]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 91 m_cLCD.setCursor(m_nCursorY + nOffsetX,m_nCursorY);
vtraveller 13:9641bc42db92 92 break;
vtraveller 13:9641bc42db92 93 }
vtraveller 13:9641bc42db92 94 }
vtraveller 13:9641bc42db92 95
vtraveller 13:9641bc42db92 96 wait(0.2);
vtraveller 13:9641bc42db92 97 }
vtraveller 13:9641bc42db92 98 }
vtraveller 13:9641bc42db92 99
vtraveller 13:9641bc42db92 100 void MenuManager::processKeys(uint8_t in_nKeys)
vtraveller 13:9641bc42db92 101 {
vtraveller 13:9641bc42db92 102 // Change mode based on select
vtraveller 13:9641bc42db92 103 if (in_nKeys & BUTTON_SELECT)
vtraveller 13:9641bc42db92 104 {
vtraveller 17:731a47339cb8 105 Module::EModes eMode = (Module::EModes)((m_eMode + 1) % Module::eModeLast);
vtraveller 17:731a47339cb8 106 setMode(eMode);
vtraveller 13:9641bc42db92 107
vtraveller 13:9641bc42db92 108 // Start at top corner
vtraveller 17:731a47339cb8 109 if (Module::eModeSelect == m_eMode)
vtraveller 13:9641bc42db92 110 {
vtraveller 13:9641bc42db92 111 m_nIndex = 0;
vtraveller 13:9641bc42db92 112 m_nCursorY = 0;
vtraveller 13:9641bc42db92 113 }
vtraveller 13:9641bc42db92 114 }
vtraveller 13:9641bc42db92 115
vtraveller 13:9641bc42db92 116 switch (m_eMode)
vtraveller 13:9641bc42db92 117 {
vtraveller 17:731a47339cb8 118 case Module::eModeMenu:
vtraveller 13:9641bc42db92 119 setCursor(false,false);
vtraveller 13:9641bc42db92 120 showTracking(false);
vtraveller 13:9641bc42db92 121
vtraveller 13:9641bc42db92 122 if (in_nKeys & BUTTON_UP) m_nMenuPos--;
vtraveller 13:9641bc42db92 123 if (in_nKeys & BUTTON_DOWN) m_nMenuPos++;
vtraveller 13:9641bc42db92 124
vtraveller 13:9641bc42db92 125 m_nMenuPos = m_nMenuPos % m_nModules;
vtraveller 13:9641bc42db92 126 break;
vtraveller 13:9641bc42db92 127
vtraveller 17:731a47339cb8 128 case Module::eModeSelect:
vtraveller 13:9641bc42db92 129 setCursor(true,false);
vtraveller 13:9641bc42db92 130 showTracking(true);
vtraveller 13:9641bc42db92 131
vtraveller 13:9641bc42db92 132 if (m_nCursorY > 0 && (in_nKeys & BUTTON_UP)) m_nCursorY--;
vtraveller 13:9641bc42db92 133 if ((m_nCursorY < m_cLCD.lines() - 1) && (in_nKeys & BUTTON_DOWN)) m_nCursorY++;
vtraveller 13:9641bc42db92 134
vtraveller 13:9641bc42db92 135 if (in_nKeys & BUTTON_LEFT) m_nIndex--;
vtraveller 13:9641bc42db92 136 if (in_nKeys & BUTTON_RIGHT) m_nIndex++;
vtraveller 13:9641bc42db92 137 break;
vtraveller 13:9641bc42db92 138
vtraveller 17:731a47339cb8 139 case Module::eModeChange:
vtraveller 13:9641bc42db92 140 setCursor(false,true);
vtraveller 13:9641bc42db92 141 showTracking(true);
vtraveller 13:9641bc42db92 142
vtraveller 13:9641bc42db92 143 if (in_nKeys & (BUTTON_UP | BUTTON_DOWN))
vtraveller 13:9641bc42db92 144 {
vtraveller 13:9641bc42db92 145 bool bUp = (in_nKeys & BUTTON_UP) ? true : false;
vtraveller 13:9641bc42db92 146 changeModule(bUp);
vtraveller 13:9641bc42db92 147 }
vtraveller 13:9641bc42db92 148
vtraveller 13:9641bc42db92 149 if (in_nKeys & BUTTON_LEFT) m_nIndex--;
vtraveller 13:9641bc42db92 150 if (in_nKeys & BUTTON_RIGHT) m_nIndex++;
vtraveller 13:9641bc42db92 151 break;
vtraveller 13:9641bc42db92 152 }
vtraveller 13:9641bc42db92 153
vtraveller 13:9641bc42db92 154 updateDisplay();
vtraveller 13:9641bc42db92 155 }
vtraveller 13:9641bc42db92 156
vtraveller 13:9641bc42db92 157 void MenuManager::setCursor(bool in_bCursor,bool in_bBlink)
vtraveller 13:9641bc42db92 158 {
vtraveller 13:9641bc42db92 159 if (in_bCursor) m_cLCD.cursor(); else m_cLCD.noCursor();
vtraveller 13:9641bc42db92 160 if (in_bBlink) m_cLCD.blink(); else m_cLCD.noBlink();
vtraveller 13:9641bc42db92 161 }
vtraveller 13:9641bc42db92 162
vtraveller 17:731a47339cb8 163 void MenuManager::setMode(Module::EModes in_eMode)
vtraveller 17:731a47339cb8 164 {
vtraveller 17:731a47339cb8 165 m_eMode = in_eMode;
vtraveller 17:731a47339cb8 166
vtraveller 17:731a47339cb8 167 for (size_t i = 0; i < m_nModules; i++)
vtraveller 17:731a47339cb8 168 {
vtraveller 17:731a47339cb8 169 m_pModules[i]->onModeChange(m_eMode);
vtraveller 17:731a47339cb8 170 }
vtraveller 17:731a47339cb8 171 }
vtraveller 17:731a47339cb8 172
vtraveller 13:9641bc42db92 173 void MenuManager::showModules(bool in_bRefresh)
vtraveller 13:9641bc42db92 174 {
vtraveller 13:9641bc42db92 175 m_cLCD.setCursor(2,0);
vtraveller 13:9641bc42db92 176
vtraveller 15:d1eaddb363be 177 if (m_pModules[m_nMenuPos]->canRefresh() || !in_bRefresh) m_pModules[m_nMenuPos]->show(in_bRefresh);
vtraveller 13:9641bc42db92 178
vtraveller 13:9641bc42db92 179 size_t nPos = (m_nMenuPos + 1) % m_nModules;
vtraveller 13:9641bc42db92 180 m_cLCD.setCursor(2,1);
vtraveller 13:9641bc42db92 181
vtraveller 15:d1eaddb363be 182 if (m_pModules[nPos]->canRefresh() || !in_bRefresh) m_pModules[nPos]->show(in_bRefresh);
vtraveller 13:9641bc42db92 183 }
vtraveller 13:9641bc42db92 184
vtraveller 13:9641bc42db92 185 void MenuManager::showTracking(bool in_bShow)
vtraveller 13:9641bc42db92 186 {
vtraveller 13:9641bc42db92 187 if (in_bShow)
vtraveller 13:9641bc42db92 188 {
vtraveller 13:9641bc42db92 189 m_cLCD.setCursor(1,0);
vtraveller 13:9641bc42db92 190 m_cLCD._putc(eLeft);
vtraveller 13:9641bc42db92 191
vtraveller 13:9641bc42db92 192 m_cLCD.setCursor(1,1);
vtraveller 13:9641bc42db92 193 m_cLCD._putc(eRight);
vtraveller 13:9641bc42db92 194 }
vtraveller 13:9641bc42db92 195 else
vtraveller 13:9641bc42db92 196 {
vtraveller 13:9641bc42db92 197 m_cLCD.setCursor(1,0);
vtraveller 13:9641bc42db92 198 m_cLCD._putc(' ');
vtraveller 13:9641bc42db92 199
vtraveller 13:9641bc42db92 200 m_cLCD.setCursor(1,1);
vtraveller 13:9641bc42db92 201 m_cLCD._putc(' ');
vtraveller 13:9641bc42db92 202 }
vtraveller 13:9641bc42db92 203 }
vtraveller 13:9641bc42db92 204
vtraveller 13:9641bc42db92 205 void MenuManager::updateDisplay()
vtraveller 13:9641bc42db92 206 {
vtraveller 13:9641bc42db92 207 showModules();
vtraveller 13:9641bc42db92 208
vtraveller 13:9641bc42db92 209 size_t nCurrent = (m_nMenuPos + m_nCursorY) % m_nModules;
vtraveller 13:9641bc42db92 210
vtraveller 13:9641bc42db92 211 int nOffsetX = m_pModules[nCurrent]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 212
vtraveller 13:9641bc42db92 213 // If we didn't have anything, move the line
vtraveller 13:9641bc42db92 214 if (-1 == nOffsetX)
vtraveller 13:9641bc42db92 215 {
vtraveller 13:9641bc42db92 216 m_nCursorY = (m_nCursorY + 1) % m_cLCD.lines();
vtraveller 13:9641bc42db92 217
vtraveller 13:9641bc42db92 218 nCurrent = (m_nMenuPos + m_nCursorY) % m_nModules;
vtraveller 13:9641bc42db92 219
vtraveller 13:9641bc42db92 220 m_nIndex = 0;
vtraveller 13:9641bc42db92 221 nOffsetX = m_pModules[nCurrent]->getCursorOffset(m_nIndex);
vtraveller 13:9641bc42db92 222 }
vtraveller 13:9641bc42db92 223
vtraveller 13:9641bc42db92 224 if ((size_t)-1 != m_nIndex)
vtraveller 13:9641bc42db92 225 {
vtraveller 13:9641bc42db92 226 // Move cursor to new position
vtraveller 13:9641bc42db92 227 m_cLCD.setCursor(m_nCursorX + nOffsetX,m_nCursorY);
vtraveller 13:9641bc42db92 228 }
vtraveller 13:9641bc42db92 229 else
vtraveller 13:9641bc42db92 230 {
vtraveller 13:9641bc42db92 231 // If nothing to show - hide everything
vtraveller 13:9641bc42db92 232 setCursor(false,false);
vtraveller 13:9641bc42db92 233 }
vtraveller 13:9641bc42db92 234 }