33 * crear una interfaz de usuario en la pantalla OLED
44*/
55
6- #if !defined(librericaPreferenciasIncluida )
7- #define librericaPreferenciasIncluida
6+ #if !defined(libreriaPreferenciasIncluida )
7+ #define libreriaPreferenciasIncluida
88#include < Preferences.h> // incluir libreria que permite guardar Ajustes en la memoria
99#endif
1010
1111
1212
1313#if !defined(claseUI_OLEDIncluida) // if para evitar ejecutar el mismo codigo dos veces
1414#define claseUI_OLEDIncluida
15+
16+
1517
1618// =====================================================================
17- // Parametros generales de la pantalla
19+ // Parametros generales de la pantalla y ajustes
1820// =====================================================================
1921
2022// Definicion del tamaño de la pantalla:
2527#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
2628#define SCREEN_ADDRESS 0x3C // /< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
2729#define duracionMensajeMS 1000 // Tiempo de espera para mostrar mensajes de error en milisegundos
30+
31+ // Activar/desacitvar widgets
32+ #define EasyOledUI_osciloscopeWidget // activar el widget de osciloscopio
33+ // ...
34+
2835// =====================================================================
2936
3037#include < Adafruit_SSD1306.h> // se requiere la clase de la pantalla
@@ -45,26 +52,44 @@ bool callBackEjecutarAccion(int menuActual, int opcionActual){
4552*/
4653
4754
55+ // =====================================================================
56+ // Incorporacion de los widgets
57+ // =====================================================================
58+
59+ #include " widgets/widget.h" // Clase de los widgets
60+
61+ #ifdef EasyOledUI_osciloscopeWidget
62+ #include " widgets/osciloscopeWidget.h" // Matriz con la imagen del logo y el tamaño
63+ #endif
64+
65+ // =====================================================================
66+
67+
4868class UI_OLED {
4969 //
5070 private:
5171
5272 public:
73+
74+ // Clases asociadas
75+ // class Widget; // Clase para crear widgets
5376
5477 // Varibles
55- Adafruit_SSD1306 display; // permite almacenar la clase de la pantalla asociada
78+ Adafruit_SSD1306 * display; // permite almacenar la clase de la pantalla asociada
5679 uint16_t menuActual = 0 ;
5780 int numeroMenus = 0 ; // guarda la cantidad de menus existentes
5881 menu *menusGuardados = NULL ; // Puntero hacia los objetos de tipo menu
59- botones botonesUI;
82+ botones * botonesUI;
6083 bool cambioPendiente = true ; // Permite indicar desde el exterior de la clase si se debe refrescar los menus
6184 bool mensajePendiente = false ; // Permite indicar desde el exterior si de debe mostrar un mensaje
6285 String mensajeEsporadico = " None" ;
86+ Widget * widgets = NULL ; // Puntero hacia los objetos de tipo widget
87+ int numeroWidgets = 0 ; // Cantidad de widgets existentes
6388
6489 // Funciones
6590 bool mostrarMenuEnOLED (menu menuPorMostrar);
66- bool asociarPantalla (Adafruit_SSD1306 displayPorAsociar);
67- bool asociarBotones (botones _botones);
91+ bool asociarPantalla (Adafruit_SSD1306 * displayPorAsociar);
92+ bool asociarBotones (botones * _botones);
6893 void handleInterruptUI ();
6994 bool asociarMenu (int numMenus, menu *menusPorAsociar);
7095 bool imprimirTitulosDeMenusSerial ();
@@ -94,12 +119,12 @@ bool UI_OLED::asociarMenu(int numMenus, menu *menusPorAsociar){
94119 return 1 ;
95120}
96121
97- bool UI_OLED::asociarPantalla (Adafruit_SSD1306 displayPorAsociar){
122+ bool UI_OLED::asociarPantalla (Adafruit_SSD1306 * displayPorAsociar){
98123 // Esta funcion vincula el UI con la pantalla OLED
99124 display = displayPorAsociar;
100125}
101126
102- bool UI_OLED::asociarBotones (botones _botones){
127+ bool UI_OLED::asociarBotones (botones * _botones){
103128 // Esta funcion vincula los botones con la UI
104129 botonesUI = _botones;
105130}
@@ -120,7 +145,7 @@ bool UI_OLED::imprimirTitulosDeMenusSerial(){
120145// Funcion para iniciar la pantalla
121146bool UI_OLED::setupPantallaOled (int I2C_SDA, int I2C_SCL){
122147 Wire.begin (I2C_SDA, I2C_SCL); // iniciar I2C con los pines definidos
123- if (!display. begin (SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
148+ if (!display-> begin (SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
124149 Serial.println (F (" SSD1306 allocation failed" ));
125150 // for(;;); // Don't proceed, loop forever
126151 }
@@ -129,57 +154,57 @@ bool UI_OLED::setupPantallaOled(int I2C_SDA, int I2C_SCL){
129154 // display.display();
130155 testdrawbitmap (); // Muestra un logo en la pantalla
131156 vTaskDelay (pdMS_TO_TICKS (4000 )); // Pause for 4 seconds
132- display. clearDisplay ();
157+ display-> clearDisplay ();
133158
134159 // Show the display buffer on the screen. You MUST call display() after
135160 // drawing commands to make them visible on screen!
136- display. display ();
161+ display-> display ();
137162}
138163
139164// Logo inicial
140165// --------------------------------------
141166#include " logoInicial.h" // Matriz con la imagen del logo y el tamaño
142167void UI_OLED::testdrawbitmap (void ) {
143- display. clearDisplay ();
168+ display-> clearDisplay ();
144169
145- display. drawBitmap (
146- (display. width () - LOGO_WIDTH ) / 2 ,
147- (display. height () - LOGO_HEIGHT) / 2 ,
170+ display-> drawBitmap (
171+ (display-> width () - LOGO_WIDTH ) / 2 ,
172+ (display-> height () - LOGO_HEIGHT) / 2 ,
148173 LogoWaveSense, LOGO_WIDTH, LOGO_HEIGHT, 1 );
149- display. display ();
174+ display-> display ();
150175}
151176// --------------------------------------
152177
153178bool UI_OLED::mostrarMenuEnOLED (menu menuPorMostrar){
154179 // Funcion para desplagar un menu en la pantalla
155- display. clearDisplay ();
156- display. setTextSize (1 ); // Normal 1:1 pixel scale
157- display. setTextColor (SSD1306_WHITE); // Draw white text
158- display. drawLine (1 , 15 , display. width ()-15 , 15 , SSD1306_WHITE);
159- display. setCursor (0 ,6 );
160- display. println (menuPorMostrar.titulo ); // mostrar el titulo
161- display. setCursor (0 ,17 );
180+ display-> clearDisplay ();
181+ display-> setTextSize (1 ); // Normal 1:1 pixel scale
182+ display-> setTextColor (SSD1306_WHITE); // Draw white text
183+ display-> drawLine (1 , 15 , display-> width ()-15 , 15 , SSD1306_WHITE);
184+ display-> setCursor (0 ,6 );
185+ display-> println (menuPorMostrar.titulo ); // mostrar el titulo
186+ display-> setCursor (0 ,17 );
162187 for (int i = 0 ; i < menuPorMostrar.numOpc ; i++)
163188 {
164189 if (i==menuPorMostrar.opcionSelecionada ){ // verifica cual es la opcion en pantalla y le pone una marca
165- display. println (" > " + menuPorMostrar.opciones [i]);
190+ display-> println (" > " + menuPorMostrar.opciones [i]);
166191 } else {
167- display. println (" " + menuPorMostrar.opciones [i]);
192+ display-> println (" " + menuPorMostrar.opciones [i]);
168193 }
169194 }
170- display. display ();
195+ display-> display ();
171196}
172197
173198
174199// Funcion para mostrar un mensaje de aviso
175200bool UI_OLED::mostrarMensaje (String mensaje, int duracion = duracionMensajeMS){
176- display. clearDisplay (); // Borra el buffer de la pantalla
177- display. setTextSize (1 ); // Normal 1:1 pixel scale
178- display. setTextColor (SSD1306_WHITE); // Draw white text
179- display. setCursor (5 ,32 );
201+ display-> clearDisplay (); // Borra el buffer de la pantalla
202+ display-> setTextSize (1 ); // Normal 1:1 pixel scale
203+ display-> setTextColor (SSD1306_WHITE); // Draw white text
204+ display-> setCursor (5 ,32 );
180205
181- display. println (mensaje); // probando si devuelve valor
182- display. display ();
206+ display-> println (mensaje); // probando si devuelve valor
207+ display-> display ();
183208 vTaskDelay (pdMS_TO_TICKS (duracion)); // Pausa para mostrar el mensaje
184209}
185210
@@ -198,7 +223,7 @@ bool UI_OLED::callBackEjecutarAccionMenu(int menuActual, int opcionActual){
198223
199224// if algo cambia, actualizar pantalla
200225bool IRAM_ATTR UI_OLED::update (){
201- char botonPresionado = botonesUI. botonPresionado (); // Varible para recibir el boton presionado
226+ char botonPresionado = botonesUI-> botonPresionado (); // Varible para recibir el boton presionado
202227 if (botonPresionado != ' 0' ){ // si se presiona un boton, verifica cual fue
203228 if (botonPresionado == ' 1' ){
204229 menusGuardados[menuActual].dismimuirOpcionSelecionada (1 );
@@ -217,7 +242,6 @@ bool IRAM_ATTR UI_OLED::update(){
217242 }
218243 mostrarMenuEnOLED (menusGuardados[menuActual]); // actualiza el menu
219244 }
220-
221245 if (mensajePendiente){
222246 // Permite activar mensaje esporadico
223247 mostrarMensaje (mensajeEsporadico);
@@ -228,6 +252,14 @@ bool IRAM_ATTR UI_OLED::update(){
228252 mostrarMenuEnOLED (menusGuardados[menuActual]); // actualiza el menu
229253 cambioPendiente = false ;
230254 }
255+
256+ // Actualizar el widget activo
257+ for (int i=0 ; i < numeroWidgets; i++){
258+ while (widgets[i].getStatus ()){
259+ widgets[i].update ();
260+ cambioPendiente = true ; // Volver a actualizar la pantalla con el menu correspondiente al salir del widget
261+ }
262+ }
231263 return 1 ;
232264} // fin de funcion
233265
0 commit comments