From 3475e99530f200eceb15867729572e7b8542accd Mon Sep 17 00:00:00 2001 From: Ryan Owens Date: Thu, 24 Mar 2011 16:05:35 -0600 Subject: [PATCH] Initial Commit of Simon code for 'C' version and Arduino Sketch version (Yes, I know they're the same thing but spare me). --- Simon_C/Makefile | 556 +++++++++++++++ Simon_C/Simon.c | 641 +++++++++++++++++ Simon_Sketch/Simon_Sketch.pde | 652 +++++++++++++++++ Simon_Sketch/applet/HardwareSerial.cpp.o | Bin 0 -> 16184 bytes Simon_Sketch/applet/Print.cpp.o | Bin 0 -> 25172 bytes Simon_Sketch/applet/Simon_Code_FixSound.cpp | 666 ++++++++++++++++++ .../applet/Simon_Code_FixSound.cpp.eep | 1 + .../applet/Simon_Code_FixSound.cpp.elf | Bin 0 -> 13913 bytes .../applet/Simon_Code_FixSound.cpp.hex | 101 +++ Simon_Sketch/applet/Simon_Code_FixSound.cpp.o | Bin 0 -> 19892 bytes Simon_Sketch/applet/WInterrupts.c.o | Bin 0 -> 5628 bytes Simon_Sketch/applet/WMath.cpp.o | Bin 0 -> 7012 bytes Simon_Sketch/applet/core.a | Bin 0 -> 93734 bytes Simon_Sketch/applet/pins_arduino.c.o | Bin 0 -> 3056 bytes Simon_Sketch/applet/wiring.c.o | Bin 0 -> 8916 bytes Simon_Sketch/applet/wiring_analog.c.o | Bin 0 -> 6564 bytes Simon_Sketch/applet/wiring_digital.c.o | Bin 0 -> 8276 bytes Simon_Sketch/applet/wiring_pulse.c.o | Bin 0 -> 6484 bytes Simon_Sketch/applet/wiring_shift.c.o | Bin 0 -> 4084 bytes 19 files changed, 2617 insertions(+) create mode 100644 Simon_C/Makefile create mode 100644 Simon_C/Simon.c create mode 100644 Simon_Sketch/Simon_Sketch.pde create mode 100644 Simon_Sketch/applet/HardwareSerial.cpp.o create mode 100644 Simon_Sketch/applet/Print.cpp.o create mode 100644 Simon_Sketch/applet/Simon_Code_FixSound.cpp create mode 100644 Simon_Sketch/applet/Simon_Code_FixSound.cpp.eep create mode 100644 Simon_Sketch/applet/Simon_Code_FixSound.cpp.elf create mode 100644 Simon_Sketch/applet/Simon_Code_FixSound.cpp.hex create mode 100644 Simon_Sketch/applet/Simon_Code_FixSound.cpp.o create mode 100644 Simon_Sketch/applet/WInterrupts.c.o create mode 100644 Simon_Sketch/applet/WMath.cpp.o create mode 100644 Simon_Sketch/applet/core.a create mode 100644 Simon_Sketch/applet/pins_arduino.c.o create mode 100644 Simon_Sketch/applet/wiring.c.o create mode 100644 Simon_Sketch/applet/wiring_analog.c.o create mode 100644 Simon_Sketch/applet/wiring_digital.c.o create mode 100644 Simon_Sketch/applet/wiring_pulse.c.o create mode 100644 Simon_Sketch/applet/wiring_shift.c.o diff --git a/Simon_C/Makefile b/Simon_C/Makefile new file mode 100644 index 0000000..29ea664 --- /dev/null +++ b/Simon_C/Makefile @@ -0,0 +1,556 @@ +# Hey Emacs, this is a -*- makefile -*- +#---------------------------------------------------------------------------- +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. +# +# Released to the Public Domain +# +# Additional material for this makefile was written by: +# Peter Fleury +# Tim Henigan +# Colin O'Flynn +# Reiner Patommel +# Markus Pfaff +# Sander Pool +# Frederik Rouleau +# +#---------------------------------------------------------------------------- +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF. +# +# make extcoff = Convert ELF to AVR Extended COFF. +# +# make program = Download the hex file to the device, using avrdude. +# Please customize the avrdude settings below first! +# +# make debug = Start either simulavr or avarice as specified for debugging, +# with avr-gdb or avr-insight as the front end for debugging. +# +# make filename.s = Just compile filename.c into the assembler code only. +# +# make filename.i = Create a preprocessed source file for use in submitting +# bug reports to the GCC project. +# +# To rebuild project do "make clean" then "make all". +#---------------------------------------------------------------------------- + + + +# MCU name +MCU = atmega328 + + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +F_CPU = 8000000 + + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + + +# Target file name (without extension). +TARGET = Simon + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# Debugging format. +# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs. +# AVR Studio 4.10 requires dwarf-2. +# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +# Use forward slashes for directory separators. +# For a directory that has spaces, enclose it in quotes. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 = "ANSI" C +# gnu89 = c89 plus GCC extensions +# c99 = ISO C99 standard (not yet fully implemented) +# gnu99 = c99 plus GCC extensions +CSTANDARD = -std=gnu99 + + +# Place -D or -U options here +CDEFS = -DF_CPU=$(F_CPU)UL + + +# Place -I options here +CINCS = + + + +#---------------- Compiler Options ---------------- +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + +#---------------- Assembler Options ---------------- +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + +#---------------- Library Options ---------------- +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +# If this is left blank, then it will use the Standard printf version. +PRINTF_LIB = +#PRINTF_LIB = $(PRINTF_LIB_MIN) +#PRINTF_LIB = $(PRINTF_LIB_FLOAT) + + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +# If this is left blank, then it will use the Standard scanf version. +SCANF_LIB = +#SCANF_LIB = $(SCANF_LIB_MIN) +#SCANF_LIB = $(SCANF_LIB_FLOAT) + + +MATH_LIB = -lm + + + +#---------------- External Memory Options ---------------- + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + + + +#---------------- Linker Options ---------------- +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + +#---------------- Programming Options (avrdude serial bootloader) ---------------- + +#"C:\arduino\hardware\tools\avr\bin\avrdude" -PCOM3 -c stk500v1 -patmega168 -b19200 -Uflash:w:Simon-PTH-v1.hex -V -F -C"C:\arduino\hardware\tools\avr\etc\avrdude.conf" +#avrdude -PCOM3 -c stk500v1 -patmega168 -b19200 -Uflash:w:Simon-PTH-v1.hex -V -F +SERIAL_AVRDUDE = avrdude +#SERIAL_AVRDUDE_CONFIG = "C:\arduino\hardware\tools\avr\etc\avrdude.conf" +SERIAL_AVRDUDE_PORT = COM3 +SERIAL_AVRDUDE_SPEED = 19200 +SERIAL_AVRDUDE_PROGRAMMER = stk500v1 + +SERIAL_AVRDUDE_FLAGS = -p $(MCU) -P $(SERIAL_AVRDUDE_PORT) -c $(SERIAL_AVRDUDE_PROGRAMMER) -b$(SERIAL_AVRDUDE_SPEED) +#SERIAL_AVRDUDE_FLAGS += -C$(SERIAL_AVRDUDE_CONFIG) +SERIAL_AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +SERIAL_AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +SERIAL_AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + +#---------------- Programming Options (avrdude) ---------------- + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +AVRDUDE_PROGRAMMER = stk200 +#AVRDUDE_PROGRAMMER = ponyser + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = lpt1 +#AVRDUDE_PORT = COM1 + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + +#---------------- Programming Options (STK500) ---------------- +# Programming hardware: stk500 (the AVR MKII ISP version) + +STK500 = stk500 + +# Location of STK500.exe - no trailing '\' +STK500_PATH = C:\Program Files\Atmel\AVR Tools\STK500 + +# The STK500 AVR ISP MKII is USB. The USB drivers must already be installed. +# Do this normally by installing AVR Studio. +STK500_PORT = USB + +#-erase chip -Program Flash -Verify Flash -File name -Serial programing(ISP) +STK500_WRITE_FLASH = -e -pf -vf -if$(TARGET).hex -ms + +STK500_FLAGS = -d$(MCU) -c$(STK500_PORT) + +#-Set ISP frequency to 250kHz. Limit is 1/4 of internal osc which is default 1MHz +#Reduce this to 100kHz if you run into flash verification problems in low-voltage systems +STK500_FLAGS += -I250kHz + +#---------------- Debugging Options ---------------- + +# For simulavr only - target MCU frequency. +DEBUG_MFREQ = $(F_CPU) + +# Set the DEBUG_UI to either gdb or insight. +# DEBUG_UI = gdb +DEBUG_UI = insight + +# Set the debugging back-end to either avarice, simulavr. +DEBUG_BACKEND = avarice +#DEBUG_BACKEND = simulavr + +# GDB Init Filename. +GDBINIT_FILE = __avr_gdbinit + +# When using avarice settings for the JTAG +JTAG_DEV = /dev/com1 + +# Debugging port used to communicate between GDB / avarice / simulavr. +DEBUG_PORT = 4242 + +# Debugging host used to communicate between GDB / avarice / simulavr, normally +# just set to localhost unless doing some sort of crazy debugging when +# avarice is running on a different computer. +DEBUG_HOST = localhost + + + +#============================================================================ + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp +WINSHELL = cmd + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +#New +ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf +#Old +#ELFSIZE = $(SIZE) -A $(TARGET).elf + +AVRMEM = avr-mem.sh $(TARGET).elf $(MCU) + +sizebefore: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \ + $(AVRMEM) 2>/dev/null; echo; fi + +sizeafter: + @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \ + $(AVRMEM) 2>/dev/null; echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +program_stk500: $(TARGET).hex $(TARGET).eep + $(STK500_PATH)\$(STK500) $(STK500_FLAGS) $(STK500_WRITE_FLASH) + +program_serial: $(TARGET).hex $(TARGET).eep + $(SERIAL_AVRDUDE) $(SERIAL_AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) + +# Generate avr-gdb config/init file which does the following: +# define the reset signal, load the target file, connect to target, and set +# a breakpoint at main(). +gdb-config: + @$(REMOVE) $(GDBINIT_FILE) + @echo define reset >> $(GDBINIT_FILE) + @echo SIGNAL SIGHUP >> $(GDBINIT_FILE) + @echo end >> $(GDBINIT_FILE) + @echo file $(TARGET).elf >> $(GDBINIT_FILE) + @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE) +ifeq ($(DEBUG_BACKEND),simulavr) + @echo load >> $(GDBINIT_FILE) +endif + @echo break main >> $(GDBINIT_FILE) + +debug: gdb-config $(TARGET).elf +ifeq ($(DEBUG_BACKEND), avarice) + @echo Starting AVaRICE - Press enter when "waiting to connect" message displays. + @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \ + $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT) + @$(WINSHELL) /c pause + +else + @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \ + $(DEBUG_MFREQ) --port $(DEBUG_PORT) +endif + @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + +# Create preprocessed source for use in sending a bug report. +%.i : %.c + $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program debug gdb-config + + + diff --git a/Simon_C/Simon.c b/Simon_C/Simon.c new file mode 100644 index 0000000..2c14726 --- /dev/null +++ b/Simon_C/Simon.c @@ -0,0 +1,641 @@ +/** + * 6-19-2007 + * Copyright 2009, Spark Fun Electronics + * Nathan Seidle + * nathan at sparkfun.com + * + * Released under the Creative Commons Attribution Share-Alike 3.0 License + * http://creativecommons.org/licenses/by-sa/3.0 + * + * Simon Game ported for the ATmega168 + * + * Fixes and cleanup by Joshua Neal + * + * Generates random sequence, plays music, and displays button lights. + * + * Simon tones from Wikipedia + * - A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse + * - a (green, upper right, an octave higher than A) - 880Hz - 1.136ms, + * 0.568ms pulse + * - D (blue, lower left, a perfect fourth higher than the upper left) + * 587.33Hz - 1.702ms - 0.851ms pulse + * G (yellow, lower right, a perfect fourth higher than the lower left) - + * 784Hz - 1.276ms - 0.638ms pulse + * + * The tones are close, but probably off a bit, but they sound all right. + * + * The old version of SparkFun simon used an ATmega8. An ATmega8 ships + * with a default internal 1MHz oscillator. You will need to set the + * internal fuses to operate at the correct external 16MHz oscillator. + * + * Original Fuses: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m + * + * Command to set to fuses to use external 16MHz: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m + * + * The current version of Simon uses the ATmega168. The external osciallator + * was removed to reduce component count. This version of simon relies on the + * internal default 1MHz osciallator. Do not set the external fuses. + */ + +#include +#include + +/* Uncomment one of the following, corresponding to the board you have. */ +//#define BOARD_REV_6_25_08 +//#define BOARD_REV_4_9_2009 +//#define BOARD_REV_6_3_2009 +#define BOARD_REV_PTH + +#ifdef BOARD_REV_PTH + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 3 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 1 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 2 +#define BUTTON_GREEN_PORT PIND +#define BUTTON_BLUE_PIN 4 +#define BUTTON_BLUE_PORT PINB +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 4 +#define BUZZER1_PORT PORTD +#define BUZZER2 7 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_PTH */ + + +#ifdef BOARD_REV_6_25_08 + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 3 +#define LED_RED_PORT PORTC +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 0 +#define LED_BLUE_PORT PORTC +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 2 +#define BUTTON_RED_PORT PINC +#define BUTTON_GREEN_PIN 5 +#define BUTTON_GREEN_PORT PINC +#define BUTTON_BLUE_PIN 1 +#define BUTTON_BLUE_PORT PINC +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_6_25_08 */ + + +#ifdef BOARD_REV_4_9_2009 + +#define CHIP_ATMEGA168 + +/* LED pin definitions */ +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 0 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 1 +#define BUTTON_GREEN_PORT PINB +#define BUTTON_BLUE_PIN 7 +#define BUTTON_BLUE_PORT PIND +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_4_9_2009 */ + +#ifdef BOARD_REV_6_3_2009 + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 0 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 1 +#define BUTTON_GREEN_PORT PINB +#define BUTTON_BLUE_PIN 7 +#define BUTTON_BLUE_PORT PIND +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_6_3_2009 */ + +/* Define game parameters */ +#define MOVES_TO_WIN 14 +#define TIME_LIMIT 3000 /* 3000ms = 3 sec */ + +#define sbi(port_name, pin_number) (port_name |= 1< 256) + { + TIFR0 = (1< 0) { + delay_us(1000); + } +} + +/* Light the given set of LEDs */ +static void set_leds(uint8_t leds) +{ + if ((leds & LED_RED) != 0) { + sbi(LED_RED_PORT, LED_RED_PIN); + } else { + cbi(LED_RED_PORT, LED_RED_PIN); + } + if ((leds & LED_GREEN) != 0) { + sbi(LED_GREEN_PORT, LED_GREEN_PIN); + } else { + cbi(LED_GREEN_PORT, LED_GREEN_PIN); + } + if ((leds & LED_BLUE) != 0) { + sbi(LED_BLUE_PORT, LED_BLUE_PIN); + } else { + cbi(LED_BLUE_PORT, LED_BLUE_PIN); + } + if ((leds & LED_YELLOW) != 0) { + sbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } else { + cbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } +} + + +#ifdef BOARD_REV_6_25_08 +static void init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111111; + DDRC = 0b00001001; /* LEDs and Buttons */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */ + PORTD = 0b01000000; /* Enable pull-up on button 1 */ +} +#endif /* BOARD_REV_6_25_08 */ + +#ifdef BOARD_REV_4_9_2009 +static void init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111100; /* button 2,3 on PB0,1 */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTB = 0b00000011; /* Enable pull-ups on buttons 2,3 */ + PORTD = 0b11000000; /* Enable pull-up on button 0,1 */ +} +#endif /* BOARD_REV_4_9_2009 */ + +#ifdef BOARD_REV_PTH +static void init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0xFF & ~(1< 70; x--) { + for (y = 0; y < 3; y++) { + sbi(BUZZER2_PORT, BUZZER2); + cbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + + cbi(BUZZER2_PORT, BUZZER2); + sbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + } + } +} + +/* Play the winner sound and lights */ +void play_winner(void) +{ + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); +} + +/* Plays the current contents of the game moves */ +static void play_moves(void) +{ + uint8_t move; + + for (move = 0; move < nmoves; move++) { + toner(moves[move], 150); + delay_ms(150); + } +} + +/* Adds a new random button to the game sequence, by sampling the timer */ +static void add_to_moves(void) +{ + uint8_t new_button; + + /* Use the lower 2 bits of the timer for the random value */ + new_button = 1 << (TCNT2 & 0x3); + + moves[nmoves++] = new_button; +} + +/* Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms. */ +static void buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us) +{ + uint32_t buzz_length_us; + + buzz_length_us = buzz_length_ms * (uint32_t)1000; + while (buzz_length_us > buzz_delay_us*2) { + buzz_length_us -= buzz_delay_us*2; + + /* toggle the buzzer at various speeds */ + cbi(BUZZER1_PORT, BUZZER1); + sbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + + sbi(BUZZER1_PORT, BUZZER1); + cbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + } +} + + +/* + * Light an LED and play tone + * + * red, upper left: 440Hz - 2.272ms - 1.136ms pulse + * green, upper right: 880Hz - 1.136ms - 0.568ms pulse + * blue, lower left: 587.33Hz - 1.702ms - 0.851ms pulse + * yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse + */ +static void toner(uint8_t which, uint16_t buzz_length_ms) +{ + set_leds(which); + switch (which) { + case LED_RED: + buzz_sound(buzz_length_ms, 1136); + break; + + case LED_GREEN: + buzz_sound(buzz_length_ms, 568); + break; + + case LED_BLUE: + buzz_sound(buzz_length_ms, 851); + break; + + case LED_YELLOW: + buzz_sound(buzz_length_ms, 638); + break; + } + + /* Turn off all LEDs */ + set_leds(0); +} + +/* Show an "attract mode" display while waiting for user to press button. */ +static void attract_mode(void) +{ + while (1) { + set_leds(LED_RED); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_BLUE); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_GREEN); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_YELLOW); + delay_ms(100); + if (check_button() != 0x00) + return; + } +} + + +/* Wait for a button to be pressed. Returns one of led colors (LED_RED, etc.) + * if successful, 0 if timed out */ +static uint8_t wait_for_button(void) +{ + uint16_t time_limit = TIME_LIMIT; + uint8_t released = 0; + uint8_t old_button; + + while (time_limit > 0) { + uint8_t button; + + /* Implement a small bit of debouncing */ + old_button = button; + button = check_button(); + + /* + * Make sure we've seen the previous button + * released before accepting new buttons + */ + if (button == 0) + released = 1; + if (button == old_button && released == 1) { + /* Make sure just one button is pressed */ + if (button == LED_RED || + button == LED_BLUE || + button == LED_GREEN || + button == LED_YELLOW) { + return button; + } + } + + delay_ms(1); + + time_limit--; + } + return 0; /* Timed out */ +} + + + +/* Play the game. Returns 0 if player loses, or 1 if player wins. */ +static int game_mode(void) +{ + nmoves = 0; + while (nmoves < MOVES_TO_WIN) { + uint8_t move; + + /* Add a button to the current moves, then play them back */ + add_to_moves(); + play_moves(); + + /* Then require the player to repeat the sequence. */ + for (move = 0; move < nmoves; move++) { + uint8_t choice = wait_for_button(); + + /* If wait timed out, player loses. */ + if (choice == 0) + return 0; + + toner(choice, 150); + + /* If the choice is incorect, player loses. */ + if (choice != moves[move]) { + return 0; + } + } + + /* Player was correct, delay before playing moves */ + delay_ms(1000); + } + + /* player wins */ + return 1; +} + +int main(void) +{ + + /* Setup IO pins and defaults */ + ioinit(); + + /* Main loop */ + while (1) { + /* Wait for user to start game */ + attract_mode(); + + /* Indicate the start of game play */ + set_leds(LED_RED|LED_GREEN|LED_BLUE|LED_YELLOW); + delay_ms(1000); + set_leds(0); + delay_ms(250); + + if (game_mode() != 0) { + /* Player won, play winner tones */ + play_winner(); + } else { + /* Player lost, play loser tones */ + play_loser(); + } + } + + return(0); +} + diff --git a/Simon_Sketch/Simon_Sketch.pde b/Simon_Sketch/Simon_Sketch.pde new file mode 100644 index 0000000..4644bc1 --- /dev/null +++ b/Simon_Sketch/Simon_Sketch.pde @@ -0,0 +1,652 @@ +/** + * 6-19-2007 + * Copyright 2009, Spark Fun Electronics + * Nathan Seidle + * nathan at sparkfun.com + * + * Released under the Creative Commons Attribution Share-Alike 3.0 License + * http://creativecommons.org/licenses/by-sa/3.0 + * + * Simon Game ported for the ATmega168 + * + * Fixes and cleanup by Joshua Neal + * + * Generates random sequence, plays music, and displays button lights. + * + * Simon tones from Wikipedia + * - A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse + * - a (green, upper right, an octave higher than A) - 880Hz - 1.136ms, + * 0.568ms pulse + * - D (blue, lower left, a perfect fourth higher than the upper left) + * 587.33Hz - 1.702ms - 0.851ms pulse + * G (yellow, lower right, a perfect fourth higher than the lower left) - + * 784Hz - 1.276ms - 0.638ms pulse + * + * The tones are close, but probably off a bit, but they sound all right. + * + * The old version of SparkFun simon used an ATmega8. An ATmega8 ships + * with a default internal 1MHz oscillator. You will need to set the + * internal fuses to operate at the correct external 16MHz oscillator. + * + * Original Fuses: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m + * + * Command to set to fuses to use external 16MHz: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m + * + * The current version of Simon uses the ATmega168. The external osciallator + * was removed to reduce component count. This version of simon relies on the + * internal default 1MHz osciallator. Do not set the external fuses. + */ + +#include +#include + +/* Uncomment one of the following, corresponding to the board you have. */ +//#define BOARD_REV_6_25_08 +// #define BOARD_REV_4_9_2009 +//#define BOARD_REV_6_3_2009 +#define BOARD_REV_PTH + +#ifdef BOARD_REV_PTH + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 3 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 1 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 2 +#define BUTTON_GREEN_PORT PIND +#define BUTTON_BLUE_PIN 4 +#define BUTTON_BLUE_PORT PINB +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 4 +#define BUZZER1_PORT PORTD +#define BUZZER2 7 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_PTH */ + +#ifdef BOARD_REV_6_25_08 + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 3 +#define LED_RED_PORT PORTC +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 0 +#define LED_BLUE_PORT PORTC +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 2 +#define BUTTON_RED_PORT PINC +#define BUTTON_GREEN_PIN 5 +#define BUTTON_GREEN_PORT PINC +#define BUTTON_BLUE_PIN 1 +#define BUTTON_BLUE_PORT PINC +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_6_25_08 */ + +#ifdef BOARD_REV_4_9_2009 + +#define CHIP_ATMEGA168 + +/* LED pin definitions */ +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 0 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 1 +#define BUTTON_GREEN_PORT PINB +#define BUTTON_BLUE_PIN 7 +#define BUTTON_BLUE_PORT PIND +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_4_9_2009 */ + +#ifdef BOARD_REV_6_3_2009 + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 0 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 1 +#define BUTTON_GREEN_PORT PINB +#define BUTTON_BLUE_PIN 7 +#define BUTTON_BLUE_PORT PIND +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_6_3_2009 */ + +/* Define game parameters */ +#define MOVES_TO_WIN 13 +#define TIME_LIMIT 3000 /* 3000ms = 3 sec */ + +#define sbi(port_name, pin_number) (port_name |= 1< 256) + { + TIFR0 = (1< 0) { + delay_us(1000); + } +} + +/* Light the given set of LEDs */ +void +set_leds(uint8_t leds) +{ + if ((leds & LED_RED) != 0) { + sbi(LED_RED_PORT, LED_RED_PIN); + } + else { + cbi(LED_RED_PORT, LED_RED_PIN); + } + if ((leds & LED_GREEN) != 0) { + sbi(LED_GREEN_PORT, LED_GREEN_PIN); + } + else { + cbi(LED_GREEN_PORT, LED_GREEN_PIN); + } + if ((leds & LED_BLUE) != 0) { + sbi(LED_BLUE_PORT, LED_BLUE_PIN); + } + else { + cbi(LED_BLUE_PORT, LED_BLUE_PIN); + } + if ((leds & LED_YELLOW) != 0) { + sbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } + else { + cbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } +} + + +#ifdef BOARD_REV_6_25_08 +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111111; + DDRC = 0b00001001; /* LEDs and Buttons */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */ + PORTD = 0b01000000; /* Enable pull-up on button 1 */ +} +#endif /* BOARD_REV_6_25_08 */ +#ifdef BOARD_REV_4_9_2009 +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111100; /* button 2,3 on PB0,1 */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTB = 0b00000011; /* Enable pull-ups on buttons 2,3 */ + PORTD = 0b11000000; /* Enable pull-up on button 0,1 */ +} +#endif /* BOARD_REV_4_9_2009 */ + +#ifdef BOARD_REV_PTH +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11101101; /* LEDs and Buttons */ + DDRC = 0b11111111; /* LEDs and Buttons */ + DDRD = 0b10111011; /* LEDs, buttons, buzzer, TX/RX */ + + PORTB = 0b00010010; /* Enable pull-ups on buttons 1,4 */ + //PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */ + PORTD = 0b01000100; /* Enable pull-up on button 1 */ +} +#endif + +void +ioinit(void) +{ + init_gpio(); + + //Set Timer 0 Registers to Default Setting to over-ride the timer initialization made in the init() function of the Arduino Wiring libary (Wiring.c in the hardware/core/arduino folder) + TCCR0A = 0; + TIMSK0 = 0; + /* Init timer 0 for delay_us timing (1,000,000 / 1 = 1,000,000) */ + //TCCR0B = (1< 70; x--) { + for (y = 0; y < 3; y++) { + sbi(BUZZER2_PORT, BUZZER2); + cbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + + cbi(BUZZER2_PORT, BUZZER2); + sbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + } + } +} + +/* Play the winner sound and lights */ +void +play_winner(void) +{ + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); +} + +/* Plays the current contents of the game moves */ +void +play_moves(void) +{ + uint8_t move; + + for (move = 0; move < nmoves; move++) { + toner(moves[move], 150); + delay_ms(150); + } +} + +/* Adds a new random button to the game sequence, by sampling the timer */ +void +add_to_moves(void) +{ + uint8_t new_button; + + /* Use the lower 2 bits of the timer for the random value */ + new_button = 1 << (TCNT2 & 0x3); + + moves[nmoves++] = new_button; +} + +/* Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms. */ +void +buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us) +{ + uint32_t buzz_length_us; + + buzz_length_us = buzz_length_ms * (uint32_t)1000; + while (buzz_length_us > buzz_delay_us*2) { + buzz_length_us -= buzz_delay_us*2; + + /* toggle the buzzer at various speeds */ + cbi(BUZZER1_PORT, BUZZER1); + sbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + + sbi(BUZZER1_PORT, BUZZER1); + cbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + } +} + + +/* + * Light an LED and play tone + * + * red, upper left: 440Hz - 2.272ms - 1.136ms pulse + * green, upper right: 880Hz - 1.136ms - 0.568ms pulse + * blue, lower left: 587.33Hz - 1.702ms - 0.851ms pulse + * yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse + */ +void +toner(uint8_t which, uint16_t buzz_length_ms) +{ + set_leds(which); + switch (which) { + case LED_RED: + buzz_sound(buzz_length_ms, 1136); + break; + + case LED_GREEN: + buzz_sound(buzz_length_ms, 568); + break; + + case LED_BLUE: + buzz_sound(buzz_length_ms, 851); + break; + + case LED_YELLOW: + buzz_sound(buzz_length_ms, 638); + break; + } + + /* Turn off all LEDs */ + set_leds(0); +} + +/* Show an "attract mode" display while waiting for user to press button. */ +void +attract_mode(void) +{ + while (1) { + set_leds(LED_RED); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_BLUE); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_GREEN); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_YELLOW); + delay_ms(100); + if (check_button() != 0x00) + return; + } +} + + +/* Wait for a button to be pressed. Returns one of led colors (LED_RED, etc.) + * if successful, 0 if timed out */ +uint8_t +wait_for_button(void) +{ + uint16_t time_limit = TIME_LIMIT; + uint8_t released = 0; + uint8_t old_button; + + while (time_limit > 0) { + uint8_t button; + + /* Implement a small bit of debouncing */ + old_button = button; + button = check_button(); + + /* + * Make sure we've seen the previous button + * released before accepting new buttons + */ + if (button == 0) + released = 1; + if (button == old_button && released == 1) { + /* Make sure just one button is pressed */ + if (button == LED_RED || + button == LED_BLUE || + button == LED_GREEN || + button == LED_YELLOW) { + return button; + } + } + + delay_ms(1); + + time_limit--; + } + return 0; /* Timed out */ +} + + + +/* Play the game. Returns 0 if player loses, or 1 if player wins. */ +int +game_mode(void) +{ + nmoves = 0; + while (nmoves < MOVES_TO_WIN) { + uint8_t move; + + /* Add a button to the current moves, then play them back */ + add_to_moves(); + play_moves(); + + /* Then require the player to repeat the sequence. */ + for (move = 0; move < nmoves; move++) { + uint8_t choice = wait_for_button(); + + /* If wait timed out, player loses. */ + if (choice == 0) + return 0; + + toner(choice, 150); + + /* If the choice is incorect, player loses. */ + if (choice != moves[move]) { + return 0; + } + } + + /* Player was correct, delay before playing moves */ + delay_ms(1000); + } + + /* player wins */ + return 1; +} + +void setup() +{ +} + +void loop() +{ + + /* Setup IO pins and defaults */ + ioinit(); + + play_winner(); + + /* Main loop */ + while (1) { + /* Wait for user to start game */ + attract_mode(); + + /* Indicate the start of game play */ + set_leds(LED_RED|LED_GREEN|LED_BLUE|LED_YELLOW); + delay_ms(1000); + set_leds(0); + delay_ms(250); + + /* Play game and handle result */ + if (game_mode() != 0) { + /* Player won, play winner tones */ + play_winner(); + } + else { + /* Player lost, play loser tones */ + play_loser(); + } + } +} + + + diff --git a/Simon_Sketch/applet/HardwareSerial.cpp.o b/Simon_Sketch/applet/HardwareSerial.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..f42c3286853d3108adb8869c065f9f3a22cc5de7 GIT binary patch literal 16184 zcmd^`3wWGWna9tW$&Dm5ZPFXP&?HSl?PYRlDy38!=!I4)&Gt@-PA17T8B8QsUg3BOM%0E^4CoC(tv|wF{QduI;Q!3l1{S%fKYDjYedPSk5 zbf{s%`hs`l&n|ItaLQcjJG! zb(`UMKg|`OU5;#enrxl4^MW*~?E$4`EHTZQIZ>K7%hfA2Et{RK{CT!_FGM2M)pP1S zIi&%8WeL@sQe{+hI<}lSj&yDSZLcqM5)}m)_R4Hki-uLXwNBE-x*?yfy~wri!-&tD zt!qn|yS?BVbj@4pQIhic0g*eU7SJN)3k_f}7SRFMY{0rkrE0f9OxB=EX&;ldZc?eb z0!+hV_`Dcpq(^)(U+*-^tzd~;YDFP6R8uY{teMYQW~yfy&UpAVYQ${j!?*WhJ~d`B zrnE0R(iNAC8ylJ7gF!@D*-qr7FoP+~Gbv-n|CrHs44Yj22vl;66WQ~qu6+}ITyFa7 zc;qry=RJmJUJoAXysQfkBg!`gw082b7)+4@-xJ6yT!_c{_^1QAVg?kkB4MPG=$k94 zs>>kr&+XGr=0#3&zg9(T=X|J6DABBYb69&(vz8yRZ5v}uFvlz z%YI>!S&}Swk~xx`>m>6eS>Yt}C0Xet3nf{_miXpQkmN;9vPhEioa97FzQsvSlH`0R zS?r&JW}x}n54Un(#6#zu!Bb6j+o-w3}+^qZ-A9wNb89r{~Bf-Z(KHkGeHy>d>cJR@NM@8jZ@kFR{IxuJwc=(1&Z$gz9 zp)14eN``r3@W%$-UO9zU3h{VLsbd6r^Vg)%7%9S@uz)o&EM&boJCnLSsTb0boVKJ6 zgXvjLOH#Kc^#Z!euz-#mU^5J`Q3lvVhJ|dfFLC}tw%(VRu#jEhOB9{u#;t!JHx_Xz z+JG+2$Nn2&+RQ9MH6MDwEG$rsNe-@Ngiyy)>h4&yJr>$kx--%l?x_yN+Ik~h(M2^iwHH@+Aa#8x7Osv* zqn*gx9joq)v{bjZwpIrM{6|TotF^PYEv!~9YiblzYiO#;YpThbYHE$f+`K=lP?Kt1 z)|BS;IjS;VH^IlImPl6<+_lcr?fSstKwZjtwN{$CDIAN0Is>iU-8_%<#M^MN2z2oL z4Q>nX1fwgfGt@h%T-_LRl+Db^cIFSd*`b)kGbHwJusK#TMRIK1AZZMi(4fRNJvF0* zE&11q|1Z>htF+Pf(#(uDTX|-iGy7(GM!C%V%<^vAzab?vOSl@xL}OY;oN3cqa7#WU zCFV$MOSl@3OO7pT>o{BU8PW8AY~SB{f?Ow6!OaV>%lH&7Bj8tY$+J5P(m1vZ7Y!HP zT{JwYqB^-Exgi-$Mw9!Jhm%K>cP8&mo=lD<8xr@c(S%Z`@HwvatkpIcG1wB zq3I)shwmIdKK$hH$>Fi#qU4<9lgZ=B|Gekt_q?Y2Mu$cd1APNM11$qv238GRJWw?- z>5w|~(!r+={@20#4u1OJp@Sb7?7R7v!Ty^M5AMJDc;d;#oJ3J#Z0O|BlS9Xc?i@Ni zl=nBc9~_Pj?;Acmd=%}tH?1Yd(U#xnW%??8d0qeW+j9?%cI5Vr?#azMrH(Z}9eesP z+IPE7YW8ATV@*RtLu12(`s=!Uv}Uwnw9)kLHTpXJX+5G#M`}hIMjA(sjFuNIp0jGs zmN_38(Px@RV<+DC%#hJ!$?B7CNo)B5-QRe0!}O^aBz$Nrju7yHNhO9!4Ge08w2|8n%(gL=XN*Y3OpHt#`QG>*KlKM!84 zD%xVaIIy5^;K{`Cw0U$dX3|m2rF}!up&(||6T0};7ZR@}N~Zyrk|zy`V)vxH5`~WlB>^DpImWL9ecXy+thX-yNs2P1g(<5)aFK%-z3@7&|^G06NA0Pa;!Ls+hKQT1w3#elwBZo#zkB+Hh zSqEMo99`5rkT=5BG=vq|$B%~xf8)vzc(~8Q{T@E(;RBTOBAJ*lrbyUe-fidI{!0S~&Oj@L(< zn>j3RB-g6Ns@V9=n#i2ZKFo9HwA_qqQv=S|!Qk$2YdjhY)-F}N$EP2+mn}!^y)!d677n#3-ZnEcc6RpmbST~?Gjpzw zMdD$_TcLBoQ11Z7_5@pcckT?wOb0gM>GT2`EP>k>L$i6hF}EoO^93bhZc7Z@ju@(( zNO`v(5&hMp-kxxf-}*RBbh;qe+Y*a)qzz+FWN$baSHT@u*Vd=^&Jt5*^={SM+7oM0 z&Zvy1XKGjtvuE45BsF5N(}S544z_lLVyc5fg$r$b={f2)wXN<{!7JBqxZ?8l!Qi@} zJ1i}@_9}C$Q)bLNqh0N#=E1L<;l>h^xx{g-@v4sNRD4gkOQlrO8~W$ncGGQ`o2ly| zoJD;tq24xhcBCs3$K{nB-L0;?dQ0ib1q({eJy*pspH-@lRBu;Lq`fQLR%$xQ%We}> zI&5ot0+QOdvO_uUu|2JkuyO|6n8Pi&-A-(Z(YYRngFW$3Jkshqi&V5L80u;ZwuO7* zvEEjbu0eacW05G<%?&Ev5$T~3RwOG1H3!-3U^o_w#>~_SIsKmQYFjJ}H;orv(XNbA z#z0Rv9*4)!!t@I{QHx!sL4FNt`Z#DtmT4F~dji&Tf?)2cK+g@k;-MDA@t6~LSc-@D z#8sdz6c4FDOHU6l+|t_~47Iex!n;)<7VZp*DAKhvnkMLsbcIDgD*^8Y=@fLtXFImC zZgpdAt!GRcw{~n=98CS|U`R7Pj*Z&C+{O~S(q7-)w1xcosw)r&6Qym0FHQu^yZNOdikkd|}!$K(!fv zguLEU(B@r*Jdaq-s#R(!1hmKMnMZped|1Zz-w*L;Jp1y7I8_&4@?LwJ@m=j6$Y}38 z$)i2Wy!KWXxi5cYrR?>9z4ji0JstvR4}Stq`S(q**WMlHuy>D?L1egB;1vh|7f`1=4GtezhVY?BQ?fqxZ9u)X{{ zqiyeev1j#aVDIBLA$m+!X4rcT_I?66?UmwV?Jdu+_XzBj+077o*1wB0>^*u3zT$)) z?Uj4%t*4~vF_U?O|J05Je^)HlR@0Dre?;A}S_8x(~J+MRnIA5*3 z-VA%&rYp4_`8HVpx-;yp#b0?(L5cQwNwM|@#9oaUxD)m!Wb_|xaxHtr>RWh0-GZ_< z*m@az#OlUMtaB7x1bI0=tQT98*;~E#9)eTFo`TjMRMUc2o~2HYc{BZ~(Q%~yG*9Ti zUrk09-(5~PJvJM_KY%;o^cedZT`%GE82_H?zEe++VHtbE>9Lhaxjtq3!`8aNZ{B#` zwC9BhvETHHH=l0|H~5_&t)v8gvty@{D9=%HgWv3!-t-hV0rD&EY;N#lXKIur_cUMH zj!J#*G;Z*#S#AR4SL{tU_?=%Eqy&Cdnqq?A%m`QHH#>$m?cJ%V&zb86znZVYZqm#v z?_SJ#HX!+Y_ZOpo4@>$0;z{uT!;)r1{W~PxjJOzY?4L`TdtMpZ^OB^S5f@`T7RuoB zU0aOtSnEy(V{dat`kj(yON!yaKS`SXUX1bjkfgB;k)EQyDrxpaF~;i=Nn@Ks>DlVX zl19?h_gqH$j~VHVFG9@iH5lBqarKqKAZ~b@8iQ*s;O-5{%9V{Kj_>LY#=`A}_l9Fp zn;7q09t^fcgRRl-8-nI;`9p;(Z&EbmpxJ+MP5vU^vwts_!D-gWNH-I~Td+>diP zT=}N%PvaC!U7D=BJ#;s?tGBZ!vUohd)2>hB7_@h$ak5gkrSbCYS1)qKFC-T@uLzeXGtei%Aj+qBQSOuuj;^bZP;B2EbB zA^xE7?-74Tcogwd!jn+;Md2v;HQ|pU<}W>2*Byuh!u(O#mBMqOzg2iL^uxlRggh?% z1Mq0REZqtB79^ra$~G19ixa!rV)?3V#l~ z%QAF&gkzAuSNK=p!@@5izC)P5eEhsHe`WM7VfO8Jg|~t=UgY#)7(7*&=ktq&TcP_8 z9=_J2vr{++I{zp<8+@biAo!5*+hPBs!cRf|S>Xw&>np;1<$qiFqu|Gd1K?i@-voW0 z{pj;{$gjX_n#?=*S~44suwIz&j%KpF-XbFBp1ez#XR!UE!@ce+d4q@N?kF*|5(S7Q%GlX7D^R{LDogw+L5*-zB^a+%Ak? zC8%!U&wy_b{vP;W$a0)GD$Mo!d2*Rj9Mi9g{x2Z^y2v@-zbo9k?*TBxNMdx3k|1ufv+6MlE$ajOYavV9&#pjdZ+keB(R5I>n3^Rne zS5=7){jVm&=EuO7kU4M&ZxiM^TIbQ&eT?&%cIv=? z5a!(Tp&gVj1Lq6VPu@!?=RIMD@D<>4;Wc1$uZ0fVQYZ3eu(_YgI$cFMm_D0(Cb%5D zS>*JY_dx2<=Qd&b+$l_-N?>Xa7>tO z-z&^M+%L?v|32YH@DZ}Ceg4eY^6kP?q4Nb{?g@93W$l~y7Z_cm?icwi@Wa9!i^qi7 zmQgYdB0THimxOtydsUcq`S~7!KJ63;vyCOfoIf*#*{-?5o52f&cYqfQH-j$~-U(hQ z+zGx)I0oJ%%zcUdo`pT64>7-!Aon9?{}!`R2%Ni=??-%v@Bm`^$FbfT#uKDd==s~B5y#<^R2bh<>45ZcDQD56}}De$M9iY+~dC_@~MaG?T!-sb<=Op(&KbT|A`CxT0{K}6tG8r+Zvhsl^BIYfaG{HL7rYQD(vnl%1X z&N?}V$o#v)GGY43xkPyZ;x)qgh_4prRm;q0=+MXQBBzh<62_~?{F;e&*bmo<9K&Je zBIRrcLpD1Mfxc#=uNdfG_F{vk@3J}B5!k<)n-2o_4*PzuAd8&iW#7vzX5~xCbOvD+ zK32}Lc---H!<`NBp>O6Jp*mtUoUZ zbIzX;=34w8Va`F`H|$uOyEDd}{WDGEzf%q_h1{Gc!5qgQiTv&06J%NAzZ9k&-hb>G|D$joxFHcxF$su;QmX+0K`2Cth&6J_N`l#%1yS$?ELQ5) zkVUat3)QMsTbEKqYAaf+6cyK6t5l=a*0yd~v}mQgzu%l^?wNaXL$Q7TdY=#Hp6@*K z%rpC(IdgAVGjrZ7t+leE)k5Wmlo~f)sml>L$ry}Nr>g>$tMnj!Z2!UiLj4Env-LT> z2KG`aDM$6|cPdm$h0;~1|I~h8={IMvQpuuERVpP(hx+&H$Cwd=HR5_51;aUmr}Uka zrd01-eOj8A?uvr`6Z@T#Mw8SOHD@rR`w*1s8)r4I-`Dz%80=a0i;MAeX#t&5M;)!_ zn7sQBMU4gwK%wb&Ac193YS0*yQ8-thF*wqXWf+`dipf$80jAoj9o-Ktm7by|z$Sy{ zgLGII^ktHvHc1kiW|*Id!DATb`CxE(uAbne%%nf+M~o2t;(q7#Q);9eWEP_)#fp;D zSE+~-MCvRp^&Fjr>g2&ew$~9#<-pR(|5zsoKV$l#bHkcBjP($Mz^@z{tpLuF%y39H zBPH2z;3G++5Eu&lNV;S)KQ)E`#zRs{bzQScO6tu}QgVuS^FrutDpO6!qz%0^lN!&P z*k)Y<)g_2FSzHcC%2v9!DU9Ai4J`(PMjhl0d6S1BK3X8t4X5Uld zJzto9fYts0ABW9@v(*anxFBI3^?q}30$YLo?cMD$WLwOTg;{*o7sYkO_0|pU@KlC} zN}zTauUi(1l{aFxSjVGETPl^lg^7}`){$zZZ?%^3{c(FPOyY|XHzML&?Waf9YFS+F zo8WjfKSrtSq}~}^hpnJGw;`f?br#q{stm45R$%{9Li=lC_QN^rt-$^u>@x?5E_0ZT z%-}L<1!ia9q29e1>t>3{2-mCrX8PaZHT|#nz*ON=#|k`cN$6?TJTZxH$2o^-ah1W< z+6p{Bm(cSS*0UPUWy}if55PY2L|gUAHZp^c4=XU6-X~GjSD7UaW+Pm$`qK3G;Whnj ze4y%lY+8Y*pC$BEWDDpG&7zp&xEX%#k&UPfK8LIz%l!$nY>&^f-DasWcG$GIBl(}P zQ;hF+uaMhrlx!q8UXtbTu6Np4FZhHVe8-yDU5rhuY}d=$byd5rZrAZM?dO}2>0$bP zjO3+$%Iz>_>?1aJHP%LX8NXob72iiMx_zWFxP7sLDraEZ8(-yNSU;B7DyeaNm|KB; zciS6cwrV#P@gy||GeGN4KJJT8^A4uVrsg#?)-P);sf|=t*Hkp+l{A*ORM*v?n4dpk za$Xfe7nL+tlY2LE3vb@|}{-dV4uB@h|yh5EmwYX4R&7!Mf*Hy7~ zRa{oz=*Rs>iHcR()Z(~O_mGt-bur3VTv}aMjN;nDv)GezPs*JbE4(Uf#9KmcSwjO~ zHJX~s8LHx&DY(3%5{zk?=UG*GuOlg5f1x2gI!W#savv=Bbh)F^g{I2=-&+<0d>q}) z*G$n2lKU~;EY1{-Ek}1BE5sr+&z5jrH!rKL%`9tkmT0>ByG&w&Id-?)V7=~GW8GfR zquZ?#Gt4IXb}Z2~q8b`V91bM0Egt&(e{6o8fuw#nl}b#o8otHm9xS?7w5SJ5-&coN zgr?h)ogSda(4%e63i7PPh5ndUp4=EZ{A4o=x*r ziLq&Hd;9s^7D#I??cKNhjabGy`jc2kZ;>cFL+t#truJ^Lw_%&f07*Ym?p7cATP%ya zB+8l&m#|;HZ-~ZbVx9OFclTi7SPsLopJZN{wEk!Rqmb5H&9S=U4Xk}s`!nsYw_mOQ zrq#}@>t5FHZTx(rZvAjw*NMAypU$dvmDzg#>l>fhIBMg7jj5dj^m)2z~eMXKNF z+Krd$V9KoPBiH*W54C>Kn%cS7@!qGir*P8Rzaw|XGpDPyo2s^}PiK5i%c1eg*4?^K z=Pup91AA0cb}ydc?pimG_*8jqr?o9;i?-Fbt!evC+xOe{eW!;I$nEtz%QSEI8!gztMs&^&q^st`9_M~?|NVQ$3C5E=Z2gca*Fiy+;eg& zb1ur!T?4z)287TspbeLye$W@^W}%#E2_GVjZDV}7Gw(KY%~{m78# zlHW+)m#p`%>v|`5-}ra?9~}8k+NYVP>eP;s%x`4=RzIfo^;`Pf*QZAB8v6TGweu7G z{!xcUEM2!eU+rIdf!bMJ{G8J(kD$*}JKjj$ms&Su4ZLo?&ac%o8(%l0fPMLT>octn zx8BqG{nqcau4%1rjkYdmJ*_nleSCZuTiEtpu(j{fOS>B4EPRdIE4Fo?!PtCPUxKrx ziw>!s@2vZDoi{dX-|W*luv2w@*wNMTM&`auJz~&^J$k#oU3>Z45$lb+#65qPt{i*r z!KIxm^4t=~Yuz&K)mcYRKyUgpq&$zK^!R*gJs+;8VBNcq9lv&MxligHI?|QjRnS#v z+Gj&{@_xU*do*jD@y~&s8J`a9^z5R4yfa7b+^rw<(!F`sTg>rBeYd`)<3~f(hr9Fx zW)z)|k;0f&`fBa95kogb^oM(5yd;W3P6ae8ewPGabD>mGi*oJ3ID{--EIG zL!-56nBMyOZU^#+tsU{BCbe^P+$f-Dx2^3~6?<;rA&6FbO-@?Ggl%j-fbmwib9Tc6 zzhF2wU>^yD(*xmPd_GoGH-ElQx#3`X#<}sCf$;o5IG8?IzevFT_&_+AzW))F7cPwS zQr>HiA70w7OWNVVlVH5B_g?;?h~4!BjnU z#TWD9dk?msH}d1PzV(rgy!iBAtZcnh{A{$jC-#!2yuSYL=0IZKHs@d;`1<&I9_hN# zQy&JW(~U1;#z+Zt@YGPmA30Lw*-d|`{|BsL?teh?yZC2LVy&Mh(WpQCT+r(4Ho3j`lFIZH_Vw`% zY4!iETjEpoH0%?5*^2FjcW^cX2b}!M&K#;uoqADYb#sN{cXM$He)T4b2AmUr+o0<1_m8`6rw1n%uzYQByawaBi9MCKJNZhLXl+)l_{+ zMYLIUw=GMcD^H-SN}#Jwpj)0mSCc?j`=6csn~IuK`tDU(q432;^Axw5C!1z44HC0I z*)-G48mIK4V!N3PR84)|vWWTMg5xK(?y8o1Ch@VJ<8swl-%^L~50Sfi)+YbBtjp_LN^9_tz;O18;jLjYCle+Z=U&s!tVQcZS2UN_L{XM# z^TiDns?J-!OG}z6RCB#oJeAvYacy%+DeldU-o46FbH&PLm0MoYT%vMIo0@% zC8ec}6)RM3V?|AgsH*EK>*EwP)pZr3pqJcOA)Qg_Ip`r8qbxTNWokFGst0{p4|)#l zfTvh%+e*Y|6pKbeQ^y{njpxG|pr{F=yLD3{BN@xJ2|dILm^fO}q5%`+9!r}zIyQ$6 zo3HXM?eO+AHT8C|c;SYY(mL2+&X_)siPKn8w=AHuD$jzy#QFj<9JYMQW1D7VlHBc0 zb^t013bOsqoOa%J#LP7Y81Ny_hGUjhB*!9;2e|CF_s94$g8%Wn*jpL8a!#LLW zMqIAHXW?%kbXIKnehP(a*VTjFlL5OAd$4;uV5f#C{0`k0n=gNo?B<&byNGXQ;ut)H z%dPKv)R*;}hHH?-F`OOnHy{4&b{5eweZB;ao={MEo<8mN z!C#{G+Z^yW9{%ij=9*&tJr?lyJp8ertRULR!vTLYobru;h4uGFz~5`|XJ2pV$oktG z@K@-RZ{zfDg29gBF|e&+@J)xlqc4n(ZKqJY0!o$_&wxBgZJ{9Oxw_BE0& ztv~*B)vfPC@RyJHX}FHVW&K?j@V6cQ@GmCT-^PHycb)Q`;P~4X@V5uf>}xHZT7UNi z{3V~Q)aQt2`S^2vTfSEU{`O)rCYo=*4fw;K>BQEnJjdTZ0{-5DzeM%@DBv#*{_K34 z;P^|&gO_!JxslJ{4<{5cvGpAUJGVb_;4cSOtnW#{t;BFy_8r3G(%BE~ zJH%%L+sBiAhsFRV*&yT7RT3!?BR>JJbF#3OUT)4lw zKQ25#JuYF6(=c*;MZysi9;DuvFrNuw{A7*$Wl98B82vv~!rViK(f<=AOdFPg`%(&* z*f7Qe|6qvX`5Ue(B+RurjPY=hgt?~*V?6M0kSOzUg)tt!7neR;-6vtMzQ?LxNjPHc z$Ex2+n0taS#shvGXT;0@1ce{57~wNHjPbyIkrn!k1j5G!!V?4G(*ohI1;UF0;bJ_#1&sEa%-l2b;Q3NCTGQNAIT2$4m2Ij#2~bjA?m=bsN}Sp@ zRW`wCw36R4@esGE5}~G+QqQKgr6y+VT6%W&I}IsaqHiRqi=9kGqh%{gq75yL710&d zjm<43HJpQdC(`mrrd}+>aBcK2Nw5_l3fZNQ)nA8~Y#N z-r(q02v5cR8b{CH4bcA{-0yVs_X>C6{)D4{TKFT}-*WU^bLl4;Wzf99EKhIYblgWe z`W#{Y5odv;pC!B&`U`~b$GuGWAE-OmOZumNl`!{_ZH|7EFx2WENB=Y7BIuuT^v?@d zLH`#=|AFvo=zF0rZN6#3tV&6&SCVDRxLTO|jtykVYopjN zh5kCxzlbty7X2pZe<=F>(BC8aXQ6+P%!e-I7s3oaEjFp>_m_kt;4U&31ISy#wBIi_ zC&A{R@LX`O6we;ns=mT(iY#&%06A8eekPEmUQ@|v6P}CB5$3#ENS1B!xx%?fTSk_& zHDZ4)>|4Z!Yum-boU=%9wd{FGox{D9`p{sOZ>W^{s6Up)l@Fii^Wja~%noCAr``~}E@Gx{hDVfHQO5q5& zkt}IfiTwoFZxH7B(MGYyO?3*hoOhFP-axrmnETR)$l~+YWR#}{ex4WZ0RK*GPR1O1 zL-c*Yp9_xzr}Xyx&w&3v!o}dBjy}`TpCtSyY$gjI0MB#ug^qp|c_<7ZYlKt5SCOUs z9pte}an0Bwyaap~Szfp95oYuLoGfV{6Z_S$e@^&T@T=rwm@A$;!hGI-AU2P}=78`k z;3O1E%d1>3VY6Q+OJ2jtW3lhY{2M2n51t_QXjXNyFz4DlGMzvQg}LW1CX3GsGJGz9 zpGM(tfmew=>$^rc2YjWYzt+*;MwVC4JB68c8(H#tn2fx3!2eUiZ-QSUkAyMg6=9bD zuVTYj_P-0`KXp+D$?{sOafm^V!2T$*`hwmVZ=!F5{xs1qfqsVQIsE2}z76_?qQ3>}Lp>Q~n+TgG;pyPZ9R0T( z{SCs4VDmlU2JlbFDF5T|zg6^nC*Lmo5%?EmwBc0L>j|;{J?x(qo87Q^QFt%-U2--6 z@}V%t%;#k3i`#H)| zvg|9Wgc&sZOh5#@QuJfMYlZW{SCVC4!M-7LoPSrC`#0`csi(c!i-NiL;C|Zf86Fa5 zk<9l#n3ycXQ=&&uy+oEh1D|3Fm_ON8|Q+ZT7dQIPD8X&vsZW%q4oMa0I-ZEYIIYVWz!A7~QWf6K2`? zoi>g3VqU{3bX<^n8Yn68;x>tT3PT6Ug!m{j$T;gjvTq!WhD8 zAz7ZA=L^%OOqgwWp)lL9NtkVTDOsMI{9kq~o4q>pOw0czhk8CwzfYFu=Iz4F>po%n ze^8kI9}(ud^dy-8c|n-N@>OBl^FN-U4X5*a!jr%s3m1S73eN}k#`DZR2l+pDkXfD# zVU~ZCFv~Vpn0ZYgj|4!zEQ~HRKM1Ct^J0$ZnRX#ro`dHLv;8ZCIo@i8*`zJP5%3x^ z0dj>f^ZJf3{oEkTuHPce;{8ZC2YjFK@!+46vjC7^3A64`3bXDn2($eB)iUi(JCjF4 z33*SLd3`KAkr8;-(q=l4|4SKp5t!d?ke7qGKOi@NBf_h}Kp zP24}nMf+!Y#}x)sOxZXfA#T~a>BWZCu;u4`2xa0~f%_@cyFQ_(xIWpwVbQaFExYZ& ze3K&H_qH@8v%NWXtv$nWdBKL_=5;*6;TcA4p2tZTS7#z<+7?^`E~U*(&!!GH+OYkb zsh{QPSCh~1_)4<0Lo1l}H{srai)Sm8>u~iJ-UPP&zL`85ACS9oh36Pl_u>|UpO0|g zK|Kozc@$T8u0i!OS=z0OJkQg=OBO%-!7R`Hyi*URn10OmI1M-3cgf(CLQhYd6b@zx z=Sd32Fl7iXJ;tE<9^LMp*#1^Ojx6?*9Q_nBI~l@mu=Z>MySFKF^oz+HT##~H*1n1? z^QhU;uOzd8koCB%{RXn^H#!{sCNc*aeo~QdA{Qd8Zdb8(M2Oc%7t z$9;-0Ze~5PX=jU`emL~0=lotuma$hZ%zPRgZWgBRwGOWrJ{9*(!nm3FZ1?tNY{+_k zx7eJ5`*w#P5~iPLg>h3a3bQ<24!agavrhn5n<}h7!Wx9=(c0)Hs_V~{V;1Z_F{3p1~yg_+kd;gw*X8`8cQ zJYIM-{FpQUp-@83q#n#?1<&&A+GxHD5IxWA?Ao|in0<7$!>z(>PoC>p`#T&Pp5@uK z^l@SO;klmGzb4G`{MF(29ebYZ*|j%KnA2*g!tVYb6=hxZ7xJ$d$L?f>N1 zn0-D6HiZ8-v3>V3dwbFI4;-ndf3vq29`D$j{k%MDW>61izGgo!TqJtBtr7+*^Zf#B z*lsIDPhRc#X(dOXgmeg}f;T&St1#R4USST=t-_Y=9Q(H%n@=46On5cy({SEL z|Kx$fyTPM{xu+c?+!yOffiTo+hVb#=xehN7=5vqdp7ehBHS0uKh&k3JXe_g&T~v_U*^~_56uM%;xgwI_ed0uX}d>? zkQoUXhs*8_^2uRpWe+C%?E-}Db9^>g_SJ=C4tU67T=rSBl*|kvRk-Zh-awYUG5g7` zv1`d#Cn+0n*|n>cEbG!HvaC6q$q{@&?!aZ|!o6hl7iBvx+vYpT(#}A$Z{R)I;Z(A; z6`PWrkNZHf`yK>76*^YWwjqm7rfq~QXSU3eO#L{rwC#9d>hsCc&Xa^WAE%Jn>5x-! zkt4Vlkfr@+2(t@jlcg{C%pgZ_FC@#}qez%%kBiBy1f&=jnQgF?Eblet!gO0jmcFYI zW;->I<-Mj^nC-EWOn|J$MV^oQTC#kfwO*M1H;|>TuNG$ew34OYJA@;+Zz4zV0l5j6 vj(G0^n-w?qvW$(pg?V;#FInd7R$;coc5)6rAP?ap)6f3`&vk5@ literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/Simon_Code_FixSound.cpp b/Simon_Sketch/applet/Simon_Code_FixSound.cpp new file mode 100644 index 0000000..57495b9 --- /dev/null +++ b/Simon_Sketch/applet/Simon_Code_FixSound.cpp @@ -0,0 +1,666 @@ +/** + * 6-19-2007 + * Copyright 2009, Spark Fun Electronics + * Nathan Seidle + * nathan at sparkfun.com + * + * Released under the Creative Commons Attribution Share-Alike 3.0 License + * http://creativecommons.org/licenses/by-sa/3.0 + * + * Simon Game ported for the ATmega168 + * + * Fixes and cleanup by Joshua Neal + * + * Generates random sequence, plays music, and displays button lights. + * + * Simon tones from Wikipedia + * - A (red, upper left) - 440Hz - 2.272ms - 1.136ms pulse + * - a (green, upper right, an octave higher than A) - 880Hz - 1.136ms, + * 0.568ms pulse + * - D (blue, lower left, a perfect fourth higher than the upper left) + * 587.33Hz - 1.702ms - 0.851ms pulse + * G (yellow, lower right, a perfect fourth higher than the lower left) - + * 784Hz - 1.276ms - 0.638ms pulse + * + * The tones are close, but probably off a bit, but they sound all right. + * + * The old version of SparkFun simon used an ATmega8. An ATmega8 ships + * with a default internal 1MHz oscillator. You will need to set the + * internal fuses to operate at the correct external 16MHz oscillator. + * + * Original Fuses: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m + * + * Command to set to fuses to use external 16MHz: + * avrdude -p atmega8 -P lpt1 -c stk200 -U lfuse:w:0xEE:m -U hfuse:w:0xC9:m + * + * The current version of Simon uses the ATmega168. The external osciallator + * was removed to reduce component count. This version of simon relies on the + * internal default 1MHz osciallator. Do not set the external fuses. + */ + +#include +#include + +/* Uncomment one of the following, corresponding to the board you have. */ +//#define BOARD_REV_6_25_08 +// #define BOARD_REV_4_9_2009 +#define BOARD_REV_PTH + +#ifdef BOARD_REV_PTH + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 3 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 1 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 2 +#define BUTTON_GREEN_PORT PIND +#define BUTTON_BLUE_PIN 4 +#define BUTTON_BLUE_PORT PINB +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 4 +#define BUZZER1_PORT PORTD +#define BUZZER2 7 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_PTH */ + +#ifdef BOARD_REV_6_25_08 + +#define CHIP_ATMEGA168 + +#define LED_RED (1 << 0) +#define LED_GREEN (1 << 1) +#define LED_BLUE (1 << 2) +#define LED_YELLOW (1 << 3) + +/* LED pin definitions */ +#define LED_RED_PIN 3 +#define LED_RED_PORT PORTC +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD +#define LED_BLUE_PIN 0 +#define LED_BLUE_PORT PORTC +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 2 +#define BUTTON_RED_PORT PINC +#define BUTTON_GREEN_PIN 5 +#define BUTTON_GREEN_PORT PINC +#define BUTTON_BLUE_PIN 1 +#define BUTTON_BLUE_PORT PINC +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_6_25_08 */ + +#ifdef BOARD_REV_4_9_2009 + +#define CHIP_ATMEGA168 + +/* LED pin definitions */ +#define LED_BLUE_PIN 5 +#define LED_BLUE_PORT PORTB +#define LED_YELLOW_PIN 5 +#define LED_YELLOW_PORT PORTD +#define LED_RED_PIN 2 +#define LED_RED_PORT PORTB +#define LED_GREEN_PIN 2 +#define LED_GREEN_PORT PORTD + +/* Button pin definitions */ +#define BUTTON_RED_PIN 0 +#define BUTTON_RED_PORT PINB +#define BUTTON_GREEN_PIN 1 +#define BUTTON_GREEN_PORT PINB +#define BUTTON_BLUE_PIN 7 +#define BUTTON_BLUE_PORT PIND +#define BUTTON_YELLOW_PIN 6 +#define BUTTON_YELLOW_PORT PIND + +/* Buzzer pin definitions */ +#define BUZZER1 3 +#define BUZZER1_PORT PORTD +#define BUZZER2 4 +#define BUZZER2_PORT PORTD + +#endif /* BOARD_REV_4_9_2009 */ + +/* Define game parameters */ +#define MOVES_TO_WIN 13 +#define TIME_LIMIT 3000 /* 3000ms = 3 sec */ + +#define sbi(port_name, pin_number) (port_name |= 1< 256) + { + TIFR0 = (1< 0) { + delay_us(1000); + } +} + +/* Light the given set of LEDs */ +void +set_leds(uint8_t leds) +{ + if ((leds & LED_RED) != 0) { + sbi(LED_RED_PORT, LED_RED_PIN); + } + else { + cbi(LED_RED_PORT, LED_RED_PIN); + } + if ((leds & LED_GREEN) != 0) { + sbi(LED_GREEN_PORT, LED_GREEN_PIN); + } + else { + cbi(LED_GREEN_PORT, LED_GREEN_PIN); + } + if ((leds & LED_BLUE) != 0) { + sbi(LED_BLUE_PORT, LED_BLUE_PIN); + } + else { + cbi(LED_BLUE_PORT, LED_BLUE_PIN); + } + if ((leds & LED_YELLOW) != 0) { + sbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } + else { + cbi(LED_YELLOW_PORT, LED_YELLOW_PIN); + } +} + + +#ifdef BOARD_REV_6_25_08 +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111111; + DDRC = 0b00001001; /* LEDs and Buttons */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */ + PORTD = 0b01000000; /* Enable pull-up on button 1 */ +} +#endif /* BOARD_REV_6_25_08 */ +#ifdef BOARD_REV_4_9_2009 +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11111100; /* button 2,3 on PB0,1 */ + DDRD = 0b00111110; /* LEDs, buttons, buzzer, TX/RX */ + + PORTB = 0b00000011; /* Enable pull-ups on buttons 2,3 */ + PORTD = 0b11000000; /* Enable pull-up on button 0,1 */ +} +#endif /* BOARD_REV_4_9_2009 */ + +#ifdef BOARD_REV_PTH +void +init_gpio(void) +{ + /* 1 = output, 0 = input */ + DDRB = 0b11101101; /* LEDs and Buttons */ + DDRC = 0b11111111; /* LEDs and Buttons */ + DDRD = 0b10111011; /* LEDs, buttons, buzzer, TX/RX */ + + PORTB = 0b00010010; /* Enable pull-ups on buttons 1,4 */ + //PORTC = 0b00100110; /* Enable pull-ups on buttons 0,2,3 */ + PORTD = 0b01000100; /* Enable pull-up on button 1 */ +} +#endif + +void +ioinit(void) +{ + init_gpio(); + + //Set Timer 0 Registers to Default Setting to over-ride the timer initialization made in the init() function of the Arduino Wiring libary (Wiring.c in the hardware/core/arduino folder) + TCCR0A = 0; + TIMSK0 = 0; + /* Init timer 0 for delay_us timing (1,000,000 / 1 = 1,000,000) */ + //TCCR0B = (1< 70; x--) { + for (y = 0; y < 3; y++) { + sbi(BUZZER2_PORT, BUZZER2); + cbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + + cbi(BUZZER2_PORT, BUZZER2); + sbi(BUZZER1_PORT, BUZZER1); + + delay_us(x); + } + } +} + +/* Play the winner sound and lights */ +void +play_winner(void) +{ + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); + set_leds(LED_GREEN|LED_BLUE); + winner_sound(); + set_leds(LED_RED|LED_YELLOW); + winner_sound(); +} + +/* Plays the current contents of the game moves */ +void +play_moves(void) +{ + uint8_t move; + + for (move = 0; move < nmoves; move++) { + toner(moves[move], 150); + delay_ms(150); + } +} + +/* Adds a new random button to the game sequence, by sampling the timer */ +void +add_to_moves(void) +{ + uint8_t new_button; + + /* Use the lower 2 bits of the timer for the random value */ + new_button = 1 << (TCNT2 & 0x3); + + moves[nmoves++] = new_button; +} + +/* Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms. */ +void +buzz_sound(uint16_t buzz_length_ms, uint16_t buzz_delay_us) +{ + uint32_t buzz_length_us; + + buzz_length_us = buzz_length_ms * (uint32_t)1000; + while (buzz_length_us > buzz_delay_us*2) { + buzz_length_us -= buzz_delay_us*2; + + /* toggle the buzzer at various speeds */ + cbi(BUZZER1_PORT, BUZZER1); + sbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + + sbi(BUZZER1_PORT, BUZZER1); + cbi(BUZZER2_PORT, BUZZER2); + delay_us(buzz_delay_us); + } +} + + +/* + * Light an LED and play tone + * + * red, upper left: 440Hz - 2.272ms - 1.136ms pulse + * green, upper right: 880Hz - 1.136ms - 0.568ms pulse + * blue, lower left: 587.33Hz - 1.702ms - 0.851ms pulse + * yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse + */ +void +toner(uint8_t which, uint16_t buzz_length_ms) +{ + set_leds(which); + switch (which) { + case LED_RED: + buzz_sound(buzz_length_ms, 1136); + break; + + case LED_GREEN: + buzz_sound(buzz_length_ms, 568); + break; + + case LED_BLUE: + buzz_sound(buzz_length_ms, 851); + break; + + case LED_YELLOW: + buzz_sound(buzz_length_ms, 638); + break; + } + + /* Turn off all LEDs */ + set_leds(0); +} + +/* Show an "attract mode" display while waiting for user to press button. */ +void +attract_mode(void) +{ + while (1) { + set_leds(LED_RED); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_BLUE); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_GREEN); + delay_ms(100); + if (check_button() != 0x00) + return; + + set_leds(LED_YELLOW); + delay_ms(100); + if (check_button() != 0x00) + return; + } +} + + +/* Wait for a button to be pressed. Returns one of led colors (LED_RED, etc.) + * if successful, 0 if timed out */ +uint8_t +wait_for_button(void) +{ + uint16_t time_limit = TIME_LIMIT; + uint8_t released = 0; + uint8_t old_button; + + while (time_limit > 0) { + uint8_t button; + + /* Implement a small bit of debouncing */ + old_button = button; + button = check_button(); + + /* + * Make sure we've seen the previous button + * released before accepting new buttons + */ + if (button == 0) + released = 1; + if (button == old_button && released == 1) { + /* Make sure just one button is pressed */ + if (button == LED_RED || + button == LED_BLUE || + button == LED_GREEN || + button == LED_YELLOW) { + return button; + } + } + + delay_ms(1); + + time_limit--; + } + return 0; /* Timed out */ +} + + + +/* Play the game. Returns 0 if player loses, or 1 if player wins. */ +int +game_mode(void) +{ + nmoves = 0; + while (nmoves < MOVES_TO_WIN) { + uint8_t move; + + /* Add a button to the current moves, then play them back */ + add_to_moves(); + play_moves(); + + /* Then require the player to repeat the sequence. */ + for (move = 0; move < nmoves; move++) { + uint8_t choice = wait_for_button(); + + /* If wait timed out, player loses. */ + if (choice == 0) + return 0; + + toner(choice, 150); + + /* If the choice is incorect, player loses. */ + if (choice != moves[move]) { + return 0; + } + } + + /* Player was correct, delay before playing moves */ + delay_ms(1000); + } + + /* player wins */ + return 1; +} + +void setup() +{ +} + +void loop() +{ + + /* Setup IO pins and defaults */ + ioinit(); + + play_winner(); + + /* Main loop */ + while (1) { + /* Wait for user to start game */ + attract_mode(); + + /* Indicate the start of game play */ + set_leds(LED_RED|LED_GREEN|LED_BLUE|LED_YELLOW); + delay_ms(1000); + set_leds(0); + delay_ms(250); + + /* Play game and handle result */ + if (game_mode() != 0) { + /* Player won, play winner tones */ + play_winner(); + } + else { + /* Player lost, play loser tones */ + play_loser(); + } + } +} + + + + +int main(void) +{ + init(); + + setup(); + + for (;;) + loop(); + + return 0; +} + diff --git a/Simon_Sketch/applet/Simon_Code_FixSound.cpp.eep b/Simon_Sketch/applet/Simon_Code_FixSound.cpp.eep new file mode 100644 index 0000000..7c166a1 --- /dev/null +++ b/Simon_Sketch/applet/Simon_Code_FixSound.cpp.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/Simon_Sketch/applet/Simon_Code_FixSound.cpp.elf b/Simon_Sketch/applet/Simon_Code_FixSound.cpp.elf new file mode 100644 index 0000000000000000000000000000000000000000..ccf0cf8f1b56b931eee6fb0684d6646a857b010d GIT binary patch literal 13913 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 literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/WMath.cpp.o b/Simon_Sketch/applet/WMath.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..d8792d0391c6e8f516c46ed92a0d602d3fa07516 GIT binary patch literal 7012 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 bU~*XEW_**}<32{;IL`PfzBN$}&Y}JfjQ7~5 literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/wiring_analog.c.o b/Simon_Sketch/applet/wiring_analog.c.o new file mode 100644 index 0000000000000000000000000000000000000000..619dd14ea8aaf4be84dfd1c846e7023490aefa66 GIT binary patch literal 6564 zcmbuDe{56N701uDlQbkDAxVK0QZOwAREixaqcqSG#P1bQ3M*ZwY{rQl+nZxYjst}v z;X=mNc2!9Y>sY60YAaT)(p0URI;ld6v`O2vA=-6+?03^mn>2NQgpK{E5X!#a_s+F% z992l&Ro=UwbMCq4-goYK_g&}Yj=ejLF=C66gHn-1#u`Mvh{pAv!75oIi^a5>yPDe@ zgUzkxfO({DUY$r_ximID2$e{1fdreo8#guXX&0$ceZ5Gnk0Nzpv!%&5S=rQT+DuP_ zf$1%^<$eJSTJKuzX|LGLfnB}tKY)=N*3S?dA?oOCZED11+weehD|(S;WA?Oj%$8+% zta+8DElr!7L|Rt}=icV(IVCv?M*%MoHC~LonV3)gR%_~NO?{m|>eBMKfwQ5D=;~RTCHDYLO6q;9mF7Wu z)dI^Y;GE%fR?G@ovNU9JN5!nNVk31GQFOfh?syMD@V)G_-R2yLWyI{W!!^+h%Us^f zp&hvUo)6g`SOVf9_-c`PGz&g30Ku46`fsDgbkfAsdV!RkhKAO(v)^v5Py)Tl2bTpPvL<+fF25m?3kxaTjk{lR_gv0!! zCY>F~jK&kPt-G&RUG1c+KG#*Bb=5bJ%U9YyR;NB>QaYc`CZn-zER#!y2bfhOg*eh9 zoZ{;j!7`0Rb$qD2q^tE)56|t>I;}gjp071xqtvbSBCSJOFRaqrp4L;vL#)bjfy&jj z^-!(vRD0WQN2s>DS^G!XSL?S{jc41fe>~Z3$f1DX{RUreo{PJmNsvW~CG0%spBp|q zF7o{O3oRE~&Yt+%>a(R2QXD@n#dxuVJLt>}nFx(PEGFb9=|CM_rtNa8r4wAnO97qf%@`>y~Lb#_}T`Vr#xP9@_e7ca36uS9xG+*um8{vlO zd#<7A74KsN;=-}G3+8KXevd|D@pyjihVrEBL{sTxYW7q<&PLi-y(7lc$#fx>iDD;= z7IM)-dMJ^P_U_szquG&kGMk8p2CyZUXM`|ia@l04+{#bwuKkaMwuRP*?+ve0LqC8~ z#BF3WQ>gf&wby^P6MRhy8>0mo%HbPPv0)Ey25euu0R~$oqB5 zQX%npLBjD^AtvGekr7~`e-s~u{{DR8h=lWrOiWej>|kz&B9qQ0R6#Fcn=N)>{LV9) z5TRLGKOEi^)P<8#?gR$$fwcqrv&`fMX3S`Kv_A_QJcTpwSU#3bR_UzDcY|2mJpa^U zF>3A=Hl_VDX{9^cSeD@;`zHr`c4doStldh8Jel3hj<1#NLk}GHLxL9Dwgs|fHm!lc zSKJnh-B46sP>~LtcYcM&PUv~|V;lEe9uaLHpuCEAJL$jQ6w7T7fn9%p$H#3_{qbmM z{l&D8jb94}vy7&)Kb%iy`1{3te?FYw9Bt$LPT=DFtdIHdw;8f6cJ4=^aOd}H`0Id< z{&+C7^Lrlb`g<7u-0jNxdsh3P^2!waagU@wo;j_*SHSFJ*EfiXS|3oCdBS1pYhc$y z&|>HQ7G%q8np_~V8#Tw}A=ZxjORzi6cKC}p3X7Mu4=S&$T3A^(q(s@@pTM>c4M(u3 zpCM?mZGV95&aWOv9j+7ScdNEh{tqtO2Pl`}uZy6?w*3RL>+e?hqaFR>(aZB|LU4!^balE1_sX2A=i{yb$LEeyDMA0oWLXjPqEZ%N z@BNf3D}w&7JV!=wof7na-jy{$|HqvpGczkC=w+5GbA>7;D2rrYMfAM)Rmopanfp>3 z=KqAsj7ckgaDGMQ&0c$>yr44onl?Po%PO;CUc6Q%|F}w?^=mE~J$PWpu4q&Mz0utk z_Ij{wTd!9ahKBL6O?rGhk!xl>dtQh;j$?r%}3+5mU@lP{SI$c=3Bf+nd3gJ%$Pi;d^b3zybt_^R!+040y5fS@508 zUj?sL{s#D7<(I&ll)nSsrp&woN{y~H*U$2Da1e23-1siH5m2~hbC!DO?Ya%holpfZ zXU4M&R}jpx)~lW|-0kT1s-CgxRpy-eF5AAJQ$6F;uS}Z^E^9Na`ctTjj($w_jLA7i z|8>>Bg!)^mzlfSwTL?E4KBH;#(EHZgoM%j|o;hT5o6l(V%u%kLE!L)ndc>3Q=3YR) z8#P~1GW#*_$zjxNBX^-*>+mO(8RxAI?@;bW%{{`-;j_w|QrzK`GM_c)@Q5uBe^F*G{Z08( zsHc>fOV^YKQD0YP{!A-#@8_A4b70Q!+dzIA+^Wo+nXmj!aHleJCZzldxDJ>1kFY9+ zyYfESLB=|=gm7^zTkO8-uhigWkn^AlI)n_O5V6Mgg0BZ2{ A=l}o! literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/wiring_digital.c.o b/Simon_Sketch/applet/wiring_digital.c.o new file mode 100644 index 0000000000000000000000000000000000000000..02809cee965fb2c44e4dab53cce05b8900f7235f GIT binary patch literal 8276 zcmb`Le{h^d8OL|;k~F_)o3u^S(jV70K+*P+l+boUTdtOt@~b@(5U9cHUG9<`z1+pi zC4~;qf)VK$u_5h9(LskFjx*{E%)lr!=#&wisp5Y{N1Tz&pp1?TP^>7z5WnBuXW#eD zwOD1?$-ev9XPcX=dbeF!lYHpQMp%ztFw*?}l!c8hXyR+_!x@+bsRUz_fr7A5dRTb4%;gb4Dorcn^ z%0Q3msJ^n^wKwQS9jm2I4Rorl)ey$3^}B>>m8$FTT9v9t#dF|-I(XZtX=1i7XP-HN zDlE>mib^%i!BpsbFQyuirlHh-yZpGT9o*4<{jUr?#qq1F`i`x>KRJzuExHS;)r z^9sapkw5B{^_%LIT70n?MKxC-iYCYvCjP-iFk(JJ8lED=h7W8o5`-3U4pnCJC26=j z&W6w|HiRlFZDDKGwpMLx)>@^ms?^oSu

|NylT64{4J%}_S4 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 literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/wiring_pulse.c.o b/Simon_Sketch/applet/wiring_pulse.c.o new file mode 100644 index 0000000000000000000000000000000000000000..8574958c5c72762756764ff3bfc5b4de39c435b2 GIT binary patch literal 6484 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 literal 0 HcmV?d00001 diff --git a/Simon_Sketch/applet/wiring_shift.c.o b/Simon_Sketch/applet/wiring_shift.c.o new file mode 100644 index 0000000000000000000000000000000000000000..2f318d06c30fdab697c1313d36a079948805eedb GIT binary patch literal 4084 zcmbVPTWnNC82)FsEtQr+K~PeV#h{?V*{VcHRU~q&N}z$DL@LYKOSeas-RATZXvIiC z#RnrxOT9#6d@#`mNK7nytwsbT--1Ni(kvgMq6sdRAW6hyuWpk^VuQtvWX{fI`Cy-_q#Ktg|V&mFrqWpkC zB=kV)^cdp<)oOkc3XvFw#zX702Hj&UiF&UbNFp&yo9gOA7D|nw)EG*!6v>{|@T(8| zTT<&WQBCP?R2$8t{}yK*c1xn#Dxt45dZLzYFoMWFwymDntd;9(C(!G$5xPBoWR4OId4*ThnmrWOQxwPZ(j~cI>D-Gle zvZqMPm$j7+%@Fin z)`vTa35O_cxRu+C+-mqj!xzoqRzJt+ml}@6T#SWH2+9%okCr*L<%KMAarnycwc+c- zQ^RvdmW^B)xi<2PbHn+}85{q0JdvI^ero)(b9MEFl$!ifH9ImkFj^d)eKs*EW1p*1 z+lx(?m5hy!o*I3AG%@*=a{Jy`({fhi^cr_OF#+Khosft0A1Ry3!CvZWIifGg>>l9K%vTCSugf*A`fSCWt5J_{{ZlC`iw z4vZ*wq*mxk4p@`r4N@9Wha#6Y7{X2b8E6Pi@BGezKu0X8nd`L7PkdT6p8u_v`Dwbpsic|h`R z;7*I7gAVz79L{F2J`+UqkNg-F^+qW^1abNY4+U-(Jn%!_Yf(@*8i>PTh?DK_2P|X< ziWxVX^$Ul^@e3u_sJwDdWtyVol?z6}EKY4-;!!=gUaVJ`8p|{-P2WJa3?FnI>&*4t za&d;vs=_pwz>F>Zcab&3n$x!^c=+B#{M8$W%$|A*g7*m&#zpC4~;n;TH~J4j&2 z+8%>!F-_;uSnZaqtpkdv%tiL%Ft3O4Ht6}p(8lxKg=S*_~$M!pn*Av>l%$QIM| zHuBvL&U{U1c6_IRBz7L?YWNjRCJl`kC_ZxJ~hpE@{y#;Jz0A(|RmJt}TwqeNe zd>_mW*Pre4(o z)R*xKMU96Fex)YlE16uSZ!n`Dp-hHiso?qQu!JmTjZl#`U(P{8$@SO(#2>!Ie9{6(xUjok? z{2us0gTDjsGZ;*c8O$?zk{EXnN#9+-Tx<5nF;MpoF*gJBJ{tAAz&|F2{toc-M*jr( z7e@aG_}2zM3;w;quYvzbY>q=C4v`(hJcD^YZ#OsvoHF=s;8h0S3*2rn*NpEE^Kfl8 z8oVF4)8HQ9E`!U!dkyA%xfcnp1%;%mM)-?wIqtJ10 ztpCQC&$bwT%HZSRoQw76ni8kL3o*=Eq&@)G@2bIrMt>NbdrzMw;IA9(gEtWK0D