diff --git a/apps/beep1/Makefile b/apps/beep1/Makefile
new file mode 100644
index 0000000..d7d8c4a
--- /dev/null
+++ b/apps/beep1/Makefile
@@ -0,0 +1,65 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 12 Sep 2010
+# Descr: Makefile for beep1
+
+# Definitions.
+CC = avr-gcc
+CFLAGS = -mmcu=atmega32u2 -Os -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/avr -I../../drivers -I../../utils
+OBJCOPY = avr-objcopy
+SIZE = avr-size
+DEL = rm
+
+
+# Default target.
+all: beep1.out
+
+
+# Compile: create object files from C source files.
+beep1.o: beep1.c ../../drivers/avr/delay.h ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/button.h ../../drivers/led.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio.o: ../../drivers/avr/pio.c ../../drivers/avr/pio.h ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system.o: ../../drivers/avr/system.c ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer.o: ../../drivers/avr/timer.c ../../drivers/avr/system.h ../../drivers/avr/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+button.o: ../../drivers/button.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/button.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led.o: ../../drivers/led.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/led.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pacer.o: ../../utils/pacer.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create output file (executable) from object files.
+beep1.out: beep1.o pio.o system.o timer.o button.o led.o pacer.o
+ $(CC) $(CFLAGS) $^ -o $@ -lm
+ $(SIZE) $@
+
+
+# Create hex file for programming from executable file.
+beep1.hex: beep1.out
+ $(OBJCOPY) -O ihex beep1.out beep1.hex
+
+
+# Target: clean project.
+.PHONY: clean
+clean:
+ -$(DEL) *.o *.out *.hex
+
+
+# Target: program project.
+.PHONY: program
+program: beep1.hex
+ dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash beep1.hex; dfu-programmer atmega32u2 start
+
+
diff --git a/apps/beep1/Makefile.test b/apps/beep1/Makefile.test
new file mode 100644
index 0000000..6c1611a
--- /dev/null
+++ b/apps/beep1/Makefile.test
@@ -0,0 +1,55 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for beep1
+
+CC = gcc
+CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
+
+DEL = rm
+
+
+# Default target.
+all: beep1
+
+
+# Compile: create object files from C source files.
+beep1-test.o: beep1.c ../../drivers/button.h ../../drivers/led.h ../../drivers/test/avrtest.h ../../drivers/test/delay.h ../../drivers/test/pio.h ../../drivers/test/system.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+button-test.o: ../../drivers/button.c ../../drivers/button.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led-test.o: ../../drivers/led.c ../../drivers/led.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+mgetkey-test.o: ../../drivers/test/mgetkey.c ../../drivers/test/mgetkey.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio-test.o: ../../drivers/test/pio.c ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system-test.o: ../../drivers/test/system.c ../../drivers/test/avrtest.h ../../drivers/test/mgetkey.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer-test.o: ../../drivers/test/timer.c ../../drivers/test/system.h ../../drivers/test/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pacer-test.o: ../../utils/pacer.c ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create executable file from object files.
+beep1: beep1-test.o button-test.o led-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o pacer-test.o
+ $(CC) $(CFLAGS) $^ -o $@ -lrt
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) beep1 beep1-test.o button-test.o led-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o pacer-test.o
+
+
+
diff --git a/apps/beep1/beep1.c b/apps/beep1/beep1.c
new file mode 100644
index 0000000..eb21fdd
--- /dev/null
+++ b/apps/beep1/beep1.c
@@ -0,0 +1,36 @@
+/** @file beep1.c
+ @author M.P. Hayes
+ @date 17 Sep 2013
+*/
+
+#include "system.h"
+#include "pio.h"
+#include "pacer.h"
+
+/* Connect piezo tweeter to pins 6 and 8 of UCFK4 P1 connector
+ for push-pull operation. */
+#define PIEZO1_PIO PIO_DEFINE (PORT_D, 4)
+#define PIEZO2_PIO PIO_DEFINE (PORT_D, 6)
+
+#define TONE_FREQUENCY 440
+#define LOOP_RATE (TONE_FREQUENCY * 2)
+
+int main (void)
+{
+ system_init ();
+
+ pio_config_set (PIEZO1_PIO, PIO_OUTPUT_LOW);
+ pio_config_set (PIEZO2_PIO, PIO_OUTPUT_HIGH);
+
+ pacer_init (LOOP_RATE);
+
+ while (1)
+ {
+ pacer_wait ();
+
+ /* Generate annoying tone. */
+ pio_output_toggle (PIEZO1_PIO);
+ pio_output_toggle (PIEZO2_PIO);
+ }
+ return 0;
+}
diff --git a/apps/beep1/doc/Makefile b/apps/beep1/doc/Makefile
new file mode 100644
index 0000000..2fd302c
--- /dev/null
+++ b/apps/beep1/doc/Makefile
@@ -0,0 +1,45 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for squeak1 docs
+
+# The scripts used to make the graphs require the program dot; this
+# is part of the graphviz package.
+
+DEL = rm
+
+all: file_dependencies.pdf module_dependencies.pdf makefile_dependencies.pdf build_dependencies.pdf callgraph.pdf
+
+file_dependencies.pdf: files.d
+ ../../../etc/graphdeps.py $< --out $@
+
+module_dependencies.pdf: modules.d
+ ../../../etc/graphdeps.py $< --modules --rotate --out $@
+
+makefile_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@
+
+build_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@ --showops
+
+callgraph.pdf: callgraph.d
+ ../../../etc/graphdeps.py --calls --modules $< --out $@ --showops
+
+
+files.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --files . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/files.d)
+
+
+modules.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --modules . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system > doc/modules.d)
+
+
+callgraph.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --cc="avr-gcc" --cflags="-Os -mmcu=atmega32u2" --relpath --calls . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/callgraph.d)
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) *.d *.pdf
+
diff --git a/apps/beep1/doc/README b/apps/beep1/doc/README
new file mode 100644
index 0000000..39a9712
--- /dev/null
+++ b/apps/beep1/doc/README
@@ -0,0 +1,16 @@
+Running make in this directory will generate a number of PDF graphs.
+In the callgraph, the arrows means "calls". In the dependency graphs,
+the arrows means "requires" (or "depends upon").
+
+callgraph.pdf This shows the callgraph, i.e., what functions each
+ function in the program calls.
+module_dependencies.pdf This shows the dependencies between the modules.
+file_dependencies.pdf This shows the dependencies between the files.
+makefile_dependencies.pdf This shows the dependencies required by make when
+ building the program.
+build_dependencies.pdf This is like makefile_dependencies.pdf but shows
+ the operations performed to generate the new file.
+
+callgraph.d This shows the callgraph in text format.
+files.d This shows the file dependencies in text format.
+modules.d This shows the module dependencies in text format.
diff --git a/apps/beep2/Makefile b/apps/beep2/Makefile
new file mode 100644
index 0000000..879c10e
--- /dev/null
+++ b/apps/beep2/Makefile
@@ -0,0 +1,65 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 12 Sep 2010
+# Descr: Makefile for beep2
+
+# Definitions.
+CC = avr-gcc
+CFLAGS = -mmcu=atmega32u2 -Os -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/avr -I../../drivers -I../../utils
+OBJCOPY = avr-objcopy
+SIZE = avr-size
+DEL = rm
+
+
+# Default target.
+all: beep2.out
+
+
+# Compile: create object files from C source files.
+beep2.o: beep2.c ../../drivers/avr/delay.h ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/button.h ../../drivers/led.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio.o: ../../drivers/avr/pio.c ../../drivers/avr/pio.h ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system.o: ../../drivers/avr/system.c ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer.o: ../../drivers/avr/timer.c ../../drivers/avr/system.h ../../drivers/avr/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+button.o: ../../drivers/button.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/button.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led.o: ../../drivers/led.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/led.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pacer.o: ../../utils/pacer.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create output file (executable) from object files.
+beep2.out: beep2.o pio.o system.o timer.o button.o led.o pacer.o
+ $(CC) $(CFLAGS) $^ -o $@ -lm
+ $(SIZE) $@
+
+
+# Create hex file for programming from executable file.
+beep2.hex: beep2.out
+ $(OBJCOPY) -O ihex beep2.out beep2.hex
+
+
+# Target: clean project.
+.PHONY: clean
+clean:
+ -$(DEL) *.o *.out *.hex
+
+
+# Target: program project.
+.PHONY: program
+program: beep2.hex
+ dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash beep2.hex; dfu-programmer atmega32u2 start
+
+
diff --git a/apps/beep2/Makefile.test b/apps/beep2/Makefile.test
new file mode 100644
index 0000000..880b7d8
--- /dev/null
+++ b/apps/beep2/Makefile.test
@@ -0,0 +1,55 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for beep2
+
+CC = gcc
+CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
+
+DEL = rm
+
+
+# Default target.
+all: beep2
+
+
+# Compile: create object files from C source files.
+beep2-test.o: beep2.c ../../drivers/button.h ../../drivers/led.h ../../drivers/test/avrtest.h ../../drivers/test/delay.h ../../drivers/test/pio.h ../../drivers/test/system.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+button-test.o: ../../drivers/button.c ../../drivers/button.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led-test.o: ../../drivers/led.c ../../drivers/led.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+mgetkey-test.o: ../../drivers/test/mgetkey.c ../../drivers/test/mgetkey.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio-test.o: ../../drivers/test/pio.c ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system-test.o: ../../drivers/test/system.c ../../drivers/test/avrtest.h ../../drivers/test/mgetkey.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer-test.o: ../../drivers/test/timer.c ../../drivers/test/system.h ../../drivers/test/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pacer-test.o: ../../utils/pacer.c ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/pacer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create executable file from object files.
+beep2: beep2-test.o button-test.o led-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o pacer-test.o
+ $(CC) $(CFLAGS) $^ -o $@ -lrt
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) beep2 beep2-test.o button-test.o led-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o pacer-test.o
+
+
+
diff --git a/apps/beep2/beep2.c b/apps/beep2/beep2.c
new file mode 100644
index 0000000..2dfa9cc
--- /dev/null
+++ b/apps/beep2/beep2.c
@@ -0,0 +1,51 @@
+/** @file beep2.c
+ @author M.P. Hayes
+ @date 17 Sep 2013
+*/
+
+#include "system.h"
+#include "pio.h"
+#include "pacer.h"
+#include "button.h"
+
+/* Connect piezo tweeter to pins 6 and 8 of UCFK4 P1 connector
+ for push-pull operation. */
+#define PIEZO1_PIO PIO_DEFINE (PORT_D, 4)
+#define PIEZO2_PIO PIO_DEFINE (PORT_D, 6)
+#define TEST_PIO PIO_DEFINE (PORT_D, 3)
+
+#define TONE_FREQUENCY 440
+#define LOOP_RATE 10000
+
+int main (void)
+{
+ int tick = 0;
+
+ system_init ();
+
+ pio_config_set (PIEZO1_PIO, PIO_OUTPUT_LOW);
+ pio_config_set (PIEZO2_PIO, PIO_OUTPUT_HIGH);
+ pio_config_set (TEST_PIO, PIO_OUTPUT_HIGH);
+
+ pacer_init (LOOP_RATE);
+
+ while (1)
+ {
+ pacer_wait ();
+
+ pio_output_toggle (TEST_PIO);
+
+ tick = tick + 1;
+
+ if (tick >= (LOOP_RATE / (TONE_FREQUENCY * 2)))
+ {
+ tick = 0;
+
+ /* Generate annoying tone. */
+ pio_output_toggle (PIEZO1_PIO);
+ pio_output_toggle (PIEZO2_PIO);
+ }
+ }
+
+ return 0;
+}
diff --git a/apps/beep2/doc/Makefile b/apps/beep2/doc/Makefile
new file mode 100644
index 0000000..2fd302c
--- /dev/null
+++ b/apps/beep2/doc/Makefile
@@ -0,0 +1,45 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for squeak1 docs
+
+# The scripts used to make the graphs require the program dot; this
+# is part of the graphviz package.
+
+DEL = rm
+
+all: file_dependencies.pdf module_dependencies.pdf makefile_dependencies.pdf build_dependencies.pdf callgraph.pdf
+
+file_dependencies.pdf: files.d
+ ../../../etc/graphdeps.py $< --out $@
+
+module_dependencies.pdf: modules.d
+ ../../../etc/graphdeps.py $< --modules --rotate --out $@
+
+makefile_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@
+
+build_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@ --showops
+
+callgraph.pdf: callgraph.d
+ ../../../etc/graphdeps.py --calls --modules $< --out $@ --showops
+
+
+files.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --files . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/files.d)
+
+
+modules.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --modules . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system > doc/modules.d)
+
+
+callgraph.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --cc="avr-gcc" --cflags="-Os -mmcu=atmega32u2" --relpath --calls . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/callgraph.d)
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) *.d *.pdf
+
diff --git a/apps/beep2/doc/README b/apps/beep2/doc/README
new file mode 100644
index 0000000..39a9712
--- /dev/null
+++ b/apps/beep2/doc/README
@@ -0,0 +1,16 @@
+Running make in this directory will generate a number of PDF graphs.
+In the callgraph, the arrows means "calls". In the dependency graphs,
+the arrows means "requires" (or "depends upon").
+
+callgraph.pdf This shows the callgraph, i.e., what functions each
+ function in the program calls.
+module_dependencies.pdf This shows the dependencies between the modules.
+file_dependencies.pdf This shows the dependencies between the files.
+makefile_dependencies.pdf This shows the dependencies required by make when
+ building the program.
+build_dependencies.pdf This is like makefile_dependencies.pdf but shows
+ the operations performed to generate the new file.
+
+callgraph.d This shows the callgraph in text format.
+files.d This shows the file dependencies in text format.
+modules.d This shows the module dependencies in text format.
diff --git a/apps/jukebox1/Makefile b/apps/jukebox1/Makefile
new file mode 100644
index 0000000..e952a2a
--- /dev/null
+++ b/apps/jukebox1/Makefile
@@ -0,0 +1,86 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 12 Sep 2010
+# Descr: Makefile for jukebox1
+
+# Definitions.
+CC = avr-gcc
+CFLAGS = -mmcu=atmega32u2 -Os -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/avr -I../../extra -I../../drivers -I../../fonts -I../../utils
+OBJCOPY = avr-objcopy
+SIZE = avr-size
+DEL = rm
+
+
+# Default target.
+all: jukebox1.out
+
+
+# Compile: create object files from C source files.
+jukebox1.o: jukebox1.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../extra/mmelody.h ../../extra/ticker.h ../../extra/tweeter.h ../../fonts/font3x5_1.h ../../utils/font.h ../../utils/task.h ../../utils/tinygl.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio.o: ../../drivers/avr/pio.c ../../drivers/avr/pio.h ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system.o: ../../drivers/avr/system.c ../../drivers/avr/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer.o: ../../drivers/avr/timer.c ../../drivers/avr/system.h ../../drivers/avr/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+display.o: ../../drivers/display.c ../../drivers/avr/system.h ../../drivers/display.h ../../drivers/ledmat.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led.o: ../../drivers/led.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/led.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+ledmat.o: ../../drivers/ledmat.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/ledmat.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+navswitch.o: ../../drivers/navswitch.c ../../drivers/avr/delay.h ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/navswitch.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+mmelody.o: ../../extra/mmelody.c ../../drivers/avr/system.h ../../extra/mmelody.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+ticker.o: ../../extra/ticker.c
+ $(CC) -c $(CFLAGS) $< -o $@
+
+tweeter.o: ../../extra/tweeter.c ../../drivers/avr/system.h ../../extra/ticker.h ../../extra/tweeter.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+task.o: ../../utils/task.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../utils/task.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+tinygl.o: ../../utils/tinygl.c ../../drivers/avr/system.h ../../drivers/display.h ../../utils/font.h ../../utils/tinygl.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create output file (executable) from object files.
+jukebox1.out: jukebox1.o pio.o system.o timer.o display.o led.o ledmat.o navswitch.o mmelody.o ticker.o tweeter.o font.o task.o tinygl.o
+ $(CC) $(CFLAGS) $^ -o $@ -lm
+ $(SIZE) $@
+
+
+# Create hex file for programming from executable file.
+jukebox1.hex: jukebox1.out
+ $(OBJCOPY) -O ihex jukebox1.out jukebox1.hex
+
+
+# Target: clean project.
+.PHONY: clean
+clean:
+ -$(DEL) *.o *.out *.hex
+
+
+# Target: program project.
+.PHONY: program
+program: jukebox1.hex
+ dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash jukebox1.hex; dfu-programmer atmega32u2 start
+
+
diff --git a/apps/jukebox1/Makefile.test b/apps/jukebox1/Makefile.test
new file mode 100644
index 0000000..6da8408
--- /dev/null
+++ b/apps/jukebox1/Makefile.test
@@ -0,0 +1,76 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for jukebox1
+
+CC = gcc
+CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../extra -I../../fonts -I../../utils
+
+DEL = rm
+
+
+# Default target.
+all: jukebox1
+
+
+# Compile: create object files from C source files.
+jukebox1-test.o: jukebox1.c ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h ../../drivers/test/timer.h ../../extra/mmelody.h ../../extra/ticker.h ../../extra/tweeter.h ../../fonts/font3x5_1.h ../../utils/font.h ../../utils/task.h ../../utils/tinygl.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+display-test.o: ../../drivers/display.c ../../drivers/display.h ../../drivers/ledmat.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+led-test.o: ../../drivers/led.c ../../drivers/led.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+ledmat-test.o: ../../drivers/ledmat.c ../../drivers/ledmat.h ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+navswitch-test.o: ../../drivers/navswitch.c ../../drivers/navswitch.h ../../drivers/test/avrtest.h ../../drivers/test/delay.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+mgetkey-test.o: ../../drivers/test/mgetkey.c ../../drivers/test/mgetkey.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+pio-test.o: ../../drivers/test/pio.c ../../drivers/test/avrtest.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+system-test.o: ../../drivers/test/system.c ../../drivers/test/avrtest.h ../../drivers/test/mgetkey.h ../../drivers/test/pio.h ../../drivers/test/system.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+timer-test.o: ../../drivers/test/timer.c ../../drivers/test/system.h ../../drivers/test/timer.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+mmelody-test.o: ../../extra/mmelody.c ../../drivers/test/system.h ../../extra/mmelody.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+ticker-test.o: ../../extra/ticker.c
+ $(CC) -c $(CFLAGS) $< -o $@
+
+tweeter-test.o: ../../extra/tweeter.c ../../drivers/test/system.h ../../extra/ticker.h ../../extra/tweeter.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+task-test.o: ../../utils/task.c ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/task.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+tinygl-test.o: ../../utils/tinygl.c ../../drivers/display.h ../../drivers/test/system.h ../../utils/font.h ../../utils/tinygl.h
+ $(CC) -c $(CFLAGS) $< -o $@
+
+
+
+
+# Link: create executable file from object files.
+jukebox1: jukebox1-test.o display-test.o led-test.o ledmat-test.o navswitch-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o mmelody-test.o ticker-test.o tweeter-test.o font-test.o task-test.o tinygl-test.o
+ $(CC) $(CFLAGS) $^ -o $@ -lrt
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) jukebox1 jukebox1-test.o display-test.o led-test.o ledmat-test.o navswitch-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o mmelody-test.o ticker-test.o tweeter-test.o font-test.o task-test.o tinygl-test.o
+
+
+
diff --git a/apps/squeak2/electric.mmel b/apps/jukebox1/are_friends_electric.mmel
similarity index 100%
rename from apps/squeak2/electric.mmel
rename to apps/jukebox1/are_friends_electric.mmel
diff --git a/apps/jukebox1/doc/Makefile b/apps/jukebox1/doc/Makefile
new file mode 100644
index 0000000..eb29a6d
--- /dev/null
+++ b/apps/jukebox1/doc/Makefile
@@ -0,0 +1,45 @@
+# File: Makefile
+# Author: M. P. Hayes, UCECE
+# Date: 11 Sep 2010
+# Descr: Makefile for squeak4 docs
+
+# The scripts used to make the graphs require the program dot; this
+# is part of the graphviz package.
+
+DEL = rm
+
+all: file_dependencies.pdf module_dependencies.pdf makefile_dependencies.pdf build_dependencies.pdf callgraph.pdf
+
+file_dependencies.pdf: files.d
+ ../../../etc/graphdeps.py $< --out $@
+
+module_dependencies.pdf: modules.d
+ ../../../etc/graphdeps.py $< --modules --rotate --out $@
+
+makefile_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@
+
+build_dependencies.pdf: ../Makefile
+ ../../../etc/graphdeps.py $< --out $@ --showops
+
+callgraph.pdf: callgraph.d
+ ../../../etc/graphdeps.py --calls --modules $< --out $@ --showops
+
+
+files.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --files . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/files.d)
+
+
+modules.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --relpath --modules . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system > doc/modules.d)
+
+
+callgraph.d: ../Makefile
+ (cd ..; ../../etc/makemake.py --cc="avr-gcc" --cflags="-Os -mmcu=atmega32u2" --relpath --calls . . ../../drivers ../../drivers/avr ../../utils ../../extra --exclude system.h > doc/callgraph.d)
+
+
+# Clean: delete derived files.
+.PHONY: clean
+clean:
+ -$(DEL) *.d *.pdf
+
diff --git a/apps/jukebox1/doc/README b/apps/jukebox1/doc/README
new file mode 100644
index 0000000..39a9712
--- /dev/null
+++ b/apps/jukebox1/doc/README
@@ -0,0 +1,16 @@
+Running make in this directory will generate a number of PDF graphs.
+In the callgraph, the arrows means "calls". In the dependency graphs,
+the arrows means "requires" (or "depends upon").
+
+callgraph.pdf This shows the callgraph, i.e., what functions each
+ function in the program calls.
+module_dependencies.pdf This shows the dependencies between the modules.
+file_dependencies.pdf This shows the dependencies between the files.
+makefile_dependencies.pdf This shows the dependencies required by make when
+ building the program.
+build_dependencies.pdf This is like makefile_dependencies.pdf but shows
+ the operations performed to generate the new file.
+
+callgraph.d This shows the callgraph in text format.
+files.d This shows the file dependencies in text format.
+modules.d This shows the module dependencies in text format.
diff --git a/apps/jukebox1/imperial_march.mmel b/apps/jukebox1/imperial_march.mmel
new file mode 100644
index 0000000..6c4b789
--- /dev/null
+++ b/apps/jukebox1/imperial_march.mmel
@@ -0,0 +1 @@
+"*832 ///D+///D+///D+///D#+//A#F#///D#//A#G/// ///"
diff --git a/apps/jukebox1/jukebox1.c b/apps/jukebox1/jukebox1.c
new file mode 100644
index 0000000..44c4544
--- /dev/null
+++ b/apps/jukebox1/jukebox1.c
@@ -0,0 +1,178 @@
+/** @file jukebox1.c
+ @author M.P. Hayes
+ @date 30 Aug 2013
+
+ @note The fidelity of the notes is poor due to jitter
+ produced by the display task.
+ @note The tunes are stored in RAM. Adding more tunes can cause
+ a subtle memory overflow and the program will fail. A solution
+ would be to store the tunes in flash memory but this requires
+ some jiggery-pokery due to the Harvard architecture of the AVR.
+*/
+
+#include "system.h"
+#include "navswitch.h"
+#include "led.h"
+#include "pio.h"
+#include "task.h"
+#include "tweeter.h"
+#include "mmelody.h"
+#include "tinygl.h"
+#include "../fonts/font3x5_1.h"
+
+
+/* Connect piezo tweeter to pins 6 and 8 of UCFK4 P1 connector
+ for push-pull operation. */
+#define PIEZO1_PIO PIO_DEFINE (PORT_D, 4)
+#define PIEZO2_PIO PIO_DEFINE (PORT_D, 6)
+
+/* Define polling rates in Hz. */
+#define TWEETER_TASK_RATE 20000
+
+#define TUNE_TASK_RATE 200
+
+#define NAVSWITCH_TASK_RATE 10
+
+#define TUNE_BPM_RATE 200
+
+#define LED_TASK_RATE (TUNE_BPM_RATE / 60.0)
+
+#define DISPLAY_TASK_RATE 200
+
+
+static tweeter_scale_t scale_table[] = TWEETER_SCALE_TABLE (TWEETER_TASK_RATE);
+static tweeter_t tweeter;
+static mmelody_t melody;
+static mmelody_obj_t melody_info;
+static tweeter_obj_t tweeter_info;
+static char *note_names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
+
+static const char tune1[] =
+{
+#include "are_friends_electric.mmel"
+};
+
+static const char tune2[] =
+{
+#include "imperial_march.mmel"
+};
+
+
+void
+note_play (tweeter_t tweeter, tweeter_note_t note, uint8_t velocity)
+{
+ tinygl_clear ();
+ if (note != 0 && velocity != 0)
+ tinygl_text (note_names[note % 12]);
+
+ tweeter_note_play (tweeter, note, velocity);
+}
+
+
+static void led_flash_task_init (void)
+{
+ led_init ();
+}
+
+
+static void led_flash_task (__unused__ void *data)
+{
+ static uint8_t state = 0;
+
+ led_set (LED1, state);
+ state = !state;
+}
+
+
+static void tweeter_task_init (void)
+{
+ tweeter = tweeter_init (&tweeter_info, TWEETER_TASK_RATE, scale_table);
+
+ pio_config_set (PIEZO1_PIO, PIO_OUTPUT_LOW);
+ pio_config_set (PIEZO2_PIO, PIO_OUTPUT_HIGH);
+}
+
+
+static void tweeter_task (__unused__ void *data)
+{
+ uint8_t state;
+
+ state = tweeter_update (tweeter);
+ pio_output_set (PIEZO1_PIO, state);
+ pio_output_set (PIEZO2_PIO, !state);
+}
+
+
+static void tune_task_init (void)
+{
+ melody = mmelody_init (&melody_info, TUNE_TASK_RATE,
+ (mmelody_callback_t) note_play, tweeter);
+
+ mmelody_speed_set (melody, TUNE_BPM_RATE);
+}
+
+
+static void tune_task (__unused__ void *data)
+{
+ mmelody_update (melody);
+}
+
+
+static void navswitch_task_init (void)
+{
+ navswitch_init ();
+}
+
+
+static void navswitch_task (__unused__ void *data)
+{
+ navswitch_update ();
+
+ if (navswitch_push_event_p (NAVSWITCH_PUSH))
+ {
+ mmelody_play (melody, 0);
+ }
+ if (navswitch_push_event_p (NAVSWITCH_NORTH))
+ mmelody_play (melody, tune1);
+ if (navswitch_push_event_p (NAVSWITCH_SOUTH))
+ mmelody_play (melody, tune2);
+}
+
+
+static void display_task_init (void)
+{
+ tinygl_init (DISPLAY_TASK_RATE);
+ tinygl_font_set (&font3x5_1);
+ tinygl_text_mode_set (TINYGL_TEXT_MODE_STEP);
+ tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);
+}
+
+
+static void display_task (__unused__ void *data)
+{
+ tinygl_update ();
+}
+
+
+int main (void)
+{
+ task_t tasks[] =
+ {
+ {.func = tweeter_task, .period = TASK_RATE / TWEETER_TASK_RATE, .data = 0},
+ {.func = led_flash_task, .period = TASK_RATE / LED_TASK_RATE, .data = 0},
+ {.func = tune_task, .period = TASK_RATE / TUNE_TASK_RATE, .data = 0},
+ {.func = display_task, .period = TASK_RATE / DISPLAY_TASK_RATE, .data = 0},
+ {.func = navswitch_task, .period = TASK_RATE / NAVSWITCH_TASK_RATE, .data = 0},
+ };
+
+ system_init ();
+
+ led_flash_task_init ();
+ tweeter_task_init ();
+ tune_task_init ();
+ display_task_init ();
+ navswitch_task_init ();
+
+ task_schedule (tasks, ARRAY_SIZE (tasks));
+ return 0;
+}
diff --git a/apps/jukebox1/temple_of_love.mmel b/apps/jukebox1/temple_of_love.mmel
new file mode 100644
index 0000000..2dd9344
--- /dev/null
+++ b/apps/jukebox1/temple_of_love.mmel
@@ -0,0 +1,3 @@
+/* E2, D4 */
+"*8E3EBBE2EB3BDDAAD4DA3AA2AE3EAABBC4CB3BAAGGEEBBE2EB3BDDAAD4DA3AA2AE3EAABBC4CB3BAABB"
+
diff --git a/apps/squeak4/electric.mmel b/apps/squeak2/are_friends_electric.mmel
similarity index 100%
rename from apps/squeak4/electric.mmel
rename to apps/squeak2/are_friends_electric.mmel
diff --git a/apps/squeak2/squeak2.c b/apps/squeak2/squeak2.c
index c7ca094..5943a1a 100644
--- a/apps/squeak2/squeak2.c
+++ b/apps/squeak2/squeak2.c
@@ -37,7 +37,7 @@ static tweeter_obj_t tweeter_info;
static const char tune1[] =
{
//#include "mysterex.mmel"
-#include "electric.mmel"
+#include "are_friends_electric.mmel"
" >"
};
diff --git a/apps/squeak4/are_friends_electric.mmel b/apps/squeak4/are_friends_electric.mmel
new file mode 100644
index 0000000..163e3fe
--- /dev/null
+++ b/apps/squeak4/are_friends_electric.mmel
@@ -0,0 +1 @@
+"626263GD4GF/DFE/6262CCG/A#2A#F3/CCG/A#2A#A#4E262GD4GFDFE3C3GA#2F3CGA#2A#3AA#AFD#"
diff --git a/apps/squeak4/squeak4.c b/apps/squeak4/squeak4.c
index e4636de..fb34861 100644
--- a/apps/squeak4/squeak4.c
+++ b/apps/squeak4/squeak4.c
@@ -14,8 +14,10 @@
#include "../fonts/font3x5_1.h"
-/* Connect piezo tweeter to outermost pins of UCFK4 P1 connector. */
-#define PIEZO_PIO PIO_DEFINE (PORT_D, 6)
+/* Connect piezo tweeter to pins 6 and 8 of UCFK4 P1 connector
+ for push-pull operation. This gives increased volume. */
+#define PIEZO1_PIO PIO_DEFINE (PORT_D, 4)
+#define PIEZO2_PIO PIO_DEFINE (PORT_D, 6)
/* Define polling rates in Hz. */
#define TWEETER_TASK_RATE 20000
@@ -41,7 +43,7 @@ static char *note_names[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A
static const char tune1[] =
{
//#include "mysterex.mmel"
-#include "electric.mmel"
+#include "are_friends_electric.mmel"
" >"
};
@@ -76,13 +78,18 @@ static void tweeter_task_init (void)
{
tweeter = tweeter_init (&tweeter_info, TWEETER_TASK_RATE, scale_table);
- pio_config_set (PIEZO_PIO, PIO_OUTPUT_LOW);
+ pio_config_set (PIEZO1_PIO, PIO_OUTPUT_LOW);
+ pio_config_set (PIEZO2_PIO, PIO_OUTPUT_HIGH);
}
static void tweeter_task (__unused__ void *data)
{
- pio_output_set (PIEZO_PIO, tweeter_update (tweeter));
+ uint8_t state;
+
+ state = tweeter_update (tweeter);
+ pio_output_set (PIEZO1_PIO, state);
+ pio_output_set (PIEZO2_PIO, !state);
}
diff --git a/drivers/avr/pio.h b/drivers/avr/pio.h
index e84355b..e9c13f1 100644
--- a/drivers/avr/pio.h
+++ b/drivers/avr/pio.h
@@ -97,6 +97,44 @@ typedef enum pio_config_enum
} pio_config_t;
+/** Define the pins. */
+#define PA0_PIO PIO_DEFINE(PORT_A, 0)
+#define PA1_PIO PIO_DEFINE(PORT_A, 1)
+#define PA2_PIO PIO_DEFINE(PORT_A, 2)
+#define PA3_PIO PIO_DEFINE(PORT_A, 3)
+#define PA4_PIO PIO_DEFINE(PORT_A, 4)
+#define PA5_PIO PIO_DEFINE(PORT_A, 5)
+#define PA6_PIO PIO_DEFINE(PORT_A, 6)
+#define PA7_PIO PIO_DEFINE(PORT_A, 7)
+
+#define PB0_PIO PIO_DEFINE(PORT_B, 0)
+#define PB1_PIO PIO_DEFINE(PORT_B, 1)
+#define PB2_PIO PIO_DEFINE(PORT_B, 2)
+#define PB3_PIO PIO_DEFINE(PORT_B, 3)
+#define PB4_PIO PIO_DEFINE(PORT_B, 4)
+#define PB5_PIO PIO_DEFINE(PORT_B, 5)
+#define PB6_PIO PIO_DEFINE(PORT_B, 6)
+#define PB7_PIO PIO_DEFINE(PORT_B, 7)
+
+#define PC0_PIO PIO_DEFINE(PORT_C, 0)
+#define PC1_PIO PIO_DEFINE(PORT_C, 1)
+#define PC2_PIO PIO_DEFINE(PORT_C, 2)
+#define PC3_PIO PIO_DEFINE(PORT_C, 3)
+#define PC4_PIO PIO_DEFINE(PORT_C, 4)
+#define PC5_PIO PIO_DEFINE(PORT_C, 5)
+#define PC6_PIO PIO_DEFINE(PORT_C, 6)
+#define PC7_PIO PIO_DEFINE(PORT_C, 7)
+
+#define PD0_PIO PIO_DEFINE(PORT_D, 0)
+#define PD1_PIO PIO_DEFINE(PORT_D, 1)
+#define PD2_PIO PIO_DEFINE(PORT_D, 2)
+#define PD3_PIO PIO_DEFINE(PORT_D, 3)
+#define PD4_PIO PIO_DEFINE(PORT_D, 4)
+#define PD5_PIO PIO_DEFINE(PORT_D, 5)
+#define PD6_PIO PIO_DEFINE(PORT_D, 6)
+#define PD7_PIO PIO_DEFINE(PORT_D, 7)
+
+
#ifdef DEBUG
/* Define PIO as a unique integer. */
diff --git a/drivers/avr/system.h b/drivers/avr/system.h
index 7afbebf..aa5eb50 100644
--- a/drivers/avr/system.h
+++ b/drivers/avr/system.h
@@ -51,6 +51,7 @@ typedef uint8_t bool;
/* Navswitch. */
#define NAVSWITCH_PUSH_PIO LEDMAT_COL3_PIO
+#define NAVSWITCH_DOWN_PIO NAVSWITCH_PUSH_PIO
#define NAVSWITCH_EAST_PIO LEDMAT_COL1_PIO
#define NAVSWITCH_WEST_PIO LEDMAT_COL2_PIO
#define NAVSWITCH_NORTH_PIO LEDMAT_COL4_PIO
diff --git a/etc/Makefile b/etc/Makefile
index 53bf366..472481a 100644
--- a/etc/Makefile
+++ b/etc/Makefile
@@ -13,7 +13,7 @@ APPDIRS = $(filter-out ../apps/README ../Makefile, $(wildcard ../apps/*/ ))
DOCDIRS = $(addsuffix /doc, $(APPDIRS))
# Don't link against test-scaffold if directly accessing harware
-FOO = $(shell grep -l "\" ../lab*/*/*.c)
+FOO = $(shell grep -l "\" ../*/*/*.c)
DUDDIRS = $(foreach filename, $(FOO), $(dir $(filename)))
TESTDIRS = $(filter-out $(DUDDIRS), $(APPDIRS))
diff --git a/etc/makemake.py b/etc/makemake.py
index 38be860..977811f 100755
--- a/etc/makemake.py
+++ b/etc/makemake.py
@@ -237,18 +237,25 @@ def makefile_print (options, template, maincfilename, filedeps,
print text
-def maincfilename_find (dirname):
+def subprocess_command(command):
- p = subprocess.Popen (['grep -l "main[ ]*(" ' + dirname + '/*.c'],
- shell = True, stdin = subprocess.PIPE,
- stdout = subprocess.PIPE,
- close_fds = True)
+ p = subprocess.Popen (command, shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ close_fds=True)
(child_stdout, child_stdin) = (p.stdout, p.stdin)
child_stdin.close ()
- files = child_stdout.read ()
+ response = child_stdout.read ()
child_stdout.close ()
+ return response
+
+
+def maincfilename_find (dirname):
+
+ files = subprocess_command('grep -l "main[ ]*(" ' + dirname + '/*.c')
+
filelist = files.strip ().split (' ')
if not filelist:
return None
@@ -265,7 +272,14 @@ def functions_find (filepath, functiondeps, functions, options):
print >> sys.stderr, command
os.system (command)
- rtlfilename = os.path.abspath (os.path.basename (filepath)) + '.012t.cfg'
+ version = subprocess_command(options.compile + ' -dumpversion')
+ version_parts = version.split('.')
+ if version_parts[0] >= '5':
+ ext = '.014t.cfg'
+ else:
+ ext = '.012t.cfg'
+
+ rtlfilename = os.path.abspath (os.path.basename (filepath)) + ext
if not os.path.exists (rtlfilename):
return