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:
Wed Oct 08 16:42:17 2014 +0000
Revision:
24:e67c825ec6d8
Parent:
20:93c70a1869ee
Fix for date updating.

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