SSD1306 OLED display driver  1.3.3
This library is developed to control SSD1306 i2c/spi OLED display
ssd1306_menu.cpp
1 /*
2  Copyright (C) 2017 Alexey Dynda
3 
4  This file is part of SSD1306 library.
5 
6  This program is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "font6x8.h"
21 #include "ssd1306.h"
22 
23 #ifndef min
24 #define min(x,y) ((x)<(y)?(x):(y))
25 #endif
26 
27 #ifndef max
28 #define max(x,y) ((x)>(y)?(x):(y))
29 #endif
30 
31 static uint8_t getMaxScreenItems()
32 {
33  return (ssd1306_displayHeight() >> 3) - 2;
34 }
35 
36 void ssd1306_createMenu(SAppMenu *menu, const char **items, uint8_t count)
37 {
38  menu->items = items;
39  menu->count = count;
40  menu->selection = 0;
41  menu->oldSelection = 0;
42  menu->scrollPosition = 0;
43 }
44 
45 static uint8_t calculateScrollPosition(SAppMenu *menu, uint8_t selection)
46 {
47  if ( selection < menu->scrollPosition )
48  {
49  return selection;
50  }
51  else if ( selection - menu->scrollPosition > getMaxScreenItems() - 1)
52  {
53  return selection - getMaxScreenItems() + 1;
54  }
55  return menu->scrollPosition;
56 }
57 
58 static void drawMenuItem(SAppMenu *menu, uint8_t index)
59 {
60  if (index == menu->selection)
61  {
63  }
64  else
65  {
67  }
68  ssd1306_charF6x8(8, index - menu->scrollPosition + 1, menu->items[index], STYLE_NORMAL );
70 }
71 
73 {
75  menu->scrollPosition = calculateScrollPosition( menu, menu->selection );
76  for (uint8_t i = menu->scrollPosition; i < min(menu->count, menu->scrollPosition + getMaxScreenItems()); i++)
77  {
78  drawMenuItem(menu, i);
79  }
80  menu->oldSelection = menu->selection;
81 }
82 
84 {
85  if (menu->selection != menu->oldSelection)
86  {
87  uint8_t scrollPosition = calculateScrollPosition( menu, menu->selection );
88  if ( scrollPosition != menu->scrollPosition )
89  {
91  ssd1306_showMenu(menu);
92  }
93  else
94  {
95  drawMenuItem(menu, menu->oldSelection);
96  drawMenuItem(menu, menu->selection);
97  menu->oldSelection = menu->selection;
98  }
99  }
100 }
101 
103 {
104  return menu->selection;
105 }
106 
108 {
109  if (menu->selection < menu->count - 1)
110  {
111  menu->selection++;
112  }
113  else
114  {
115  menu->selection = 0;
116  }
117 }
118 
120 {
121  if (menu->selection > 0)
122  {
123  menu->selection--;
124  }
125  else
126  {
127  menu->selection = menu->count - 1;
128  }
129 }
void ssd1306_showMenu(SAppMenu *menu)
void ssd1306_negativeMode()
Definition: ssd1306.cpp:452
uint8_t ssd1306_displayHeight()
Definition: ssd1306.cpp:36
void ssd1306_positiveMode()
Definition: ssd1306.cpp:457
void ssd1306_updateMenu(SAppMenu *menu)
void ssd1306_drawRect(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2)
Definition: ssd1306.cpp:270
uint8_t selection
currently selected item. Internally updated.
Definition: ssd1306.h:352
void ssd1306_createMenu(SAppMenu *menu, const char **items, uint8_t count)
void ssd1306_clearScreen()
Definition: ssd1306.cpp:62
uint8_t scrollPosition
position of menu scrolling. Internally updated
Definition: ssd1306.h:356
uint8_t ssd1306_charF6x8(uint8_t x, uint8_t y, const char ch[], EFontStyle style)
Definition: ssd1306.cpp:89
uint8_t count
count of menu items in the menu
Definition: ssd1306.h:350
uint8_t ssd1306_displayWidth()
Definition: ssd1306.cpp:41
uint8_t ssd1306_menuSelection(SAppMenu *menu)
void ssd1306_menuDown(SAppMenu *menu)
void ssd1306_menuUp(SAppMenu *menu)
uint8_t oldSelection
selected item, when last redraw operation was performed. Internally updated.
Definition: ssd1306.h:354
const char ** items
list of menu items of the menu
Definition: ssd1306.h:348