#include <Arduino.h>
#include <U8g2lib.h>
typedef u8g2_uint_t u8g_uint_t; //Definición de un porteo de ug8lib 1 al 2
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
void setup(void) {
u8g2.begin(/* menu_select_pin= */ 5, /* menu_next_pin= */ 4, /* menu_prev_pin= */ 2, /* menu_home_pin= */ 3);
u8g2.setFont(u8g2_font_6x12_tr);
}
struct menu_entry_type
{
const uint8_t *font;
uint16_t icon;
const char *name;
};
struct menu_state
{
int16_t menu_start; /* in pixel */
int16_t frame_position; /* in pixel */
uint8_t position; /* position, array index */
};
/*
Icon configuration
Width and height must match the icon font size
GAP: Space between the icons
BGAP: Gap between the display border and the cursor.
*/
#define ICON_WIDTH 32
#define ICON_HEIGHT 32
#define ICON_GAP 4
#define ICON_BGAP 16
#define ICON_Y 32+ ICON_GAP
struct menu_entry_type menu_entry_list[] =
{
{ u8g2_font_open_iconic_embedded_4x_t, 65, "Clock Setup"},
{ u8g2_font_open_iconic_embedded_4x_t, 66, "Gear Game"},
{ u8g2_font_open_iconic_embedded_4x_t, 67, "Flash Light"},
{ u8g2_font_open_iconic_embedded_4x_t, 68, "Home"},
{ u8g2_font_open_iconic_embedded_4x_t, 72, "Configuration"},
{ NULL, 0, NULL }
};
int8_t button_event = 0; // set this to 0, once the event has been processed
void check_button_event(void)
{
if ( button_event == 0 )
button_event = u8g2.getMenuEvent();
}
void draw(struct menu_state *state)
{
int16_t x;
uint8_t i;
x = state->menu_start;
i = 0;
while( menu_entry_list[i].icon > 0 )
{
if ( x >= -ICON_WIDTH && x < u8g2.getDisplayWidth() )
{
u8g2.setFont(menu_entry_list[i].font);
u8g2.drawGlyph(x, ICON_Y, menu_entry_list[i].icon );
}
i++;
x += ICON_WIDTH + ICON_GAP;
check_button_event();
}
u8g2.drawFrame(state->frame_position-1, ICON_Y-ICON_HEIGHT-1, ICON_WIDTH+2, ICON_WIDTH+2);
u8g2.drawFrame(state->frame_position-2, ICON_Y-ICON_HEIGHT-2, ICON_WIDTH+4, ICON_WIDTH+4);
u8g2.drawFrame(state->frame_position-3, ICON_Y-ICON_HEIGHT-3, ICON_WIDTH+6, ICON_WIDTH+6);
check_button_event();
}
void to_right(struct menu_state *state)
{
if ( menu_entry_list[state->position+1].font != NULL )
{
if ( (int16_t)state->frame_position+ 2*(int16_t)ICON_WIDTH + (int16_t)ICON_BGAP < (int16_t)u8g2.getDisplayWidth() )
{
state->position++;
state->frame_position += ICON_WIDTH + (int16_t)ICON_GAP;
}
else
{
state->position++;
state->frame_position = (int16_t)u8g2.getDisplayWidth() - (int16_t)ICON_WIDTH - (int16_t)ICON_BGAP;
state->menu_start = state->frame_position - state->position*((int16_t)ICON_WIDTH + (int16_t)ICON_GAP);
}
}
}
void to_left(struct menu_state *state)
{
if ( state->position > 0 )
{
if ( (int16_t)state->frame_position >= (int16_t)ICON_BGAP+(int16_t)ICON_WIDTH+ (int16_t)ICON_GAP )
{
state->position--;
state->frame_position -= ICON_WIDTH + (int16_t)ICON_GAP;
}
else
{
state->position--;
state->frame_position = ICON_BGAP;
state->menu_start = state->frame_position - state->position*((int16_t)ICON_WIDTH + (int16_t)ICON_GAP);
}
}
}
uint8_t towards_int16(int16_t *current, int16_t dest)
{
if ( *current < dest )
{
(*current)++;
return 1;
}
else if ( *current > dest )
{
(*current)--;
return 1;
}
return 0;
}
uint8_t towards(struct menu_state *current, struct menu_state *destination)
{
uint8_t r = 0;
uint8_t i;
for( i = 0; i < 6; i++ )
{
r |= towards_int16( &(current->frame_position), destination->frame_position);
r |= towards_int16( &(current->menu_start), destination->menu_start);
}
return r;
}
struct menu_state current_state = { ICON_BGAP, ICON_BGAP, 0 };
struct menu_state destination_state = { ICON_BGAP, ICON_BGAP, 0 };
void loop(void) {
do
{
u8g2.firstPage();
do
{
draw(¤t_state);
u8g2.setFont(u8g2_font_helvB10_tr);
u8g2.setCursor((u8g2.getDisplayWidth()-u8g2.getStrWidth(menu_entry_list[destination_state.position].name))/2,u8g2.getDisplayHeight()-5);
u8g2.print(menu_entry_list[destination_state.position].name);
check_button_event();
delay(10);
} while( u8g2.nextPage() );
if ( button_event == U8X8_MSG_GPIO_MENU_NEXT )
to_right(&destination_state);
if ( button_event == U8X8_MSG_GPIO_MENU_PREV )
to_left(&destination_state);
if ( button_event == U8X8_MSG_GPIO_MENU_SELECT )
{
u8g2.setFont(u8g2_font_helvB10_tr);
u8g2.userInterfaceMessage("Selection:", menu_entry_list[destination_state.position].name, "", " Ok ");
}
if ( button_event > 0 ) // all known events are processed, clear event
button_event = 0;
} while ( towards(¤t_state, &destination_state) );
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
btn4:1.l
btn4:2.l
btn4:1.r
btn4:2.r