str list selection, updated event handler
This commit is contained in:
parent
8fcc742241
commit
b0909d1c49
|
@ -619,6 +619,7 @@ void u8x8_gpio_call(u8x8_t *u8x8, uint8_t msg, uint8_t arg) U8X8_NOINLINE;
|
|||
|
||||
/*==========================================*/
|
||||
/* u8x8_debounce.c */
|
||||
/* return U8X8_MSG_GPIO_MENU_xxxxx messages */
|
||||
uint8_t u8x8_GetMenuEvent(u8x8_t *u8x8);
|
||||
|
||||
/*==========================================*/
|
||||
|
@ -722,18 +723,19 @@ extern const uint8_t u8x8_font_pcsenior_u[] U8X8_FONT_SECTION("u8x8_font_pcsenio
|
|||
|
||||
/*==========================================*/
|
||||
|
||||
/* scrollable list */
|
||||
/* u8x8_sl.c scrollable list */
|
||||
struct _u8sl_struct
|
||||
{
|
||||
uint8_t visible; /* number of visible elements in the menu */
|
||||
uint8_t total; /* total number of elements in the menu */
|
||||
uint8_t first_pos; /* position of the first visible line */
|
||||
uint8_t current_pos; /* starts at 0 */
|
||||
uint8_t current_pos; /* current cursor position, starts at 0 */
|
||||
};
|
||||
typedef struct _u8sl_struct u8sl_t;
|
||||
|
||||
typedef void (*u8x8_sl_cb)(u8x8_t *u8x8, u8sl_t *u8sl, uint8_t idx, void *aux);
|
||||
typedef void (*u8x8_sl_cb)(u8x8_t *u8x8, u8sl_t *u8sl, uint8_t idx, const void *aux);
|
||||
|
||||
uint8_t u8x8_UserInterfaceSelectionList(u8x8_t *u8x8, uint8_t start_pos, const char *sl);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ static uint8_t u8x8_read_pin_state(u8x8_t *u8x8)
|
|||
uint8_t i;
|
||||
uint8_t pin_state;
|
||||
|
||||
pin_state = 0;
|
||||
pin_state = 255; /* be compatible with the setup of the default pin setup, which is 255 */
|
||||
for( i = 0; i < U8X8_PIN_INPUT_CNT; i++ )
|
||||
{
|
||||
pin_state <<= 1;
|
||||
|
@ -132,15 +132,21 @@ uint8_t u8x8_GetMenuEvent(u8x8_t *u8x8)
|
|||
{
|
||||
/* keypress detected */
|
||||
u8x8->debounce_last_pin_state = pin_state;
|
||||
//result_msg = U8X8_MSG_GPIO_MENU_NEXT;
|
||||
u8x8->debounce_state = 0x020; /* got to state C */
|
||||
}
|
||||
break;
|
||||
case 0x20: /* State C */
|
||||
if ( u8x8->debounce_last_pin_state != pin_state )
|
||||
/* wait until key release */
|
||||
if ( u8x8->debounce_default_pin_state == pin_state )
|
||||
{
|
||||
/* key press detected */
|
||||
u8x8->debounce_state = 0x00; /* back to state A */
|
||||
result_msg = U8X8_MSG_GPIO(u8x8_find_first_diff(u8x8->debounce_last_pin_state, pin_state)+U8X8_PIN_OUTPUT_CNT);
|
||||
result_msg = U8X8_MSG_GPIO(u8x8_find_first_diff(u8x8->debounce_default_pin_state, u8x8->debounce_last_pin_state)+U8X8_PIN_OUTPUT_CNT);
|
||||
}
|
||||
else
|
||||
{
|
||||
//result_msg = U8X8_MSG_GPIO_MENU_NEXT;
|
||||
// maybe implement autorepeat here
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -43,14 +43,14 @@
|
|||
void u8sl_Next(u8sl_t *u8sl)
|
||||
{
|
||||
u8sl->current_pos++;
|
||||
if ( u8sl->current_pos > u8sl->total )
|
||||
if ( u8sl->current_pos >= u8sl->total )
|
||||
{
|
||||
u8sl->current_pos = 0;
|
||||
u8sl->first_pos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( u8sl->first_pos + u8sl->visible < u8sl->current_pos )
|
||||
if ( u8sl->first_pos + u8sl->visible <= u8sl->current_pos + 1 )
|
||||
{
|
||||
u8sl->first_pos = u8sl->current_pos - u8sl->visible + 1;
|
||||
}
|
||||
|
@ -69,12 +69,12 @@ void u8sl_Prev(u8sl_t *u8sl)
|
|||
else
|
||||
{
|
||||
u8sl->current_pos--;
|
||||
if ( u8sl->first_pos < u8sl->current_pos )
|
||||
if ( u8sl->first_pos > u8sl->current_pos )
|
||||
u8sl->first_pos = u8sl->current_pos;
|
||||
}
|
||||
}
|
||||
|
||||
void u8x8_DrawSelectionList(u8x8_t *u8x8, u8sl_t *u8sl, u8x8_sl_cb sl_cb, void *aux)
|
||||
void u8x8_DrawSelectionList(u8x8_t *u8x8, u8sl_t *u8sl, u8x8_sl_cb sl_cb, const void *aux)
|
||||
{
|
||||
uint8_t i;
|
||||
for( i = 0; i < u8sl->visible; i++ )
|
||||
|
@ -83,4 +83,75 @@ void u8x8_DrawSelectionList(u8x8_t *u8x8, u8sl_t *u8sl, u8x8_sl_cb sl_cb, void *
|
|||
}
|
||||
}
|
||||
|
||||
/* selection list with string line */
|
||||
void u8x8_sl_string_line_cb(u8x8_t *u8x8, u8sl_t *u8sl, uint8_t idx, const void *aux)
|
||||
{
|
||||
const char *s;
|
||||
uint8_t col;
|
||||
uint8_t row;
|
||||
/* calculate offset from display upper border */
|
||||
row = u8x8_GetRows(u8x8);
|
||||
row -= u8sl->visible;
|
||||
row /= 2;
|
||||
|
||||
/* calculate target pos */
|
||||
row += idx;
|
||||
row -= u8sl->first_pos;
|
||||
|
||||
/* check whether this is the current cursor line */
|
||||
if ( idx == u8sl->current_pos )
|
||||
u8x8_SetInverseFont(u8x8, 1);
|
||||
else
|
||||
u8x8_SetInverseFont(u8x8, 0);
|
||||
|
||||
/* get the line from the array */
|
||||
s = u8x8_GetStringLine(idx, (const char *)aux);
|
||||
|
||||
/* draw the line */
|
||||
if ( s == NULL )
|
||||
s = "";
|
||||
col = u8x8_DrawUTF8(u8x8, 0, row, s);
|
||||
|
||||
/* fill up the line with some more spaced */
|
||||
while( col < u8x8_GetCols(u8x8) )
|
||||
u8x8_DrawUTF8(u8x8, col++, row, " ");
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
returns start_pos if user has pressed the home key
|
||||
returns the selected line if user has pressed the select key
|
||||
*/
|
||||
uint8_t u8x8_UserInterfaceSelectionList(u8x8_t *u8x8, uint8_t start_pos, const char *sl)
|
||||
{
|
||||
u8sl_t u8sl;
|
||||
uint8_t event;
|
||||
u8sl.visible = u8x8_GetRows(u8x8);
|
||||
u8sl.total = u8x8_GetStringLineCnt(sl);
|
||||
u8sl.first_pos = 0;
|
||||
u8sl.current_pos = start_pos;
|
||||
if ( u8sl.current_pos >= u8sl.total )
|
||||
u8sl.current_pos = u8sl.total-1;
|
||||
|
||||
u8x8_DrawSelectionList(u8x8, &u8sl, u8x8_sl_string_line_cb, sl);
|
||||
|
||||
for(;;)
|
||||
{
|
||||
event = u8x8_GetMenuEvent(u8x8);
|
||||
if ( event == U8X8_MSG_GPIO_MENU_SELECT )
|
||||
return u8sl.current_pos;
|
||||
else if ( event == U8X8_MSG_GPIO_MENU_HOME )
|
||||
return start_pos;
|
||||
else if ( event == U8X8_MSG_GPIO_MENU_NEXT )
|
||||
{
|
||||
u8sl_Next(&u8sl);
|
||||
u8x8_DrawSelectionList(u8x8, &u8sl, u8x8_sl_string_line_cb, sl);
|
||||
}
|
||||
else if ( event == U8X8_MSG_GPIO_MENU_PREV )
|
||||
{
|
||||
u8sl_Prev(&u8sl);
|
||||
u8x8_DrawSelectionList(u8x8, &u8sl, u8x8_sl_string_line_cb, sl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ U8G2_UC1701_DOGS102_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=
|
|||
|
||||
|
||||
void setup(void) {
|
||||
u8g2.begin();
|
||||
u8g2.begin(/* menu_select_pin= */ 5, /* menu_next_pin= */ 4, /* menu_prev_pin= */ 2, /* menu_home_pin= */ 3);
|
||||
u8g2.setFont(u8g2_font_helvB12_tr);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,286 @@
|
|||
|
||||
#
|
||||
# Arduino-1.0 Makefile
|
||||
#
|
||||
# written by olikraus@gmail.com
|
||||
#
|
||||
# Features:
|
||||
# - boards.txt is used to derive parameters
|
||||
# - All intermediate files are put into a separate directory (TMPDIRNAME)
|
||||
# - Simple use: Copy Makefile into the same directory of the .ino file
|
||||
#
|
||||
# Limitations:
|
||||
# - requires UNIX environment
|
||||
# - TMPDIRNAME must be subdirectory of the current directory.
|
||||
#
|
||||
# Targets
|
||||
# all build everything
|
||||
# upload build and upload to arduino
|
||||
# clean remove all temporary files (includes final hex file)
|
||||
#
|
||||
# History
|
||||
# 001 28 Apr 2010 first release
|
||||
# 002 05 Oct 2010 added 'uno'
|
||||
# 003 06 Dec 2011 arduino 1.0
|
||||
# 004 11 Feb 2012 u8glib
|
||||
#
|
||||
|
||||
#=== user configuration ===
|
||||
# All ...PATH variables must have a '/' at the end
|
||||
|
||||
# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt
|
||||
# Some examples:
|
||||
# BOARD DESCRIPTION
|
||||
# uno Arduino Uno
|
||||
# atmega328 Arduino Duemilanove or Nano w/ ATmega328
|
||||
# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
|
||||
# mega Arduino Mega
|
||||
# mega2560 Arduino Mega2560
|
||||
# mini Arduino Mini
|
||||
# lilypad328 LilyPad Arduino w/ ATmega328
|
||||
BOARD:=uno
|
||||
|
||||
# additional definitions
|
||||
#DEFS:=-DARDUINO=105
|
||||
|
||||
|
||||
U8G_PATH:=$(shell cd ../../../.. && pwd)/csrc/
|
||||
U8G_CPP_PATH:=$(shell cd ../../../.. && pwd)/cppsrc/
|
||||
#U8G_FONT_PATH:=$(shell cd ../../.. && pwd)/sfntsrc/
|
||||
|
||||
|
||||
# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end.
|
||||
# Can be empty if all tools are accessable through the search path
|
||||
AVR_TOOLS_PATH:=/usr/bin/
|
||||
|
||||
# Install path of the arduino software. Requires a '/' at the end.
|
||||
ARDUINO_PATH:=/home/kraus/prg/arduino-1.0.5-u8glib/
|
||||
|
||||
# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path.
|
||||
AVRDUDE_PATH:=$(ARDUINO_PATH)hardware/tools/
|
||||
|
||||
# The unix device where we can reach the arduino board
|
||||
# Uno: /dev/ttyACM0
|
||||
# Duemilanove: /dev/ttyUSB0
|
||||
AVRDUDE_PORT:=/dev/ttyACM0
|
||||
|
||||
# List of all libaries which should be included.
|
||||
EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/
|
||||
EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/
|
||||
EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SD/utility/
|
||||
EXTRA_DIRS+=$(ARDUINO_PATH)libraries/Wire/
|
||||
EXTRA_DIRS+=$(ARDUINO_PATH)libraries/Wire/utility/
|
||||
EXTRA_DIRS+=$(ARDUINO_PATH)libraries/SPI/
|
||||
#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/.../
|
||||
|
||||
#=== fetch parameter from boards.txt processor parameter ===
|
||||
# the basic idea is to get most of the information from boards.txt
|
||||
|
||||
BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt
|
||||
|
||||
# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p
|
||||
MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000
|
||||
F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# get variant subfolder
|
||||
VARIANT:=$(shell sed -n -e "s/$(BOARD).build.variant=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
|
||||
|
||||
# avrdude
|
||||
# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600
|
||||
AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500
|
||||
AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# use stk500v1, because stk500 will default to stk500v2
|
||||
#AVRDUDE_PROGRAMMER:=stk500v1
|
||||
|
||||
#=== identify user files ===
|
||||
INOSRC:=$(shell ls *.ino)
|
||||
TARGETNAME=$(basename $(INOSRC))
|
||||
|
||||
CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS))
|
||||
CDIRS:=*.c utility/*.c $(U8G_PATH)*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c
|
||||
CSRC:=$(shell ls $(CDIRS) 2>/dev/null)
|
||||
|
||||
CCSRC:=$(shell ls *.cc 2>/dev/null)
|
||||
|
||||
CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) $(U8G_CPP_PATH)
|
||||
CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp
|
||||
CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null)
|
||||
|
||||
#=== build internal variables ===
|
||||
|
||||
# the name of the subdirectory where everything is stored
|
||||
TMPDIRNAME:=tmp
|
||||
TMPDIRPATH:=$(TMPDIRNAME)/
|
||||
|
||||
AVRTOOLSPATH:=$(AVR_TOOLS_PATH)
|
||||
|
||||
OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy
|
||||
OBJDUMP:=$(AVRTOOLSPATH)avr-objdump
|
||||
SIZE:=$(AVRTOOLSPATH)avr-size
|
||||
|
||||
CPPSRC:=$(addprefix $(TMPDIRPATH),$(INOSRC:.ino=.cpp)) $(CPPSRC)
|
||||
|
||||
COBJ:=$(CSRC:.c=.o)
|
||||
CCOBJ:=$(CCSRC:.cc=.o)
|
||||
CPPOBJ:=$(CPPSRC:.cpp=.o)
|
||||
|
||||
OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ)
|
||||
DIRS:= $(dir $(OBJFILES))
|
||||
|
||||
DEPFILES:=$(OBJFILES:.o=.d)
|
||||
# assembler files from avr-gcc -S
|
||||
ASSFILES:=$(OBJFILES:.o=.s)
|
||||
# disassembled object files with avr-objdump -S
|
||||
DISFILES:=$(OBJFILES:.o=.dis)
|
||||
|
||||
|
||||
LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a
|
||||
ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf
|
||||
HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex
|
||||
|
||||
AVRDUDE_FLAGS = -V -F
|
||||
AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf
|
||||
AVRDUDE_FLAGS += -p $(MCU)
|
||||
AVRDUDE_FLAGS += -P $(AVRDUDE_PORT)
|
||||
AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER)
|
||||
AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE)
|
||||
AVRDUDE_FLAGS += -U flash:w:$(HEXNAME)
|
||||
|
||||
AVRDUDE = $(AVRDUDE_PATH)avrdude
|
||||
|
||||
#=== predefined variable override ===
|
||||
# use "make -p -f/dev/null" to see the default rules and definitions
|
||||
|
||||
# Build C and C++ flags. Include path information must be placed here
|
||||
COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS) -DARDUINO=100
|
||||
# COMMON_FLAGS += -gdwarf-2
|
||||
COMMON_FLAGS += -Os
|
||||
COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||
COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino
|
||||
COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/variants/$(VARIANT)
|
||||
COMMON_FLAGS += -I. -I$(U8G_PATH) -I$(U8G_CPP_PATH)
|
||||
COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS))
|
||||
COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
|
||||
COMMON_FLAGS += -Wl,--Map=output.map
|
||||
COMMON_FLAGS += -Wl,--relax
|
||||
COMMON_FLAGS += -mcall-prologues
|
||||
|
||||
CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes
|
||||
CXXFLAGS = $(COMMON_FLAGS)
|
||||
|
||||
# Replace standard build tools by avr tools
|
||||
CC = $(AVRTOOLSPATH)avr-gcc
|
||||
CXX = $(AVRTOOLSPATH)avr-g++
|
||||
AR = @$(AVRTOOLSPATH)avr-ar
|
||||
|
||||
|
||||
# "rm" must be able to delete a directory tree
|
||||
RM = rm -rf
|
||||
|
||||
#=== rules ===
|
||||
|
||||
# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH
|
||||
# reuse existing variables as far as possible
|
||||
|
||||
$(TMPDIRPATH)%.o: %.c
|
||||
@echo compile $<
|
||||
@$(COMPILE.c) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.o: %.cc
|
||||
@echo compile $<
|
||||
@$(COMPILE.cc) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.o: %.cpp
|
||||
@echo compile $<
|
||||
@$(COMPILE.cpp) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.c
|
||||
@$(COMPILE.c) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.cc
|
||||
@$(COMPILE.cc) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.cpp
|
||||
@$(COMPILE.cpp) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o
|
||||
@$(OBJDUMP) -S $< > $@
|
||||
|
||||
.SUFFIXES: .elf .hex .ino
|
||||
|
||||
.elf.hex:
|
||||
@$(OBJCOPY) -O ihex -R .eeprom $< $@
|
||||
|
||||
$(TMPDIRPATH)%.cpp: %.ino
|
||||
@cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@
|
||||
@cat $< >> $@
|
||||
@echo >> $@
|
||||
@echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@
|
||||
|
||||
|
||||
.PHONY: all
|
||||
all: tmpdir $(HEXNAME) assemblersource showsize
|
||||
ls -al $(HEXNAME) $(ELFNAME)
|
||||
|
||||
$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES)))
|
||||
$(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@
|
||||
|
||||
$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES))
|
||||
|
||||
#=== create temp directory ===
|
||||
# not really required, because it will be also created during the dependency handling
|
||||
.PHONY: tmpdir
|
||||
tmpdir:
|
||||
@test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH)
|
||||
|
||||
#=== create assembler files for each C/C++ file ===
|
||||
.PHONY: assemblersource
|
||||
assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES))
|
||||
|
||||
|
||||
#=== show the section sizes of the ELF file ===
|
||||
.PHONY: showsize
|
||||
showsize: $(ELFNAME)
|
||||
$(SIZE) $<
|
||||
|
||||
#=== clean up target ===
|
||||
# this is simple: the TMPDIRPATH is removed
|
||||
.PHONY: clean
|
||||
clean:
|
||||
$(RM) $(TMPDIRPATH)
|
||||
|
||||
# Program the device.
|
||||
# step 1: reset the arduino board with the stty command
|
||||
# step 2: user avrdude to upload the software
|
||||
.PHONY: upload
|
||||
upload: $(HEXNAME)
|
||||
stty -F $(AVRDUDE_PORT) hupcl
|
||||
$(AVRDUDE) $(AVRDUDE_FLAGS)
|
||||
|
||||
|
||||
# === dependency handling ===
|
||||
# From the gnu make manual (section 4.14, Generating Prerequisites Automatically)
|
||||
# Additionally (because this will be the first executed rule) TMPDIRPATH is created here.
|
||||
# Instead of "sed" the "echo" command is used
|
||||
# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd ..
|
||||
DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\
|
||||
mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\
|
||||
set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@
|
||||
|
||||
|
||||
$(TMPDIRPATH)%.d: %.c
|
||||
@$(DEPACTION)
|
||||
|
||||
$(TMPDIRPATH)%.d: %.cc
|
||||
@$(DEPACTION)
|
||||
|
||||
$(TMPDIRPATH)%.d: %.cpp
|
||||
@$(DEPACTION)
|
||||
|
||||
# Include dependency files. If a .d file is missing, a warning is created and the .d file is created
|
||||
# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles)
|
||||
-include $(addprefix $(TMPDIRPATH),$(DEPFILES))
|
||||
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
|
||||
StringLineU8x8.ino
|
||||
|
||||
Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)
|
||||
|
||||
Copyright (c) 2016, olikraus@gmail.com
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list
|
||||
of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this
|
||||
list of conditions and the following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
#include <U8x8lib.h>
|
||||
|
||||
/*
|
||||
Preconditions:
|
||||
Uno with DOGS102 Shield
|
||||
*/
|
||||
|
||||
// Please UNCOMMENT one of the contructor lines below
|
||||
// U8x8 Contructor List
|
||||
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8x8setupcpp
|
||||
//U8X8_SSD1306_128X64_NONAME_4W_SW_SPI u8x8(/* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
|
||||
//U8X8_SSD1306_128X64_NONAME_4W_HW_SPI u8x8(/* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
|
||||
//U8X8_SSD1306_128X64_NONAME_3W_SW_SPI u8x8(/* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
|
||||
//U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ 2, /* data=*/ 0, /* reset=*/ U8X8_PIN_NONE); /* Digispark ATTiny85 */
|
||||
//U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display
|
||||
//U8X8_SSD1306_128X32_UNIVISION_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather ESP8266/32u4 Boards + FeatherWing OLED
|
||||
//U8X8_SSD1306_128X32_UNIVISION_SW_I2C u8x8(/* clock=*/ 21, /* data=*/ 20, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather M0 Basic Proto + FeatherWing OLED
|
||||
//U8X8_SSD1306_128X32_UNIVISION_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE); // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED
|
||||
//U8X8_SSD1306_128X64_NONAME_6800 u8x8(13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
|
||||
//U8X8_SSD1306_128X64_NONAME_8080 u8x8(13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
|
||||
//U8X8_ST7920_192X32_8080 u8x8(8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
|
||||
//U8X8_ST7920_192X32_6800 u8x8(8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
|
||||
//U8X8_UC1701_DOGS102_4W_SW_SPI u8x8(/* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
|
||||
U8X8_UC1701_DOGS102_4W_HW_SPI u8x8(/* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void setup(void) {
|
||||
|
||||
u8x8.begin(/* menu_select_pin= */ 5, /* menu_next_pin= */ 4, /* menu_prev_pin= */ 2, /* menu_home_pin= */ 3);
|
||||
u8x8.setFont(u8x8_font_chroma48medium8_r);
|
||||
}
|
||||
|
||||
const char *string_list = "000\n111\n222\n333\n444\n555\n666\n777\n888\n999";
|
||||
uint8_t current_selection = 0;
|
||||
|
||||
|
||||
|
||||
void loop(void) {
|
||||
current_selection = u8x8_UserInterfaceSelectionList(u8x8.getU8x8(), current_selection, string_list);
|
||||
}
|
||||
|
Loading…
Reference in New Issue