Merge branch 'master' of eng-git.canterbury.ac.nz:mph/ucfk4

main
Michael Hayes 12 years ago
commit 4e61c5c570

@ -0,0 +1,71 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for gobble1
# 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: gobble1.out
# Compile: create object files from C source files.
gobble1.o: gobble1.c ../../drivers/avr/system.h ../../drivers/display.h ../../utils/font.h ../../utils/pacer.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 $@
ledmat.o: ../../drivers/ledmat.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/ledmat.h
$(CC) -c $(CFLAGS) $< -o $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
gobble1.out: gobble1.o pio.o system.o timer.o display.o ledmat.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
gobble1.hex: gobble1.out
$(OBJCOPY) -O ihex gobble1.out gobble1.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: gobble1.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash gobble1.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,61 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for gobble1
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: gobble1
# Compile: create object files from C source files.
gobble1-test.o: gobble1.c ../../drivers/display.h ../../drivers/test/system.h ../../utils/font.h ../../utils/pacer.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 $@
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 $@
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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
gobble1: gobble1-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) gobble1 gobble1-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,156 @@
/** @file gobble1.c
@author M.P. Hayes
@date 28 Sep 2013
@brief
*/
#include <stdlib.h>
#include "system.h"
#include "pacer.h"
#include "tinygl.h"
/* Number of initial objects. */
#define NUM_MONSTERS 6
#define LOOP_RATE 300
#define MOVE_RATE 10
typedef struct monster_struct
{
tinygl_point_t pos;
bool alive;
} monster_t;
static int8_t monster_find (monster_t *monsters, uint8_t num,
uint8_t x, uint8_t y)
{
uint8_t i;
for (i = 0; i < num; i++)
{
if (monsters[i].pos.x == x
&& monsters[i].pos.y == y
&& monsters[i].alive)
return i;
}
return -1;
}
static int8_t monster_choose (monster_t *monsters, uint8_t num)
{
while (1)
{
int8_t this;
this = rand () % num;
if (monsters[this].alive)
return this;
}
}
static void monster_move (monster_t *monsters, uint8_t num)
{
uint8_t x;
uint8_t y;
uint8_t this;
this = monster_choose (monsters, num);
tinygl_draw_point (monsters[this].pos, 0);
x = monsters[this].pos.x;
y = monsters[this].pos.y;
while (1)
{
int8_t dx;
int8_t dy;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
if ((dx || dy)
&& x + dx >= 0 && x + dx < TINYGL_WIDTH
&& y + dy >= 0 && y + dy < TINYGL_HEIGHT)
{
int8_t other;
other = monster_find (monsters, num, x + dx, y + dy);
if (other != -1)
monsters[other].alive = 0;
monsters[this].pos.x = x + dx;
monsters[this].pos.y = y + dy;
tinygl_draw_point (monsters[this].pos, 1);
return;
}
}
}
static void monsters_create (monster_t *monsters, uint8_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
uint8_t x;
uint8_t y;
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (monster_find (monsters, i, x, y) != -1);
monsters[i].pos.x = x;
monsters[i].pos.y = y;
monsters[i].alive = 1;
tinygl_draw_point (things[i].pos, 1);
}
}
int main (void)
{
uint16_t tick = 0;
monster_t monsters[NUM_MONSTERS];
system_init ();
tinygl_init (LOOP_RATE);
pacer_init (LOOP_RATE);
monsters_create (monsters, NUM_MONSTERS);
while (1)
{
uint8_t col;
/* Refresh monsters. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
tick++;
if (tick >= LOOP_RATE / MOVE_RATE)
{
tick = 0;
monster_move (monsters, NUM_MONSTERS);
}
}
return 0;
}

@ -0,0 +1,71 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for gobble1
# 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: gobble1.out
# Compile: create object files from C source files.
gobble1.o: gobble1.c ../../drivers/avr/system.h ../../drivers/display.h ../../utils/font.h ../../utils/pacer.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 $@
ledmat.o: ../../drivers/ledmat.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/ledmat.h
$(CC) -c $(CFLAGS) $< -o $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
gobble1.out: gobble1.o pio.o system.o timer.o display.o ledmat.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
gobble1.hex: gobble1.out
$(OBJCOPY) -O ihex gobble1.out gobble1.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: gobble1.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash gobble1.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,61 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for gobble1
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: gobble1
# Compile: create object files from C source files.
gobble1-test.o: gobble1.c ../../drivers/display.h ../../drivers/test/system.h ../../utils/font.h ../../utils/pacer.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 $@
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 $@
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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
gobble1: gobble1-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) gobble1 gobble1-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,157 @@
/** @file gobble2.c
@author M.P. Hayes
@date 28 Sep 2013
@brief
*/
#include <stdlib.h>
#include "system.h"
#include "pacer.h"
#include "tinygl.h"
/* Number of initial objects. */
#define NUM_MONSTERS 6
#define LOOP_RATE 300
#define MOVE_RATE 10
typedef struct monster_struct
{
tinygl_point_t pos;
bool alive;
} monster_t;
static int8_t monster_find (monster_t *monsters, uint8_t num,
uint8_t x, uint8_t y)
{
uint8_t i;
for (i = 0; i < num; i++)
{
if (monsters[i].pos.x == x
&& monsters[i].pos.y == y
&& monsters[i].alive)
return i;
}
return -1;
}
static int8_t monster_choose (monster_t *monsters, uint8_t num)
{
while (1)
{
int8_t this;
this = rand () % num;
if (monsters[this].alive)
return this;
}
}
static void monster_move (monster_t *monsters, uint8_t num)
{
uint8_t x;
uint8_t y;
uint8_t this;
this = monster_choose (monsters, num);
tinygl_draw_point (monsters[this].pos, 0);
x = monsters[this].pos.x;
y = monsters[this].pos.y;
while (1)
{
int8_t dx[] = {
int8_t dx;
int8_t dy;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
if ((dx || dy)
&& x + dx >= 0 && x + dx < TINYGL_WIDTH
&& y + dy >= 0 && y + dy < TINYGL_HEIGHT)
{
int8_t other;
other = monster_find (monsters, num, x + dx, y + dy);
if (other != -1)
monsters[other].alive = 0;
monsters[this].pos.x = x + dx;
monsters[this].pos.y = y + dy;
tinygl_draw_point (monsters[this].pos, 1);
return;
}
}
}
static void monsters_create (monster_t *monsters, uint8_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
uint8_t x;
uint8_t y;
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (monster_find (monsters, i, x, y) != -1);
monsters[i].pos.x = x;
monsters[i].pos.y = y;
monsters[i].alive = 1;
tinygl_draw_point (tinygl_point (x, y), 1);
}
}
int main (void)
{
uint16_t tick = 0;
uint8_t col;
monster_t monsters[NUM_MONSTERS];
system_init ();
tinygl_init (LOOP_RATE);
pacer_init (LOOP_RATE);
monsters_create (monsters, NUM_MONSTERS);
while (1)
{
/* Refresh monsters. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
tick++;
if (tick >= LOOP_RATE / MOVE_RATE)
{
tick = 0;
monster_move (monsters, NUM_MONSTERS);
}
}
return 0;
}

@ -0,0 +1,77 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for gobble4
# 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: gobble4.out
# Compile: create object files from C source files.
gobble4.o: gobble4.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../drivers/button.h ../../drivers/display.h ../../drivers/led.h ../../utils/font.h ../../utils/pacer.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 $@
button.o: ../../drivers/button.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/button.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 $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
gobble4.out: gobble4.o pio.o system.o timer.o button.o display.o led.o ledmat.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
gobble4.hex: gobble4.out
$(OBJCOPY) -O ihex gobble4.out gobble4.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: gobble4.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash gobble4.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,67 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for gobble4
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: gobble4
# Compile: create object files from C source files.
gobble4-test.o: gobble4.c ../../drivers/button.h ../../drivers/display.h ../../drivers/led.h ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/font.h ../../utils/pacer.h ../../utils/tinygl.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 $@
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 $@
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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
gobble4: gobble4-test.o button-test.o display-test.o led-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) gobble4 gobble4-test.o button-test.o display-test.o led-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,270 @@
/** @file gobble4.c
@author M.P. Hayes
@date 28 Sep 2013
@brief
*/
#include <stdlib.h>
#include "system.h"
#include "pacer.h"
#include "button.h"
#include "led.h"
#include "timer.h"
#include "tinygl.h"
/* Number of initial objects. */
#define NUM_THINGS 6
#define LOOP_RATE 300
#define MOVE_RATE 5
typedef struct thing_struct
{
tinygl_point_t pos;
bool alive;
} thing_t;
static int8_t thing_find (thing_t *things, uint8_t num, tinygl_point_t pos)
{
uint8_t i;
for (i = 0; i < num; i++)
{
if (things[i].pos.x == pos.x
&& things[i].pos.y == pos.y
&& things[i].alive)
return i;
}
return -1;
}
static uint8_t thing_distance_squared (thing_t *things, uint8_t this)
{
int8_t dx;
int8_t dy;
dx = things[this].pos.x - things[0].pos.x;
dy = things[this].pos.y - things[0].pos.y;
return dx * dx + dy * dy;
}
static int8_t thing_closest (thing_t *things, uint8_t num)
{
uint8_t i;
uint8_t which = 0;
uint8_t distsq = ~0;
for (i = 1; i < num; i++)
{
uint8_t distsq2;
if (!things[i].alive)
continue;
distsq2 = thing_distance_squared (things, i);
if (distsq2 < distsq)
{
distsq = distsq2;
which = i;
}
}
return which;
}
static void monster_move (thing_t *things, uint8_t num)
{
uint8_t x;
uint8_t y;
uint8_t closest;
int8_t other;
int8_t dx;
int8_t dy;
closest = thing_closest (things, num);
/* closest == 0 then no things left but the monster! */
x = things[0].pos.x;
y = things[0].pos.y;
dx = things[closest].pos.x - x;
dy = things[closest].pos.y - y;
while (dx / 2)
dx = dx / 2;
while (dy / 2)
dy = dy / 2;
other = thing_find (things, num, tinygl_point (x + dx, y + dy));
if (other != -1)
things[other].alive = 0;
tinygl_draw_point (things[0].pos, 0);
things[0].pos.x += dx;
things[0].pos.y += dy;
tinygl_draw_point (things[0].pos, 1);
}
uint8_t bounds_p (tinygl_point_t pos)
{
return pos.x >= 0 && pos.x < TINYGL_WIDTH
&& pos.y >= 0 && pos.y < TINYGL_HEIGHT;
}
static void thing_move (thing_t *things, uint8_t num, uint8_t this)
{
uint8_t i;
uint8_t distsq;
tinygl_point_t pos;
tinygl_draw_point (things[this].pos, 0);
distsq = thing_distance_squared (things, this);
pos = things[this].pos;
for (i = 0; i < 12; i++)
{
int8_t dx;
int8_t dy;
tinygl_point_t newpos;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
newpos = tinygl_point (pos.x + dx, pos.y + dy);
/* Check for a valid position. */
if ((dx || dy)
&& (! bounds_p (newpos) || thing_find (things, num, newpos) != -1))
continue;
/* Try new position. */
things[this].pos = newpos;
if (thing_distance_squared (things, this) > distsq)
break;
}
/* Stay put if cannot find better position. */
if (i == 12)
things[this].pos = pos;
tinygl_draw_point (things[this].pos, 1);
}
static void things_move (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 1; i < num; i++)
if (things[i].alive)
thing_move (things, num, i);
}
static void things_create (thing_t *things, uint8_t num)
{
uint8_t i;
things[0].pos.x = 0;
things[0].pos.y = 0;
things[0].alive = 1;
tinygl_draw_point (things[0].pos, 1);
for (i = 1; i < num; i++)
{
uint8_t x;
uint8_t y;
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (thing_find (things, i, tinygl_point (x, y)) != -1);
things[i].pos.x = x;
things[i].pos.y = y;
things[i].alive = 1;
tinygl_draw_point (things[i].pos, 1);
}
}
static void things_erase (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
tinygl_draw_point (things[i].pos, 0);
}
}
int main (void)
{
uint16_t tick = 0;
uint8_t running = 0;
thing_t things[NUM_THINGS];
system_init ();
button_init ();
led_init ();
led_set (LED1, 0);
tinygl_init (LOOP_RATE);
pacer_init (LOOP_RATE);
while (1)
{
uint8_t col;
/* Refresh things. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
tick++;
if (tick >= LOOP_RATE / MOVE_RATE)
{
tick = 0;
button_update ();
if (button_push_event_p (BUTTON1))
{
srand (timer_get ());
running = ! running;
led_set (LED1, running);
}
if (running)
{
things_move (things, NUM_THINGS);
monster_move (things, NUM_THINGS);
}
else
{
things_erase (things, NUM_THINGS);
things_create (things, NUM_THINGS);
}
}
}
return 0;
}

@ -0,0 +1,77 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for gobble5
# 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: gobble5.out
# Compile: create object files from C source files.
gobble5.o: gobble5.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../utils/font.h ../../utils/pacer.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 $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
gobble5.out: gobble5.o pio.o system.o timer.o display.o led.o ledmat.o navswitch.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
gobble5.hex: gobble5.out
$(OBJCOPY) -O ihex gobble5.out gobble5.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: gobble5.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash gobble5.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,67 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for gobble5
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: gobble5
# Compile: create object files from C source files.
gobble5-test.o: gobble5.c ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/font.h ../../utils/pacer.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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
gobble5: gobble5-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 font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) gobble5 gobble5-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 font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,249 @@
/** @file gobble5.c
@author M.P. Hayes
@date 29 Sep 2013
@brief
*/
#include <stdlib.h>
#include "system.h"
#include "pacer.h"
#include "navswitch.h"
#include "led.h"
#include "timer.h"
#include "tinygl.h"
/* Number of initial objects. */
#define NUM_THINGS 6
#define LOOP_RATE 300
#define MOVE_RATE 20
#define NAVSWITCH_RATE 50
typedef struct thing_struct
{
tinygl_point_t pos;
bool alive;
} thing_t;
static int8_t thing_find (thing_t *things, uint8_t num, tinygl_point_t pos)
{
uint8_t i;
for (i = 0; i < num; i++)
{
if (things[i].pos.x == pos.x
&& things[i].pos.y == pos.y
&& things[i].alive)
return i;
}
return -1;
}
static uint8_t thing_distance_squared (thing_t *things, uint8_t this)
{
int8_t dx;
int8_t dy;
dx = things[this].pos.x - things[0].pos.x;
dy = things[this].pos.y - things[0].pos.y;
return dx * dx + dy * dy;
}
static uint8_t bounds_p (tinygl_point_t pos)
{
return pos.x >= 0 && pos.x < TINYGL_WIDTH
&& pos.y >= 0 && pos.y < TINYGL_HEIGHT;
}
static void monster_move (thing_t *things, uint8_t num, int8_t dx, int8_t dy)
{
int8_t other;
tinygl_point_t newpos;
newpos = tinygl_point (things[0].pos.x + dx, things[0].pos.y + dy);
if (!bounds_p (newpos))
return;
other = thing_find (things, num, newpos);
if (other != -1)
things[other].alive = 0;
tinygl_draw_point (things[0].pos, 0);
things[0].pos = newpos;
tinygl_draw_point (newpos, 1);
}
static void thing_move (thing_t *things, uint8_t num, uint8_t this)
{
uint8_t i;
uint8_t distsq;
tinygl_point_t pos;
tinygl_draw_point (things[this].pos, 0);
distsq = thing_distance_squared (things, this);
pos = things[this].pos;
for (i = 0; i < 12; i++)
{
int8_t dx;
int8_t dy;
tinygl_point_t newpos;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
newpos = tinygl_point (pos.x + dx, pos.y + dy);
/* Check for a valid position. */
if ((dx || dy)
&& (! bounds_p (newpos) || thing_find (things, num, newpos) != -1))
continue;
/* Try new position. */
things[this].pos = newpos;
if (thing_distance_squared (things, this) > distsq)
break;
}
/* Stay put if cannot find better position. */
if (i == 12)
things[this].pos = pos;
tinygl_draw_point (things[this].pos, 1);
}
static void things_move (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 1; i < num; i++)
if (things[i].alive)
thing_move (things, num, i);
}
static void things_create (thing_t *things, uint8_t num)
{
uint8_t i;
things[0].pos.x = 0;
things[0].pos.y = 0;
things[0].alive = 1;
tinygl_draw_point (things[0].pos, 1);
for (i = 1; i < num; i++)
{
uint8_t x;
uint8_t y;
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (thing_find (things, i, tinygl_point (x, y)) != -1);
things[i].pos.x = x;
things[i].pos.y = y;
things[i].alive = 1;
tinygl_draw_point (things[i].pos, 1);
}
}
static void things_erase (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
tinygl_draw_point (things[i].pos, 0);
}
}
int main (void)
{
uint16_t tick = 0;
uint16_t navswitch_tick = 0;
uint8_t running = 0;
thing_t things[NUM_THINGS];
system_init ();
navswitch_init ();
led_init ();
led_set (LED1, 0);
tinygl_init (LOOP_RATE);
pacer_init (LOOP_RATE);
while (1)
{
uint8_t col;
/* Refresh things. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
navswitch_tick++;
if (navswitch_tick >= LOOP_RATE / NAVSWITCH_RATE)
{
navswitch_tick = 0;
navswitch_update ();
if (navswitch_push_event_p (NAVSWITCH_PUSH))
{
srand (timer_get ());
running = ! running;
led_set (LED1, running);
}
if (running)
{
if (navswitch_push_event_p (NAVSWITCH_NORTH))
monster_move (things, NUM_THINGS, 0, -1);
if (navswitch_push_event_p (NAVSWITCH_SOUTH))
monster_move (things, NUM_THINGS, 0, 1);
if (navswitch_push_event_p (NAVSWITCH_EAST))
monster_move (things, NUM_THINGS, 1, 0);
if (navswitch_push_event_p (NAVSWITCH_WEST))
monster_move (things, NUM_THINGS, -1, 0);
}
}
tick++;
if (tick >= LOOP_RATE / MOVE_RATE)
{
tick = 0;
if (running)
{
things_move (things, NUM_THINGS);
}
else
{
things_erase (things, NUM_THINGS);
things_create (things, NUM_THINGS);
}
}
}
return 0;
}

@ -0,0 +1,77 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for gobble6
# 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: gobble6.out
# Compile: create object files from C source files.
gobble6.o: gobble6.c ../../drivers/avr/system.h ../../drivers/avr/timer.h ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../utils/font.h ../../utils/pacer.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 $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
gobble6.out: gobble6.o pio.o system.o timer.o display.o led.o ledmat.o navswitch.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
gobble6.hex: gobble6.out
$(OBJCOPY) -O ihex gobble6.out gobble6.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: gobble6.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash gobble6.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,67 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for gobble6
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: gobble6
# Compile: create object files from C source files.
gobble6-test.o: gobble6.c ../../drivers/display.h ../../drivers/led.h ../../drivers/navswitch.h ../../drivers/test/system.h ../../drivers/test/timer.h ../../utils/font.h ../../utils/pacer.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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
gobble6: gobble6-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 font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) gobble6 gobble6-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 font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,287 @@
/** @file gobble6.c
@author M.P. Hayes
@date 29 Sep 2013
@brief
*/
#include <stdlib.h>
#include <stdio.h>
#include "system.h"
#include "pacer.h"
#include "navswitch.h"
#include "led.h"
#include "timer.h"
#include "tinygl.h"
#include "../fonts/font3x5_1.h"
/* Number of initial objects. */
#define NUM_THINGS 6
#define LOOP_RATE 200
#define MOVE_RATE 25
#define NAVSWITCH_RATE 50
#define SAFE_DISTANCE 3
#define ANXIETY_LEVEL 2
#define PANIC_LEVEL 50
typedef struct thing_struct
{
tinygl_point_t pos;
uint8_t anxiety;
bool alive;
} thing_t;
static int8_t things_killed_p (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 1; i < num; i++)
{
if (things[i].alive)
return 0;
}
return 1;
}
static int8_t thing_find (thing_t *things, uint8_t num, tinygl_point_t pos)
{
uint8_t i;
for (i = 0; i < num; i++)
{
if (things[i].pos.x == pos.x
&& things[i].pos.y == pos.y
&& things[i].alive)
return i;
}
return -1;
}
static uint8_t thing_distance_squared (thing_t *things, uint8_t this)
{
int8_t dx;
int8_t dy;
dx = things[this].pos.x - things[0].pos.x;
dy = things[this].pos.y - things[0].pos.y;
return dx * dx + dy * dy;
}
static uint8_t bounds_p (tinygl_point_t pos)
{
return pos.x >= 0 && pos.x < TINYGL_WIDTH
&& pos.y >= 0 && pos.y < TINYGL_HEIGHT;
}
static void monster_move (thing_t *things, uint8_t num, int8_t dx, int8_t dy)
{
int8_t other;
tinygl_point_t newpos;
newpos = tinygl_point (things[0].pos.x + dx, things[0].pos.y + dy);
if (!bounds_p (newpos))
return;
other = thing_find (things, num, newpos);
if (other != -1)
things[other].alive = 0;
tinygl_draw_point (things[0].pos, 0);
things[0].pos = newpos;
tinygl_draw_point (newpos, 1);
}
static void thing_move (thing_t *things, uint8_t num, uint8_t this)
{
uint8_t i;
uint8_t distsq;
uint8_t panic;
tinygl_point_t pos;
tinygl_draw_point (things[this].pos, 0);
distsq = thing_distance_squared (things, this);
pos = things[this].pos;
if (thing_distance_squared (things, this) <= SAFE_DISTANCE * SAFE_DISTANCE)
things[this].anxiety++;
else
things[this].anxiety = 0;
panic = things[this].anxiety > ANXIETY_LEVEL
&& (rand () % 100 > (100 - PANIC_LEVEL));
for (i = 0; i < 12; i++)
{
int8_t dx;
int8_t dy;
tinygl_point_t newpos;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
newpos = tinygl_point (pos.x + dx, pos.y + dy);
/* Check for a valid position. */
if ((dx || dy)
&& (! bounds_p (newpos) || thing_find (things, num, newpos) != -1))
continue;
/* Try new position. */
things[this].pos = newpos;
if (panic || thing_distance_squared (things, this) > distsq)
break;
}
/* Stay put if cannot find better position. */
if (i == 12)
things[this].pos = pos;
tinygl_draw_point (things[this].pos, 1);
}
static void things_move (thing_t *things, uint8_t num)
{
uint8_t i;
for (i = 1; i < num; i++)
if (things[i].alive)
thing_move (things, num, i);
}
static void things_create (thing_t *things, uint8_t num)
{
uint8_t i;
things[0].pos.x = 0;
things[0].pos.y = 0;
things[0].alive = 1;
tinygl_draw_point (things[0].pos, 1);
for (i = 1; i < num; i++)
{
uint8_t x;
uint8_t y;
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (thing_find (things, i, tinygl_point (x, y)) != -1);
things[i].pos.x = x;
things[i].pos.y = y;
things[i].alive = 1;
tinygl_draw_point (things[i].pos, 1);
}
}
int main (void)
{
uint16_t tick = 0;
uint16_t navswitch_tick = 0;
uint8_t running = 0;
int duration = 0;
thing_t things[NUM_THINGS];
system_init ();
navswitch_init ();
led_init ();
led_set (LED1, 0);
tinygl_init (LOOP_RATE);
tinygl_font_set (&font3x5_1);
tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL);
tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);
pacer_init (LOOP_RATE);
tinygl_text ("GOBBLE: PUSH TO START");
while (1)
{
uint8_t col;
/* Refresh things. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
navswitch_tick++;
if (navswitch_tick >= LOOP_RATE / NAVSWITCH_RATE)
{
navswitch_tick = 0;
navswitch_update ();
if (running)
{
duration++;
if (navswitch_push_event_p (NAVSWITCH_NORTH))
monster_move (things, NUM_THINGS, 0, -1);
if (navswitch_push_event_p (NAVSWITCH_SOUTH))
monster_move (things, NUM_THINGS, 0, 1);
if (navswitch_push_event_p (NAVSWITCH_EAST))
monster_move (things, NUM_THINGS, 1, 0);
if (navswitch_push_event_p (NAVSWITCH_WEST))
monster_move (things, NUM_THINGS, -1, 0);
if (navswitch_push_event_p (NAVSWITCH_PUSH))
{
running = 0;
led_set (LED1, running);
}
if (things_killed_p (things, NUM_THINGS))
{
char buffer[6];
running = 0;
led_set (LED1, running);
sprintf (buffer, "%d", duration);
tinygl_text (buffer);
}
}
else
{
if (navswitch_push_event_p (NAVSWITCH_PUSH))
{
srand (timer_get ());
tinygl_clear ();
things_create (things, NUM_THINGS);
running = 1;
duration = 0;
led_set (LED1, running);
}
}
}
tick++;
if (tick >= LOOP_RATE / MOVE_RATE)
{
tick = 0;
if (running)
things_move (things, NUM_THINGS);
}
}
return 0;
}

@ -40,7 +40,7 @@ int main (void)
ticks = 0;
ir_uart_putc ('2');
}
x
tinygl_update ();
}

@ -32,14 +32,13 @@
int main (void)
{
uint16_t twinkle_tick = 0;
uint16_t create_tick = 0;
uint8_t pwm_tick = 0;
uint8_t i;
uint8_t x;
uint8_t y;
uint8_t col;
/* This stores the current luminance level for each pixel. */
uint8_t display[TINYGL_HEIGHT][TINYGL_WIDTH] = {0, };
uint8_t display[TINYGL_HEIGHT][TINYGL_WIDTH] = {{0, }};
/* This controls the luminance levels. The maximum value
of LUMINANCE_STEPS gives 100 percent duty cycle. */
const uint8_t levels[] = {0, 1, 2, 4, 8, 15, 25, 15, 8, 4, 2, 1};
@ -78,7 +77,7 @@ int main (void)
{
twinkle_tick = 0;
/* Change luminance of stars until they die. */
/* Vary luminance of stars. */
for (x = 0; x < TINYGL_WIDTH; x++)
{
for (y = 0; y < TINYGL_HEIGHT; y++)

@ -0,0 +1,71 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 12 Sep 2010
# Descr: Makefile for stars3
# 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: stars3.out
# Compile: create object files from C source files.
stars3.o: stars3.c ../../drivers/avr/system.h ../../drivers/display.h ../../utils/font.h ../../utils/pacer.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 $@
ledmat.o: ../../drivers/ledmat.c ../../drivers/avr/pio.h ../../drivers/avr/system.h ../../drivers/ledmat.h
$(CC) -c $(CFLAGS) $< -o $@
font.o: ../../utils/font.c ../../drivers/avr/system.h ../../utils/font.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 $@
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.
stars3.out: stars3.o pio.o system.o timer.o display.o ledmat.o font.o pacer.o tinygl.o
$(CC) $(CFLAGS) $^ -o $@ -lm
$(SIZE) $@
# Create hex file for programming from executable file.
stars3.hex: stars3.out
$(OBJCOPY) -O ihex stars3.out stars3.hex
# Target: clean project.
.PHONY: clean
clean:
-$(DEL) *.o *.out *.hex
# Target: program project.
.PHONY: program
program: stars3.hex
dfu-programmer atmega32u2 erase; dfu-programmer atmega32u2 flash stars3.hex; dfu-programmer atmega32u2 start

@ -0,0 +1,61 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for stars3
CC = gcc
CFLAGS = -Wall -Wstrict-prototypes -Wextra -g -I../../drivers/test -I../../drivers -I../../utils
DEL = rm
# Default target.
all: stars3
# Compile: create object files from C source files.
stars3-test.o: stars3.c ../../drivers/display.h ../../drivers/test/system.h ../../utils/font.h ../../utils/pacer.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 $@
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 $@
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 $@
font-test.o: ../../utils/font.c ../../drivers/test/system.h ../../utils/font.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 $@
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.
stars3: stars3-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o
$(CC) $(CFLAGS) $^ -o $@ -lrt
# Clean: delete derived files.
.PHONY: clean
clean:
-$(DEL) stars3 stars3-test.o display-test.o ledmat-test.o mgetkey-test.o pio-test.o system-test.o timer-test.o font-test.o pacer-test.o tinygl-test.o

@ -0,0 +1,45 @@
# File: Makefile
# Author: M. P. Hayes, UCECE
# Date: 11 Sep 2010
# Descr: Makefile for led5 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

@ -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.

@ -0,0 +1,161 @@
/** @file stars3.c
@author M.P. Hayes
@date 28 Sep 2013
@brief Example of using pseudorandom numbers and controlling pixel
brightness with PWM. Note, pseudorandom numbers follow the same
sequence.
*/
#include <stdlib.h>
#include "system.h"
#include "pacer.h"
#include "tinygl.h"
/* This controls the range of luminance. A bigger number gives more dynamic range
but requires a faster update rate. */
#define LUMINANCE_STEPS 25
/* This needs to be fast enough to prevent the eye noticing flicker.
A lower value (say 5) is useful for flashing pixels. */
#define PWM_RATE 40
/* Number of twinkling stars. */
#define NUM_STARS 10
/* This is the rate (Hz) of luminance changes. */
#define TWINKLE_RATE 5
#define UPDATE_RATE (LUMINANCE_STEPS * PWM_RATE)
#define LOOP_RATE (TINYGL_WIDTH * UPDATE_RATE)
static void star_twinkle (uint8_t starmap[TINYGL_HEIGHT][TINYGL_WIDTH],
uint8_t x, uint8_t y, int num_levels)
{
/* Check if star alive. */
if (starmap[y][x] == 0)
return;
/* Change star luminance until it dies. */
starmap[y][x]--;
if (starmap[y][x] > 0)
return;
/* Create a new star at a point neighbouring the old one
or at the same place. */
while (1)
{
int8_t dx;
int8_t dy;
dx = (rand () % 3) - 1;
dy = (rand () % 3) - 1;
if (x + dx >= 0 && x + dx < TINYGL_WIDTH
&& y + dy >= 0 && y + dy < TINYGL_HEIGHT
&& starmap[y + dy][x + dx] == 0)
{
starmap[y + dy][x + dx] = num_levels - 1;
return;
}
}
}
static void stars_twinkle (uint8_t starmap[TINYGL_HEIGHT][TINYGL_WIDTH],
int num_levels)
{
uint8_t x;
uint8_t y;
for (x = 0; x < TINYGL_WIDTH; x++)
{
for (y = 0; y < TINYGL_HEIGHT; y++)
{
star_twinkle (starmap, x, y, num_levels);
}
}
}
static void stars_create (uint8_t starmap[TINYGL_HEIGHT][TINYGL_WIDTH],
int num_levels)
{
uint8_t x;
uint8_t y;
uint8_t i;
for (i = 0; i < NUM_STARS; i++)
{
/* Create new star, but not over a live one. */
do
{
x = rand () % TINYGL_WIDTH;
y = rand () % TINYGL_HEIGHT;
} while (starmap[y][x]);
starmap[y][x] = rand () % num_levels;
}
}
int main (void)
{
uint16_t twinkle_tick = 0;
uint8_t pwm_tick = 0;
uint8_t x;
uint8_t y;
uint8_t col;
/* This stores the current luminance level for each pixel. */
uint8_t starmap[TINYGL_HEIGHT][TINYGL_WIDTH] = {{0, }};
/* This controls the luminance levels. The maximum value
of LUMINANCE_STEPS gives 100 percent duty cycle. */
const uint8_t levels[] = {0, 1, 2, 4, 8, 15, 25, 15, 8, 4, 2, 1};
system_init ();
tinygl_init (LOOP_RATE);
pacer_init (LOOP_RATE);
stars_create (starmap, ARRAY_SIZE (levels));
while (1)
{
/* Refresh starmap. */
for (col = 0; col < TINYGL_WIDTH; col++)
{
pacer_wait ();
tinygl_update ();
}
twinkle_tick++;
if (twinkle_tick >= UPDATE_RATE / TWINKLE_RATE)
{
twinkle_tick = 0;
/* Change luminance of stars until they die. Then create
a new one nearby. */
stars_twinkle (starmap, ARRAY_SIZE (levels));
}
/* Pulse width modulate pixels to control luminance. */
for (x = 0; x < TINYGL_WIDTH; x++)
{
for (y = 0; y < TINYGL_HEIGHT; y++)
{
tinygl_draw_point (tinygl_point (x, y),
levels[starmap[y][x]] > pwm_tick);
}
}
pwm_tick++;
if (pwm_tick >= UPDATE_RATE / PWM_RATE)
{
pwm_tick = 0;
}
}
return 0;
}

@ -35,6 +35,24 @@ static tinygl_state_t tinygl =
};
/** Set pixel.
@param pos coordinates of point
@param pixel_value pixel value. */
void tinygl_pixel_set (tinygl_point_t pos, tinygl_pixel_value_t pixel_value)
{
display_pixel_set (pos.x, pos.y, pixel_value);
}
/** Get pixel.
@param pos coordinates of point
@return pixel value. */
tinygl_pixel_value_t tinygl_pixel_get (tinygl_point_t pos)
{
return display_pixel_get (pos.x, pos.y);
}
/** Draw point.
@param pos coordinates of point
@param pixel_value pixel value for line. */

@ -187,6 +187,18 @@ void tinygl_text (const char *string);
void tinygl_draw_point (tinygl_point_t pos, tinygl_pixel_value_t pixel_value);
/** Set pixel.
@param pos coordinates of point
@param pixel_value pixel value. */
void tinygl_pixel_set (tinygl_point_t pos, tinygl_pixel_value_t pixel_value);
/** Get pixel.
@param pos coordinates of point
@return pixel value. */
tinygl_pixel_value_t tinygl_pixel_get (tinygl_point_t pos);
/** Draw line.
@param pos1 coordinates of start of line
@param pos2 coordinates of end of line

Loading…
Cancel
Save