Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SX1276Lib AdaFruit_RGBLCD MCP23017 mbed
Fork of AdaFruit_RGBLCD by
main.cpp@11:96146db429de, 2014-08-10 (annotated)
- Committer:
- vtraveller
- Date:
- Sun Aug 10 15:45:03 2014 +0000
- Revision:
- 11:96146db429de
- Parent:
- 10:3fcab08717fc
- Child:
- 13:9641bc42db92
Added support for changing time.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wim | 0:88d87b1c1f8b | 1 | #include "mbed.h" |
vtraveller | 4:d70e37f6c6bd | 2 | #include "Adafruit_RGBLCDShield.h" |
vtraveller | 10:3fcab08717fc | 3 | #include "RTclock.h" |
vtraveller | 10:3fcab08717fc | 4 | #include "extra_chars.h" |
vtraveller | 10:3fcab08717fc | 5 | |
vtraveller | 10:3fcab08717fc | 6 | #include "module.h" |
vtraveller | 10:3fcab08717fc | 7 | #include "DateModule.h" |
vtraveller | 10:3fcab08717fc | 8 | #include "TempModule.h" |
vtraveller | 10:3fcab08717fc | 9 | #include "TimeModule.h" |
vtraveller | 10:3fcab08717fc | 10 | #include "TitleModule.h" |
wim | 0:88d87b1c1f8b | 11 | |
vtraveller | 3:ed09f95739df | 12 | Serial pc(SERIAL_TX, SERIAL_RX); |
wim | 0:88d87b1c1f8b | 13 | |
vtraveller | 10:3fcab08717fc | 14 | MCP23017 mcp23017 = MCP23017(I2C_SDA, I2C_SCL, 0x40, true); |
vtraveller | 7:d087e901b74b | 15 | Adafruit_RGBLCDShield lcd(mcp23017); |
vtraveller | 10:3fcab08717fc | 16 | RTclock rtc(I2C_SDA, I2C_SCL); |
vtraveller | 10:3fcab08717fc | 17 | |
vtraveller | 10:3fcab08717fc | 18 | const int k_nWidthLCD = 16; |
vtraveller | 10:3fcab08717fc | 19 | const int k_nHeightLCD = 2; |
vtraveller | 9:1501fb01ded6 | 20 | |
vtraveller | 10:3fcab08717fc | 21 | enum EModes |
vtraveller | 9:1501fb01ded6 | 22 | { |
vtraveller | 10:3fcab08717fc | 23 | eModeMenu = 0, |
vtraveller | 10:3fcab08717fc | 24 | eModeSelect, |
vtraveller | 10:3fcab08717fc | 25 | eModeChange, |
vtraveller | 10:3fcab08717fc | 26 | eModeLast |
vtraveller | 9:1501fb01ded6 | 27 | }; |
vtraveller | 9:1501fb01ded6 | 28 | |
vtraveller | 11:96146db429de | 29 | void ChangeModule |
vtraveller | 11:96146db429de | 30 | ( |
vtraveller | 11:96146db429de | 31 | Module ** in_pModuleList, |
vtraveller | 11:96146db429de | 32 | size_t in_nModuleListSize, |
vtraveller | 11:96146db429de | 33 | size_t in_nMenuPos, |
vtraveller | 11:96146db429de | 34 | int in_nIndexX, |
vtraveller | 11:96146db429de | 35 | int in_nCursorY, |
vtraveller | 11:96146db429de | 36 | bool in_bUp |
vtraveller | 11:96146db429de | 37 | ) |
vtraveller | 11:96146db429de | 38 | { |
vtraveller | 11:96146db429de | 39 | size_t nModule = (in_nMenuPos + in_nCursorY) % in_nModuleListSize; |
vtraveller | 11:96146db429de | 40 | in_pModuleList[nModule]->change(in_nIndexX,in_nCursorY,in_bUp); |
vtraveller | 11:96146db429de | 41 | } |
vtraveller | 11:96146db429de | 42 | |
vtraveller | 9:1501fb01ded6 | 43 | void CreateChars() |
vtraveller | 9:1501fb01ded6 | 44 | { |
vtraveller | 10:3fcab08717fc | 45 | //uint8_t k_aUp[] = { 0x4,0xe,0x1f,0x15,0x4,0x4,0x4,0x4 }; |
vtraveller | 10:3fcab08717fc | 46 | //uint8_t k_aDown[] = { 0x4,0x4,0x4,0x4,0x15,0x1f,0xe,0x4 }; |
vtraveller | 10:3fcab08717fc | 47 | |
vtraveller | 10:3fcab08717fc | 48 | uint8_t k_aUp[] = { 0x0,0x0,0x4,0xe,0x1f,0x0,0x0 }; |
vtraveller | 10:3fcab08717fc | 49 | uint8_t k_aDown[] = { 0x0,0x0,0x1f,0xe,0x4,0x0,0x0 }; |
vtraveller | 10:3fcab08717fc | 50 | uint8_t k_aRight[] = { 0x0,0x8,0xc,0xe,0xc,0x8,0x0 }; |
vtraveller | 10:3fcab08717fc | 51 | uint8_t k_aLeft[] = { 0x0,0x2,0x6,0xe,0x6,0x2,0x0 }; |
vtraveller | 9:1501fb01ded6 | 52 | uint8_t k_aDegree[] = { 0xc,0x12,0x12,0xc,0x0,0x0,0x0,0x0 }; |
vtraveller | 9:1501fb01ded6 | 53 | |
vtraveller | 9:1501fb01ded6 | 54 | lcd.createChar(eUp,k_aUp); |
vtraveller | 9:1501fb01ded6 | 55 | lcd.createChar(eDown,k_aDown); |
vtraveller | 10:3fcab08717fc | 56 | lcd.createChar(eRight,k_aRight); |
vtraveller | 10:3fcab08717fc | 57 | lcd.createChar(eLeft,k_aLeft); |
vtraveller | 9:1501fb01ded6 | 58 | lcd.createChar(eDegree,k_aDegree); |
vtraveller | 9:1501fb01ded6 | 59 | } |
vtraveller | 9:1501fb01ded6 | 60 | |
vtraveller | 9:1501fb01ded6 | 61 | void Initialise() |
vtraveller | 9:1501fb01ded6 | 62 | { |
vtraveller | 10:3fcab08717fc | 63 | // Spin up RTC |
vtraveller | 10:3fcab08717fc | 64 | rtc.mapTime(); |
vtraveller | 10:3fcab08717fc | 65 | |
vtraveller | 10:3fcab08717fc | 66 | // Initialise LCD |
vtraveller | 10:3fcab08717fc | 67 | lcd.begin(k_nWidthLCD,k_nHeightLCD); |
vtraveller | 9:1501fb01ded6 | 68 | CreateChars(); |
vtraveller | 9:1501fb01ded6 | 69 | |
vtraveller | 9:1501fb01ded6 | 70 | lcd.setCursor(0,0); |
vtraveller | 9:1501fb01ded6 | 71 | lcd._putc(eUp); |
vtraveller | 9:1501fb01ded6 | 72 | |
vtraveller | 9:1501fb01ded6 | 73 | lcd.setCursor(0,1); |
vtraveller | 9:1501fb01ded6 | 74 | lcd._putc(eDown); |
vtraveller | 9:1501fb01ded6 | 75 | } |
vtraveller | 10:3fcab08717fc | 76 | |
vtraveller | 10:3fcab08717fc | 77 | void SetCursor(bool in_bCursor,bool in_bBlink) |
vtraveller | 3:ed09f95739df | 78 | { |
vtraveller | 10:3fcab08717fc | 79 | if (in_bCursor) lcd.cursor(); else lcd.noCursor(); |
vtraveller | 10:3fcab08717fc | 80 | if (in_bBlink) lcd.blink(); else lcd.noBlink(); |
vtraveller | 10:3fcab08717fc | 81 | } |
vtraveller | 10:3fcab08717fc | 82 | |
vtraveller | 10:3fcab08717fc | 83 | void ShowModules |
vtraveller | 10:3fcab08717fc | 84 | ( |
vtraveller | 10:3fcab08717fc | 85 | Module ** in_pModuleList, |
vtraveller | 10:3fcab08717fc | 86 | size_t in_nModuleListSize, |
vtraveller | 10:3fcab08717fc | 87 | size_t in_nPos, |
vtraveller | 10:3fcab08717fc | 88 | bool in_bRefresh = false |
vtraveller | 10:3fcab08717fc | 89 | ) |
vtraveller | 10:3fcab08717fc | 90 | { |
vtraveller | 10:3fcab08717fc | 91 | lcd.setCursor(2,0); |
vtraveller | 3:ed09f95739df | 92 | |
vtraveller | 10:3fcab08717fc | 93 | if (in_pModuleList[in_nPos]->canRefresh() || !in_bRefresh) in_pModuleList[in_nPos]->show(); |
vtraveller | 10:3fcab08717fc | 94 | |
vtraveller | 10:3fcab08717fc | 95 | size_t nPos = (in_nPos + 1) % in_nModuleListSize; |
vtraveller | 10:3fcab08717fc | 96 | lcd.setCursor(2,1); |
vtraveller | 10:3fcab08717fc | 97 | |
vtraveller | 10:3fcab08717fc | 98 | if (in_pModuleList[nPos]->canRefresh() || !in_bRefresh) in_pModuleList[nPos]->show(); |
vtraveller | 3:ed09f95739df | 99 | } |
wim | 0:88d87b1c1f8b | 100 | |
vtraveller | 10:3fcab08717fc | 101 | void ShowTracking(bool in_bShow) |
vtraveller | 3:ed09f95739df | 102 | { |
vtraveller | 10:3fcab08717fc | 103 | if (in_bShow) |
vtraveller | 4:d70e37f6c6bd | 104 | { |
vtraveller | 10:3fcab08717fc | 105 | lcd.setCursor(1,0); |
vtraveller | 10:3fcab08717fc | 106 | lcd._putc(eLeft); |
vtraveller | 4:d70e37f6c6bd | 107 | |
vtraveller | 10:3fcab08717fc | 108 | lcd.setCursor(1,1); |
vtraveller | 10:3fcab08717fc | 109 | lcd._putc(eRight); |
vtraveller | 10:3fcab08717fc | 110 | } |
vtraveller | 10:3fcab08717fc | 111 | else |
vtraveller | 10:3fcab08717fc | 112 | { |
vtraveller | 10:3fcab08717fc | 113 | lcd.setCursor(1,0); |
vtraveller | 10:3fcab08717fc | 114 | lcd._putc(' '); |
vtraveller | 4:d70e37f6c6bd | 115 | |
vtraveller | 10:3fcab08717fc | 116 | lcd.setCursor(1,1); |
vtraveller | 10:3fcab08717fc | 117 | lcd._putc(' '); |
vtraveller | 10:3fcab08717fc | 118 | } |
vtraveller | 10:3fcab08717fc | 119 | } |
vtraveller | 10:3fcab08717fc | 120 | |
vtraveller | 10:3fcab08717fc | 121 | void UpdateDisplay |
vtraveller | 10:3fcab08717fc | 122 | ( |
vtraveller | 10:3fcab08717fc | 123 | Module ** in_pModuleList, |
vtraveller | 10:3fcab08717fc | 124 | size_t in_nModuleListSize, |
vtraveller | 10:3fcab08717fc | 125 | size_t in_nMenuPos, |
vtraveller | 10:3fcab08717fc | 126 | int & inout_nIndexX, |
vtraveller | 10:3fcab08717fc | 127 | int in_nCursorX, |
vtraveller | 10:3fcab08717fc | 128 | int & inout_nCursorY |
vtraveller | 10:3fcab08717fc | 129 | ) |
vtraveller | 10:3fcab08717fc | 130 | { |
vtraveller | 10:3fcab08717fc | 131 | ShowModules(in_pModuleList,in_nModuleListSize,in_nMenuPos); |
vtraveller | 10:3fcab08717fc | 132 | |
vtraveller | 10:3fcab08717fc | 133 | size_t nCurrent = (in_nMenuPos + inout_nCursorY) % in_nModuleListSize; |
vtraveller | 10:3fcab08717fc | 134 | inout_nIndexX = in_pModuleList[nCurrent]->setCursor(inout_nIndexX,in_nCursorX,inout_nCursorY); |
vtraveller | 10:3fcab08717fc | 135 | |
vtraveller | 10:3fcab08717fc | 136 | // If we didn't have anything, move the line |
vtraveller | 10:3fcab08717fc | 137 | if (-1 == inout_nIndexX) |
vtraveller | 10:3fcab08717fc | 138 | { |
vtraveller | 10:3fcab08717fc | 139 | inout_nCursorY = (inout_nCursorY + 1) % k_nHeightLCD; |
vtraveller | 4:d70e37f6c6bd | 140 | |
vtraveller | 10:3fcab08717fc | 141 | nCurrent = (in_nMenuPos + inout_nCursorY) % in_nModuleListSize; |
vtraveller | 10:3fcab08717fc | 142 | inout_nIndexX = in_pModuleList[nCurrent]->setCursor(0,in_nCursorX,inout_nCursorY); |
vtraveller | 4:d70e37f6c6bd | 143 | } |
vtraveller | 9:1501fb01ded6 | 144 | |
vtraveller | 10:3fcab08717fc | 145 | // If nothing to show - hide everything |
vtraveller | 10:3fcab08717fc | 146 | if (-1 == inout_nIndexX) SetCursor(false,false); |
vtraveller | 3:ed09f95739df | 147 | } |
vtraveller | 3:ed09f95739df | 148 | |
vtraveller | 3:ed09f95739df | 149 | int main() |
vtraveller | 9:1501fb01ded6 | 150 | { |
vtraveller | 9:1501fb01ded6 | 151 | pc.printf("\r\nInitialise LCD\r\n"); |
vtraveller | 9:1501fb01ded6 | 152 | |
vtraveller | 10:3fcab08717fc | 153 | Initialise(); |
vtraveller | 10:3fcab08717fc | 154 | |
vtraveller | 10:3fcab08717fc | 155 | EModes eMode = eModeMenu; |
vtraveller | 10:3fcab08717fc | 156 | size_t nMenuPos = 0; |
vtraveller | 7:d087e901b74b | 157 | |
vtraveller | 10:3fcab08717fc | 158 | // Set up display modules |
vtraveller | 10:3fcab08717fc | 159 | Module * aModules[] = |
vtraveller | 10:3fcab08717fc | 160 | { |
vtraveller | 10:3fcab08717fc | 161 | new TitleModule(lcd), |
vtraveller | 10:3fcab08717fc | 162 | new TimeModule(lcd,rtc), |
vtraveller | 10:3fcab08717fc | 163 | new DateModule(lcd,rtc), |
vtraveller | 10:3fcab08717fc | 164 | new TempModule(lcd) |
vtraveller | 10:3fcab08717fc | 165 | }; |
vtraveller | 9:1501fb01ded6 | 166 | |
vtraveller | 10:3fcab08717fc | 167 | ShowModules(aModules,_countof(aModules),nMenuPos); |
vtraveller | 10:3fcab08717fc | 168 | |
vtraveller | 10:3fcab08717fc | 169 | int nIndexX = 0; |
vtraveller | 10:3fcab08717fc | 170 | int nCursorY = 0; |
vtraveller | 10:3fcab08717fc | 171 | |
vtraveller | 4:d70e37f6c6bd | 172 | while (true) |
vtraveller | 4:d70e37f6c6bd | 173 | { |
vtraveller | 10:3fcab08717fc | 174 | uint8_t nKeys = lcd.readButtons(); |
vtraveller | 9:1501fb01ded6 | 175 | if (nKeys) |
vtraveller | 9:1501fb01ded6 | 176 | { |
vtraveller | 10:3fcab08717fc | 177 | // Change mode based on select |
vtraveller | 10:3fcab08717fc | 178 | if (nKeys & BUTTON_SELECT) |
vtraveller | 10:3fcab08717fc | 179 | { |
vtraveller | 10:3fcab08717fc | 180 | eMode = (EModes)((eMode + 1) % eModeLast); |
vtraveller | 10:3fcab08717fc | 181 | |
vtraveller | 10:3fcab08717fc | 182 | // Start at top corner |
vtraveller | 10:3fcab08717fc | 183 | if (eModeSelect == eMode) |
vtraveller | 10:3fcab08717fc | 184 | { |
vtraveller | 10:3fcab08717fc | 185 | nIndexX = 0; |
vtraveller | 10:3fcab08717fc | 186 | nCursorY = 0; |
vtraveller | 10:3fcab08717fc | 187 | } |
vtraveller | 10:3fcab08717fc | 188 | } |
vtraveller | 10:3fcab08717fc | 189 | |
vtraveller | 10:3fcab08717fc | 190 | switch (eMode) |
vtraveller | 10:3fcab08717fc | 191 | { |
vtraveller | 10:3fcab08717fc | 192 | case eModeMenu: |
vtraveller | 10:3fcab08717fc | 193 | SetCursor(false,false); |
vtraveller | 10:3fcab08717fc | 194 | ShowTracking(false); |
vtraveller | 10:3fcab08717fc | 195 | |
vtraveller | 10:3fcab08717fc | 196 | if (nKeys & BUTTON_UP) nMenuPos--; |
vtraveller | 10:3fcab08717fc | 197 | if (nKeys & BUTTON_DOWN) nMenuPos++; |
vtraveller | 10:3fcab08717fc | 198 | |
vtraveller | 10:3fcab08717fc | 199 | nMenuPos = nMenuPos % _countof(aModules); |
vtraveller | 10:3fcab08717fc | 200 | break; |
vtraveller | 10:3fcab08717fc | 201 | |
vtraveller | 10:3fcab08717fc | 202 | case eModeSelect: |
vtraveller | 10:3fcab08717fc | 203 | SetCursor(true,false); |
vtraveller | 10:3fcab08717fc | 204 | ShowTracking(true); |
vtraveller | 10:3fcab08717fc | 205 | |
vtraveller | 10:3fcab08717fc | 206 | if (nCursorY > 0 && (nKeys & BUTTON_UP)) nCursorY--; |
vtraveller | 10:3fcab08717fc | 207 | if ((nCursorY < k_nHeightLCD - 1) && (nKeys & BUTTON_DOWN)) nCursorY++; |
vtraveller | 10:3fcab08717fc | 208 | |
vtraveller | 10:3fcab08717fc | 209 | if (nKeys & BUTTON_LEFT) nIndexX--; |
vtraveller | 11:96146db429de | 210 | if (nKeys & BUTTON_RIGHT) nIndexX++; |
vtraveller | 10:3fcab08717fc | 211 | break; |
vtraveller | 10:3fcab08717fc | 212 | |
vtraveller | 10:3fcab08717fc | 213 | case eModeChange: |
vtraveller | 10:3fcab08717fc | 214 | SetCursor(false,true); |
vtraveller | 10:3fcab08717fc | 215 | ShowTracking(true); |
vtraveller | 11:96146db429de | 216 | |
vtraveller | 11:96146db429de | 217 | if (nKeys & (BUTTON_UP | BUTTON_DOWN)) |
vtraveller | 11:96146db429de | 218 | { |
vtraveller | 11:96146db429de | 219 | bool bUp = (nKeys & BUTTON_UP) ? true : false; |
vtraveller | 11:96146db429de | 220 | ChangeModule(aModules,_countof(aModules),nMenuPos,nIndexX,nCursorY,bUp); |
vtraveller | 11:96146db429de | 221 | } |
vtraveller | 11:96146db429de | 222 | |
vtraveller | 11:96146db429de | 223 | if (nKeys & BUTTON_LEFT) nIndexX--; |
vtraveller | 11:96146db429de | 224 | if (nKeys & BUTTON_RIGHT) nIndexX++; |
vtraveller | 10:3fcab08717fc | 225 | break; |
vtraveller | 10:3fcab08717fc | 226 | } |
vtraveller | 9:1501fb01ded6 | 227 | |
vtraveller | 10:3fcab08717fc | 228 | UpdateDisplay(aModules,_countof(aModules),nMenuPos,nIndexX,2,nCursorY); |
vtraveller | 9:1501fb01ded6 | 229 | } |
vtraveller | 10:3fcab08717fc | 230 | else |
vtraveller | 10:3fcab08717fc | 231 | { |
vtraveller | 10:3fcab08717fc | 232 | switch (eMode) |
vtraveller | 10:3fcab08717fc | 233 | { |
vtraveller | 10:3fcab08717fc | 234 | case eModeMenu: |
vtraveller | 10:3fcab08717fc | 235 | ShowModules(aModules,_countof(aModules),nMenuPos,true); |
vtraveller | 10:3fcab08717fc | 236 | aModules[nMenuPos]->setCursor(nIndexX,2,nCursorY); |
vtraveller | 10:3fcab08717fc | 237 | break; |
vtraveller | 10:3fcab08717fc | 238 | } |
vtraveller | 10:3fcab08717fc | 239 | } |
vtraveller | 10:3fcab08717fc | 240 | |
vtraveller | 4:d70e37f6c6bd | 241 | wait(0.2); |
vtraveller | 10:3fcab08717fc | 242 | } |
wim | 0:88d87b1c1f8b | 243 | } |