atduskgreg-rad 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +104 -0
- data/License.txt +282 -0
- data/Manifest.txt +142 -0
- data/README.rdoc +55 -0
- data/Rakefile +142 -0
- data/bin/hello_world_test/Makefile +436 -0
- data/bin/hello_world_test/hello_world.cpp +23 -0
- data/bin/rad +302 -0
- data/lib/examples/add_hysteresis.rb +13 -0
- data/lib/examples/basic_blink.rb +10 -0
- data/lib/examples/blink_m_address_assignment.rb +104 -0
- data/lib/examples/blink_m_hello.rb +14 -0
- data/lib/examples/blink_m_multi.rb +61 -0
- data/lib/examples/blink_with_serial.rb +16 -0
- data/lib/examples/configure_pa_lcd_boot.rb +91 -0
- data/lib/examples/debounce_methods.rb +49 -0
- data/lib/examples/external_variable_fu.rb +26 -0
- data/lib/examples/external_variables.rb +32 -0
- data/lib/examples/first_sound.rb +23 -0
- data/lib/examples/frequency_generator.rb +30 -0
- data/lib/examples/hello_array.rb +48 -0
- data/lib/examples/hello_array2.rb +79 -0
- data/lib/examples/hello_array_eeprom.rb +59 -0
- data/lib/examples/hello_clock.rb +84 -0
- data/lib/examples/hello_eeprom.rb +51 -0
- data/lib/examples/hello_eeprom_lcdpa.rb +81 -0
- data/lib/examples/hello_format_print.rb +94 -0
- data/lib/examples/hello_lcd_charset.rb +75 -0
- data/lib/examples/hello_pa_lcd.rb +59 -0
- data/lib/examples/hello_servos.rb +88 -0
- data/lib/examples/hello_spectra_sound.rb +38 -0
- data/lib/examples/hello_world.rb +11 -0
- data/lib/examples/hello_xbee.rb +12 -0
- data/lib/examples/hysteresis_duel.rb +39 -0
- data/lib/examples/i2c_with_clock_chip.rb +124 -0
- data/lib/examples/midi_beat_box.rb +86 -0
- data/lib/examples/midi_scales.rb +94 -0
- data/lib/examples/motor_knob.rb +30 -0
- data/lib/examples/servo_buttons.rb +23 -0
- data/lib/examples/servo_calibrate_continuous.rb +92 -0
- data/lib/examples/servo_throttle.rb +40 -0
- data/lib/examples/software_serial.rb +10 -0
- data/lib/examples/sparkfun_lcd.rb +48 -0
- data/lib/examples/spectra_soft_pot.rb +34 -0
- data/lib/examples/times_method.rb +8 -0
- data/lib/examples/toggle.rb +10 -0
- data/lib/examples/twitter.rb +57 -0
- data/lib/examples/two_wire.rb +14 -0
- data/lib/libraries/AFSoftSerial/AFSoftSerial.cpp +321 -0
- data/lib/libraries/AFSoftSerial/AFSoftSerial.h +61 -0
- data/lib/libraries/AFSoftSerial/keywords.txt +18 -0
- data/lib/libraries/AF_XPort/AF_XPort.cpp +166 -0
- data/lib/libraries/AF_XPort/AF_XPort.h +48 -0
- data/lib/libraries/DS1307/DS1307.cpp +162 -0
- data/lib/libraries/DS1307/DS1307.h +66 -0
- data/lib/libraries/DS1307/keywords.txt +18 -0
- data/lib/libraries/FrequencyTimer2/FrequencyTimer2.cpp +144 -0
- data/lib/libraries/FrequencyTimer2/FrequencyTimer2.h +42 -0
- data/lib/libraries/FrequencyTimer2/keywords.txt +22 -0
- data/lib/libraries/I2CEEPROM/I2CEEPROM.cpp +120 -0
- data/lib/libraries/I2CEEPROM/I2CEEPROM.h +70 -0
- data/lib/libraries/I2CEEPROM/keywords.txt +21 -0
- data/lib/libraries/LoopTimer/LoopTimer.cpp +35 -0
- data/lib/libraries/LoopTimer/LoopTimer.h +34 -0
- data/lib/libraries/LoopTimer/keywords.txt +27 -0
- data/lib/libraries/OneWire/OneWire.cpp +194 -0
- data/lib/libraries/OneWire/OneWire.h +63 -0
- data/lib/libraries/OneWire/keywords.txt +35 -0
- data/lib/libraries/OneWire/readme.txt +13 -0
- data/lib/libraries/SWSerLCDpa/SWSerLCDpa.cpp +296 -0
- data/lib/libraries/SWSerLCDpa/SWSerLCDpa.h +69 -0
- data/lib/libraries/SWSerLCDsf/SWSerLCDsf.cpp +311 -0
- data/lib/libraries/SWSerLCDsf/SWSerLCDsf.h +67 -0
- data/lib/libraries/Servo/Servo.cpp +192 -0
- data/lib/libraries/Servo/Servo.h +61 -0
- data/lib/libraries/Stepper/Stepper.cpp +220 -0
- data/lib/libraries/Stepper/Stepper.h +86 -0
- data/lib/libraries/Stepper/keywords.txt +28 -0
- data/lib/libraries/Wire/Wire.cpp +262 -0
- data/lib/libraries/Wire/Wire.h +67 -0
- data/lib/libraries/Wire/keywords.txt +31 -0
- data/lib/libraries/Wire/twi.h +57 -0
- data/lib/libraries/Wire/utility/twi.c +449 -0
- data/lib/libraries/Wire/utility/twi.h +57 -0
- data/lib/plugins/bitwise_ops.rb +54 -0
- data/lib/plugins/blink.rb +25 -0
- data/lib/plugins/blink_m.rb +356 -0
- data/lib/plugins/debounce.rb +138 -0
- data/lib/plugins/debug_output_to_lcd.rb +71 -0
- data/lib/plugins/hysteresis.rb +52 -0
- data/lib/plugins/input_output_state.rb +84 -0
- data/lib/plugins/lcd_padding.rb +58 -0
- data/lib/plugins/mem_test.rb +37 -0
- data/lib/plugins/midi.rb +60 -0
- data/lib/plugins/parallax_ping.rb +50 -0
- data/lib/plugins/servo_pulse.rb +31 -0
- data/lib/plugins/servo_setup.rb +86 -0
- data/lib/plugins/smoother.rb +54 -0
- data/lib/plugins/spark_fun_serial_lcd.rb +100 -0
- data/lib/plugins/spectra_symbol.rb +79 -0
- data/lib/plugins/twitter_connect.rb +145 -0
- data/lib/rad.rb +5 -0
- data/lib/rad/README.rdoc +5 -0
- data/lib/rad/arduino_plugin.rb +246 -0
- data/lib/rad/arduino_sketch.rb +627 -0
- data/lib/rad/generators/makefile/makefile.erb +243 -0
- data/lib/rad/generators/makefile/makefile.rb +38 -0
- data/lib/rad/hardware_library.rb +813 -0
- data/lib/rad/init.rb +14 -0
- data/lib/rad/progressbar.rb +236 -0
- data/lib/rad/rad_processor.rb +128 -0
- data/lib/rad/rad_rewriter.rb +94 -0
- data/lib/rad/rad_type_checker.rb +26 -0
- data/lib/rad/sim/arduino_sketch.rb +57 -0
- data/lib/rad/sketch_compiler.rb +47 -0
- data/lib/rad/tasks/build_and_make.rake +210 -0
- data/lib/rad/tasks/rad.rb +2 -0
- data/lib/rad/todo.txt +13 -0
- data/lib/rad/variable_processing.rb +153 -0
- data/lib/rad/version.rb +9 -0
- data/scripts/txt2html +67 -0
- data/setup.rb +1585 -0
- data/spec/examples/hello_world.rb +11 -0
- data/spec/examples/serial_motor.rb +12 -0
- data/spec/models/arduino_sketch_spec.rb +82 -0
- data/spec/models/sketch_compiler_spec.rb +96 -0
- data/spec/models/spec_helper.rb +2 -0
- data/spec/sim/hello_world_spec.rb +42 -0
- data/spec/spec.opts +1 -0
- data/test/test_array_processing.rb +179 -0
- data/test/test_plugin_loading.rb +151 -0
- data/test/test_translation_post_processing.rb +185 -0
- data/test/test_variable_processing.rb +238 -0
- data/website/examples/assembler_test.rb.html +73 -0
- data/website/examples/gps_reader.rb.html +39 -0
- data/website/examples/hello_world.rb.html +38 -0
- data/website/examples/serial_motor.rb.html +41 -0
- data/website/index.html +178 -0
- data/website/index.txt +64 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +169 -0
- data/website/template.rhtml +48 -0
- metadata +217 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Arduino makefile
|
|
2
|
+
#
|
|
3
|
+
# This makefile allows you to build sketches from the command line
|
|
4
|
+
# without the Arduino environment (or Java).
|
|
5
|
+
#
|
|
6
|
+
# The Arduino environment does preliminary processing on a sketch before
|
|
7
|
+
# compiling it. If you're using this makefile instead, you'll need to do
|
|
8
|
+
# a few things differently:
|
|
9
|
+
#
|
|
10
|
+
# - Give your program's file a .cpp extension (e.g. foo.cpp).
|
|
11
|
+
#
|
|
12
|
+
# - Put this line at top of your code: #include <WProgram.h>
|
|
13
|
+
#
|
|
14
|
+
# - Write prototypes for all your functions (or define them before you
|
|
15
|
+
# call them). A prototype declares the types of parameters a
|
|
16
|
+
# function will take and what type of value it will return. This
|
|
17
|
+
# means that you can have a call to a function before the definition
|
|
18
|
+
# of the function. A function prototype looks like the first line of
|
|
19
|
+
# the function, with a semi-colon at the end. For example:
|
|
20
|
+
# int digitalRead(int pin);
|
|
21
|
+
#
|
|
22
|
+
# - Write a main() function for your program that returns an int, calls
|
|
23
|
+
# init() and setup() once (in that order), and then calls loop()
|
|
24
|
+
# repeatedly():
|
|
25
|
+
#
|
|
26
|
+
# int main()
|
|
27
|
+
# {
|
|
28
|
+
# init();
|
|
29
|
+
# setup();
|
|
30
|
+
#
|
|
31
|
+
# for (;;)
|
|
32
|
+
# loop();
|
|
33
|
+
#
|
|
34
|
+
# return 0;
|
|
35
|
+
# }
|
|
36
|
+
#
|
|
37
|
+
# Instructions for using the makefile:
|
|
38
|
+
#
|
|
39
|
+
# 1. Copy this file into the folder with your sketch.
|
|
40
|
+
#
|
|
41
|
+
# 2. Below, modify the line containing "TARGET" to refer to the name of
|
|
42
|
+
# of your program's file without an extension (e.g. TARGET = foo).
|
|
43
|
+
#
|
|
44
|
+
# 3. Modify the line containg "ARDUINO" to point the directory that
|
|
45
|
+
# contains the Arduino core (for normal Arduino installations, this
|
|
46
|
+
# is the hardware/cores/arduino sub-directory).
|
|
47
|
+
#
|
|
48
|
+
# 4. Modify the line containing "PORT" to refer to the filename
|
|
49
|
+
# representing the USB or serial connection to your Arduino board
|
|
50
|
+
# (e.g. PORT = /dev/tty.USB0). If the exact name of this file
|
|
51
|
+
# changes, you can use * as a wildcard (e.g. PORT = /dev/tty.USB*).
|
|
52
|
+
#
|
|
53
|
+
# 5. At the command line, change to the directory containing your
|
|
54
|
+
# program's file and the makefile.
|
|
55
|
+
#
|
|
56
|
+
# 6. Type "make" and press enter to compile/verify your program.
|
|
57
|
+
#
|
|
58
|
+
# 7. Type "make upload", reset your Arduino board, and press enter to
|
|
59
|
+
# upload your program to the Arduino board.
|
|
60
|
+
#
|
|
61
|
+
# $Id$
|
|
62
|
+
|
|
63
|
+
PORT = <%= params['serial_port'] %>
|
|
64
|
+
TARGET = <%= params['target'] %>
|
|
65
|
+
ARDUINO = <%= params['arduino_root'] %>/hardware/cores/arduino
|
|
66
|
+
SOFTWARE_SERIAL = <%= params['arduino_root'] %>/hardware/libraries/SoftwareSerial
|
|
67
|
+
LIBRARY_ROOT = <%= params['libraries_root'] %>
|
|
68
|
+
SRC = $(ARDUINO)/pins_arduino.c $(ARDUINO)/wiring.c \
|
|
69
|
+
$(ARDUINO)/wiring_analog.c $(ARDUINO)/wiring_digital.c \
|
|
70
|
+
$(ARDUINO)/wiring_pulse.c $(ARDUINO)/wiring_serial.c \
|
|
71
|
+
$(ARDUINO)/wiring_shift.c $(ARDUINO)/WInterrupts.c <%= params['twi_c'] %>
|
|
72
|
+
CXXSRC = $(ARDUINO)/HardwareSerial.cpp $(SOFTWARE_SERIAL)/SoftwareSerial.cpp $(ARDUINO)/Print.cpp<%= params['libraries'].collect{|l| " $(LIBRARY_ROOT)/#{ l }/#{l }.cpp"}.join('') %>
|
|
73
|
+
MCU = <%= params['mcu'] %>
|
|
74
|
+
<% if params['asm_files'] %>ASRC = <%= params['asm_files'].join(' ') %><% end %>
|
|
75
|
+
F_CPU = 16000000
|
|
76
|
+
FORMAT = ihex
|
|
77
|
+
UPLOAD_RATE = 19200
|
|
78
|
+
BIN_DIR = <%= params['arduino_root'] %>/hardware/tools/avr/bin
|
|
79
|
+
|
|
80
|
+
# Name of this Makefile (used for "make depend").
|
|
81
|
+
MAKEFILE = Makefile
|
|
82
|
+
|
|
83
|
+
# Debugging format.
|
|
84
|
+
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
|
85
|
+
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
|
86
|
+
DEBUG = stabs
|
|
87
|
+
|
|
88
|
+
OPT = s
|
|
89
|
+
|
|
90
|
+
# Place -D or -U options here
|
|
91
|
+
CDEFS = -DF_CPU=$(F_CPU)
|
|
92
|
+
CXXDEFS = -DF_CPU=$(F_CPU)
|
|
93
|
+
|
|
94
|
+
# Place -I options here
|
|
95
|
+
CINCS = -I$(ARDUINO) -I$(SOFTWARE_SERIAL)<% params['libraries'].each do |l| %> -I$(LIBRARY_ROOT)/<%= l %><% end %>
|
|
96
|
+
+CXXINCS = -I$(ARDUINO) -I$(SOFTWARE_SERIAL)<% params['libraries'].each do |l| %> -I$(LIBRARY_ROOT)/<%= l %><% end %>
|
|
97
|
+
|
|
98
|
+
# Compiler flag to set the C Standard level.
|
|
99
|
+
# c89 - "ANSI" C
|
|
100
|
+
# gnu89 - c89 plus GCC extensions
|
|
101
|
+
# c99 - ISO C99 standard (not yet fully implemented)
|
|
102
|
+
# gnu99 - c99 plus GCC extensions
|
|
103
|
+
CSTANDARD = -std=gnu99
|
|
104
|
+
CDEBUG = -g$(DEBUG)
|
|
105
|
+
CWARN = -Wall -Wstrict-prototypes
|
|
106
|
+
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
|
107
|
+
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
|
108
|
+
|
|
109
|
+
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CSTANDARD) $(CEXTRA)
|
|
110
|
+
CXXFLAGS = $(CDEFS) $(CINCS) -O$(OPT)
|
|
111
|
+
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
|
112
|
+
LDFLAGS = -lm
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# Programming support using avrdude. Settings and variables.
|
|
116
|
+
AVRDUDE_PROGRAMMER = stk500
|
|
117
|
+
AVRDUDE_PORT = $(PORT)
|
|
118
|
+
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
|
|
119
|
+
AVRDUDE_FLAGS = -F -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
|
|
120
|
+
-b $(UPLOAD_RATE) -C <%= params['arduino_root'] %>/hardware/tools/avr/etc/avrdude.conf
|
|
121
|
+
|
|
122
|
+
# Program settings
|
|
123
|
+
CC = $(BIN_DIR)/avr-gcc
|
|
124
|
+
CXX = $(BIN_DIR)/avr-g++
|
|
125
|
+
OBJCOPY = $(BIN_DIR)/avr-objcopy
|
|
126
|
+
OBJDUMP = $(BIN_DIR)/avr-objdump
|
|
127
|
+
AR = $(BIN_DIR)/avr-ar
|
|
128
|
+
SIZE = $(BIN_DIR)/avr-size
|
|
129
|
+
NM = $(BIN_DIR)/avr-nm
|
|
130
|
+
AVRDUDE = $(BIN_DIR)/avrdude
|
|
131
|
+
REMOVE = rm -f
|
|
132
|
+
MV = mv -f
|
|
133
|
+
|
|
134
|
+
# Define all object files.
|
|
135
|
+
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
|
|
136
|
+
|
|
137
|
+
# Define all listing files.
|
|
138
|
+
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)
|
|
139
|
+
|
|
140
|
+
# Combine all necessary flags and optional flags.
|
|
141
|
+
# Add target processor to flags.
|
|
142
|
+
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
|
|
143
|
+
ALL_CXXFLAGS = -mmcu=$(MCU) -I. $(CXXFLAGS)
|
|
144
|
+
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# Default target.
|
|
148
|
+
all: build
|
|
149
|
+
|
|
150
|
+
build: elf hex
|
|
151
|
+
|
|
152
|
+
elf: $(TARGET).elf
|
|
153
|
+
hex: $(TARGET).hex
|
|
154
|
+
eep: $(TARGET).eep
|
|
155
|
+
lss: $(TARGET).lss
|
|
156
|
+
sym: $(TARGET).sym
|
|
157
|
+
|
|
158
|
+
# Program the device.
|
|
159
|
+
upload: $(TARGET).hex
|
|
160
|
+
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
|
166
|
+
COFFCONVERT=$(OBJCOPY) --debugging \
|
|
167
|
+
--change-section-address .data-0x800000 \
|
|
168
|
+
--change-section-address .bss-0x800000 \
|
|
169
|
+
--change-section-address .noinit-0x800000 \
|
|
170
|
+
--change-section-address .eeprom-0x810000
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
coff: $(TARGET).elf
|
|
174
|
+
$(COFFCONVERT) -O coff-avr $(TARGET).elf $(TARGET).cof
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
extcoff: $(TARGET).elf
|
|
178
|
+
$(COFFCONVERT) -O coff-ext-avr $(TARGET).elf $(TARGET).cof
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
.SUFFIXES: .elf .hex .eep .lss .sym
|
|
182
|
+
|
|
183
|
+
.elf.hex:
|
|
184
|
+
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
|
185
|
+
|
|
186
|
+
.elf.eep:
|
|
187
|
+
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
|
188
|
+
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
|
189
|
+
|
|
190
|
+
# Create extended listing file from ELF output file.
|
|
191
|
+
.elf.lss:
|
|
192
|
+
$(OBJDUMP) -h -S $< > $@
|
|
193
|
+
|
|
194
|
+
# Create a symbol table from ELF output file.
|
|
195
|
+
.elf.sym:
|
|
196
|
+
$(NM) -n $< > $@
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
core.a: $(OBJ)
|
|
200
|
+
@for i in $(OBJ); do echo $(AR) rcs core.a $$i; $(AR) rcs core.a $$i; done
|
|
201
|
+
|
|
202
|
+
# Link: create ELF output file from library.
|
|
203
|
+
$(TARGET).elf: core.a
|
|
204
|
+
$(CC) $(ALL_CFLAGS) -o $@ $(TARGET).cpp -L. core.a $(LDFLAGS)
|
|
205
|
+
|
|
206
|
+
# Compile: create object files from C++ source files.
|
|
207
|
+
.cpp.o:
|
|
208
|
+
$(CXX) -c $(ALL_CXXFLAGS) $< -o $@
|
|
209
|
+
|
|
210
|
+
# Compile: create object files from C source files.
|
|
211
|
+
.c.o:
|
|
212
|
+
$(CC) -c $(ALL_CFLAGS) $< -o $@
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
# Compile: create assembler files from C source files.
|
|
216
|
+
.c.s:
|
|
217
|
+
$(CC) -S $(ALL_CFLAGS) $< -o $@
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# Assemble: create object files from assembler source files.
|
|
221
|
+
.S.o:
|
|
222
|
+
$(CC) -c $(ALL_ASFLAGS) $< -o $@
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
# Target: clean project.
|
|
227
|
+
clean:
|
|
228
|
+
$(REMOVE) $(TARGET).hex $(TARGET).eep $(TARGET).cof $(TARGET).elf \
|
|
229
|
+
$(TARGET).map $(TARGET).sym $(TARGET).lss core.a \
|
|
230
|
+
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)
|
|
231
|
+
|
|
232
|
+
depend:
|
|
233
|
+
if grep '^# DO NOT DELETE' $(MAKEFILE) >/dev/null; \
|
|
234
|
+
then \
|
|
235
|
+
sed -e '/^# DO NOT DELETE/,$$d' $(MAKEFILE) > \
|
|
236
|
+
$(MAKEFILE).$$$$ && \
|
|
237
|
+
$(MV) $(MAKEFILE).$$$$ $(MAKEFILE); \
|
|
238
|
+
fi
|
|
239
|
+
echo '# DO NOT DELETE THIS LINE -- make depend depends on it.' \
|
|
240
|
+
>> $(MAKEFILE); \
|
|
241
|
+
$(CC) -M -mmcu=$(MCU) $(CDEFS) $(CINCS) $(SRC) $(ASRC) >> $(MAKEFILE)
|
|
242
|
+
|
|
243
|
+
.PHONY: all build elf hex eep lss sym program coff extcoff clean depend
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
class Makefile
|
|
5
|
+
class << self
|
|
6
|
+
|
|
7
|
+
# build the sketch Makefile for the given template based on the values in its software and hardware config files
|
|
8
|
+
def compose_for_sketch(build_dir)
|
|
9
|
+
params = hardware_params.merge software_params
|
|
10
|
+
params['target'] = build_dir.split("/").last
|
|
11
|
+
|
|
12
|
+
params['libraries_root'] = "#{File.expand_path(RAD_ROOT)}/vendor/libraries"
|
|
13
|
+
params['libraries'] = $load_libraries # load only libraries used
|
|
14
|
+
|
|
15
|
+
# needed along with ugly hack of including another copy of twi.h in wire, when using the Wire.h library
|
|
16
|
+
params['twi_c'] = $load_libraries.include?("Wire") ? "#{params['arduino_root']}/hardware/libraries/Wire/utility/twi.c" : ""
|
|
17
|
+
|
|
18
|
+
params['asm_files'] = Dir.entries( File.expand_path(RAD_ROOT) + "/" + PROJECT_DIR_NAME ).select{|e| e =~ /\.S/}
|
|
19
|
+
|
|
20
|
+
e = ERB.new File.read("#{File.dirname(__FILE__)}/makefile.erb")
|
|
21
|
+
|
|
22
|
+
File.open("#{build_dir}/Makefile", "w") do |f|
|
|
23
|
+
f << e.result(binding)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def hardware_params
|
|
28
|
+
return @hardware_params if @hardware_params
|
|
29
|
+
return @hardware_params = YAML.load_file( "#{RAD_ROOT}/config/hardware.yml")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def software_params
|
|
33
|
+
return @software_params if @software_params
|
|
34
|
+
return @software_params = YAML.load_file( "#{RAD_ROOT}/config/software.yml" )
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,813 @@
|
|
|
1
|
+
class HardwareLibrary < ArduinoSketch
|
|
2
|
+
|
|
3
|
+
def initialize
|
|
4
|
+
super
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# Treat a pair of digital I/O pins as a serial line. See: http://www.arduino.cc/en/Tutorial/SoftwareSerial
|
|
8
|
+
def software_serial(rx, tx, opts={})
|
|
9
|
+
raise ArgumentError, "can only define rx from Fixnum, got #{rx.class}" unless rx.is_a?(Fixnum)
|
|
10
|
+
raise ArgumentError, "can only define tx from Fixnum, got #{tx.class}" unless tx.is_a?(Fixnum)
|
|
11
|
+
|
|
12
|
+
output_pin(tx)
|
|
13
|
+
input_pin(rx)
|
|
14
|
+
|
|
15
|
+
rate = opts[:rate] ? opts[:rate] : 9600
|
|
16
|
+
if opts[:as]
|
|
17
|
+
@declarations << "SoftwareSerial _#{opts[ :as ]} = SoftwareSerial(#{rx}, #{tx});"
|
|
18
|
+
accessor = <<-STR
|
|
19
|
+
SoftwareSerial& #{opts[ :as ]}() {
|
|
20
|
+
return _#{opts[ :as ]};
|
|
21
|
+
}
|
|
22
|
+
STR
|
|
23
|
+
@@swser_inc ||= FALSE
|
|
24
|
+
if (@@swser_inc == FALSE) # on second instance this stuff can't be repeated
|
|
25
|
+
@@swser_inc = TRUE
|
|
26
|
+
accessor += <<-STR
|
|
27
|
+
int read(SoftwareSerial& s) {
|
|
28
|
+
return s.read();
|
|
29
|
+
}
|
|
30
|
+
void println( SoftwareSerial& s, char* str ) {
|
|
31
|
+
return s.println( str );
|
|
32
|
+
}
|
|
33
|
+
void print( SoftwareSerial& s, char* str ) {
|
|
34
|
+
return s.print( str );
|
|
35
|
+
}
|
|
36
|
+
void println( SoftwareSerial& s, int i ) {
|
|
37
|
+
return s.println( i );
|
|
38
|
+
}
|
|
39
|
+
void print( SoftwareSerial& s, int i ) {
|
|
40
|
+
return s.print( i );
|
|
41
|
+
}
|
|
42
|
+
STR
|
|
43
|
+
end
|
|
44
|
+
@accessors << accessor
|
|
45
|
+
|
|
46
|
+
@signatures << "SoftwareSerial& #{opts[ :as ]}();"
|
|
47
|
+
|
|
48
|
+
@other_setup << "\t_#{opts[ :as ]}.begin(#{rate});"
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# use the pa lcd library
|
|
53
|
+
def pa_lcd_setup(num, opts)
|
|
54
|
+
if opts[:geometry]
|
|
55
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{opts[:geometry]}" unless opts[:geometry].is_a?(Fixnum)
|
|
56
|
+
raise ArgumentError, "pa_lcd geometry must be 216, 220, 224, 240, 416, 420, got #{opts[:geometry]}" unless opts[:geometry].to_s =~ /(216|220|224|240|416|420)/
|
|
57
|
+
end
|
|
58
|
+
# move to plugin and load plugin
|
|
59
|
+
# what's the default?
|
|
60
|
+
opts[:rate] ||= 9600
|
|
61
|
+
rate = opts[:rate] ? opts[:rate] : 9600
|
|
62
|
+
swser_LCDpa(num, opts)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def swser_LCDpa(tx, opts={})
|
|
66
|
+
raise ArgumentError, "can only define tx from Fixnum, got #{tx.class}" unless tx.is_a?(Fixnum)
|
|
67
|
+
|
|
68
|
+
rate = opts[:rate] ? opts[:rate] : 9600
|
|
69
|
+
geometry = opts[:geometry] ? opts[:geometry] : 0
|
|
70
|
+
if opts[:as]
|
|
71
|
+
@declarations << "SWSerLCDpa _#{opts[ :as ]} = SWSerLCDpa(#{tx}, #{geometry});"
|
|
72
|
+
$load_libraries << "SWSerLCDpa"
|
|
73
|
+
accessor = <<-STR
|
|
74
|
+
SWSerLCDpa& #{opts[ :as ]}() {
|
|
75
|
+
return _#{opts[ :as ]};
|
|
76
|
+
}
|
|
77
|
+
STR
|
|
78
|
+
@@slcdpa_inc ||= FALSE
|
|
79
|
+
if (@@slcdpa_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
80
|
+
@@slcdpa_inc = TRUE
|
|
81
|
+
# ------------------- print generics -------------------------------
|
|
82
|
+
accessor += <<-STR
|
|
83
|
+
void print( SWSerLCDpa& s, uint8_t b ) {
|
|
84
|
+
return s.print( b );
|
|
85
|
+
}
|
|
86
|
+
void print( SWSerLCDpa& s, const char *str ) {
|
|
87
|
+
return s.print( str );
|
|
88
|
+
}
|
|
89
|
+
void print( SWSerLCDpa& s, char c ) {
|
|
90
|
+
return s.print( c );
|
|
91
|
+
}
|
|
92
|
+
void print( SWSerLCDpa& s, int i ) {
|
|
93
|
+
return s.print( i );
|
|
94
|
+
}
|
|
95
|
+
void print( SWSerLCDpa& s, unsigned int i ) {
|
|
96
|
+
return s.print( i );
|
|
97
|
+
}
|
|
98
|
+
void print( SWSerLCDpa& s, long i ) {
|
|
99
|
+
return s.print( i );
|
|
100
|
+
}
|
|
101
|
+
void print( SWSerLCDpa& s, unsigned long i ) {
|
|
102
|
+
return s.print( i );
|
|
103
|
+
}
|
|
104
|
+
void print( SWSerLCDpa& s, long i, int b ) {
|
|
105
|
+
return s.print( i, b );
|
|
106
|
+
}
|
|
107
|
+
STR
|
|
108
|
+
# ------------------ PA-LCD specific functions ---------------------------------
|
|
109
|
+
accessor += <<-STR
|
|
110
|
+
void clearscr(SWSerLCDpa& s) {
|
|
111
|
+
return s.clearscr();
|
|
112
|
+
}
|
|
113
|
+
void clearscr(SWSerLCDpa& s, const char *str) {
|
|
114
|
+
return s.clearscr(str);
|
|
115
|
+
}
|
|
116
|
+
void clearscr(SWSerLCDpa& s, int n) {
|
|
117
|
+
return s.clearscr(n);
|
|
118
|
+
}
|
|
119
|
+
void clearscr(SWSerLCDpa& s, long n, int b) {
|
|
120
|
+
return s.clearscr(n, b);
|
|
121
|
+
}
|
|
122
|
+
void clearline(SWSerLCDpa& s, int line) {
|
|
123
|
+
return s.clearline( line );
|
|
124
|
+
}
|
|
125
|
+
void clearline(SWSerLCDpa& s, int line, const char *str) {
|
|
126
|
+
return s.clearline( line, str );
|
|
127
|
+
}
|
|
128
|
+
void clearline(SWSerLCDpa& s, int line, int n) {
|
|
129
|
+
return s.clearline( line, n );
|
|
130
|
+
}
|
|
131
|
+
void clearline(SWSerLCDpa& s, int line, long n, int b) {
|
|
132
|
+
return s.clearline( line, n, b );
|
|
133
|
+
}
|
|
134
|
+
void home( SWSerLCDpa& s) {
|
|
135
|
+
return s.home();
|
|
136
|
+
}
|
|
137
|
+
void home( SWSerLCDpa& s, const char *str) {
|
|
138
|
+
return s.home( str );
|
|
139
|
+
}
|
|
140
|
+
void home( SWSerLCDpa& s, int n) {
|
|
141
|
+
return s.home( n );
|
|
142
|
+
}
|
|
143
|
+
void home( SWSerLCDpa& s, long n, int b) {
|
|
144
|
+
return s.home( n, b );
|
|
145
|
+
}
|
|
146
|
+
void setxy( SWSerLCDpa& s, int x, int y) {
|
|
147
|
+
return s.setxy( x, y );
|
|
148
|
+
}
|
|
149
|
+
void setxy( SWSerLCDpa& s, int x, int y, const char *str) {
|
|
150
|
+
return s.setxy( x, y, str );
|
|
151
|
+
}
|
|
152
|
+
void setxy( SWSerLCDpa& s, int x, int y, long n, int b) {
|
|
153
|
+
return s.setxy( x, y, n, b );
|
|
154
|
+
}
|
|
155
|
+
void setxy( SWSerLCDpa& s, int x, int y, int n) {
|
|
156
|
+
return s.setxy( x, y, n );
|
|
157
|
+
}
|
|
158
|
+
void setgeo( SWSerLCDpa& s, int g) {
|
|
159
|
+
return s.setgeo( g );
|
|
160
|
+
}
|
|
161
|
+
void setintensity( SWSerLCDpa& s, int i ) {
|
|
162
|
+
return s.setintensity( i );
|
|
163
|
+
}
|
|
164
|
+
void intoBignum(SWSerLCDpa& s) {
|
|
165
|
+
return s.intoBignum();
|
|
166
|
+
}
|
|
167
|
+
void outofBignum(SWSerLCDpa& s) {
|
|
168
|
+
return s.outofBignum();
|
|
169
|
+
}
|
|
170
|
+
STR
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
@accessors << accessor
|
|
174
|
+
|
|
175
|
+
@signatures << "SWSerLCDpa& #{opts[ :as ]}();"
|
|
176
|
+
|
|
177
|
+
@other_setup << "\t_#{opts[ :as ]}.begin(#{rate});"
|
|
178
|
+
@other_setup << "\t_#{opts[ :as ]}.clearscr();" if :clear_screen == :true
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# use the sf (sparkfun) library
|
|
185
|
+
def sf_lcd_setup(num, opts)
|
|
186
|
+
if opts[:geometry]
|
|
187
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{opts[:geometry]}" unless opts[:geometry].is_a?(Fixnum)
|
|
188
|
+
raise ArgumentError, "sf_lcd geometry must be 216, 220, 416, 420, got #{opts[:geometry]}" unless opts[:geometry].to_s =~ /(216|220|416|420)/
|
|
189
|
+
end
|
|
190
|
+
# move to plugin and load plugin
|
|
191
|
+
opts[:rate] ||= 9600
|
|
192
|
+
rate = opts[:rate] ? opts[:rate] : 9600
|
|
193
|
+
swser_LCDsf(num, opts)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def swser_LCDsf(tx, opts={})
|
|
197
|
+
raise ArgumentError, "can only define tx from Fixnum, got #{tx.class}" unless tx.is_a?(Fixnum)
|
|
198
|
+
|
|
199
|
+
rate = opts[:rate] ? opts[:rate] : 9600
|
|
200
|
+
geometry = opts[:geometry] ? opts[:geometry] : 0
|
|
201
|
+
if opts[:as]
|
|
202
|
+
@declarations << "SWSerLCDsf _#{opts[ :as ]} = SWSerLCDsf(#{tx}, #{geometry});"
|
|
203
|
+
|
|
204
|
+
$load_libraries << "SWSerLCDsf"
|
|
205
|
+
accessor = <<-STR
|
|
206
|
+
SWSerLCDsf& #{opts[ :as ]}() {
|
|
207
|
+
return _#{opts[ :as ]};
|
|
208
|
+
}
|
|
209
|
+
STR
|
|
210
|
+
@@slcdsf_inc ||= FALSE # assign only if nil
|
|
211
|
+
if (@@slcdsf_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
212
|
+
@@slcdsf_inc = TRUE
|
|
213
|
+
accessor += <<-STR
|
|
214
|
+
void print( SWSerLCDsf& s, uint8_t b ) {
|
|
215
|
+
return s.print( b );
|
|
216
|
+
}
|
|
217
|
+
void print( SWSerLCDsf& s, const char *str ) {
|
|
218
|
+
return s.print( str );
|
|
219
|
+
}
|
|
220
|
+
void print( SWSerLCDsf& s, char c ) {
|
|
221
|
+
return s.print( c );
|
|
222
|
+
}
|
|
223
|
+
void print( SWSerLCDsf& s, int i ) {
|
|
224
|
+
return s.print( i );
|
|
225
|
+
}
|
|
226
|
+
void print( SWSerLCDsf& s, unsigned int i ) {
|
|
227
|
+
return s.print( i );
|
|
228
|
+
}
|
|
229
|
+
void print( SWSerLCDsf& s, long i ) {
|
|
230
|
+
return s.print( i );
|
|
231
|
+
}
|
|
232
|
+
void print( SWSerLCDsf& s, unsigned long i ) {
|
|
233
|
+
return s.print( i );
|
|
234
|
+
}
|
|
235
|
+
void print( SWSerLCDsf& s, long i, int b ) {
|
|
236
|
+
return s.print( i, b );
|
|
237
|
+
}
|
|
238
|
+
STR
|
|
239
|
+
# ------------------ Spark Fun Specific Functions ---------------------------------
|
|
240
|
+
accessor += <<-STR
|
|
241
|
+
void clearscr(SWSerLCDsf& s) {
|
|
242
|
+
return s.clearscr();
|
|
243
|
+
}
|
|
244
|
+
void clearscr(SWSerLCDsf& s, const char *str) {
|
|
245
|
+
return s.clearscr(str);
|
|
246
|
+
}
|
|
247
|
+
void clearscr(SWSerLCDsf& s, int n) {
|
|
248
|
+
return s.clearscr(n);
|
|
249
|
+
}
|
|
250
|
+
void clearscr(SWSerLCDsf& s, long n, int b) {
|
|
251
|
+
return s.clearscr(n, b);
|
|
252
|
+
}
|
|
253
|
+
void home( SWSerLCDsf& s) {
|
|
254
|
+
return s.home();
|
|
255
|
+
}
|
|
256
|
+
void home( SWSerLCDsf& s, const char *str) {
|
|
257
|
+
return s.home( str );
|
|
258
|
+
}
|
|
259
|
+
void home( SWSerLCDsf& s, int n) {
|
|
260
|
+
return s.home( n );
|
|
261
|
+
}
|
|
262
|
+
void home( SWSerLCDsf& s, long n, int b) {
|
|
263
|
+
return s.home( n, b );
|
|
264
|
+
}
|
|
265
|
+
void setxy( SWSerLCDsf& s, int x, int y) {
|
|
266
|
+
return s.setxy( x, y );
|
|
267
|
+
}
|
|
268
|
+
void setxy( SWSerLCDsf& s, int x, int y, const char *str) {
|
|
269
|
+
return s.setxy( x, y, str );
|
|
270
|
+
}
|
|
271
|
+
void setxy( SWSerLCDsf& s, int x, int y, int n) {
|
|
272
|
+
return s.setxy( x, y, n );
|
|
273
|
+
}
|
|
274
|
+
void setxy( SWSerLCDsf& s, int x, int y, long n, int b) {
|
|
275
|
+
return s.setxy( x, y, n, b );
|
|
276
|
+
}
|
|
277
|
+
void setgeo( SWSerLCDsf& s, int g) {
|
|
278
|
+
return s.setgeo( g );
|
|
279
|
+
}
|
|
280
|
+
void setintensity( SWSerLCDsf& s, int i ) {
|
|
281
|
+
return s.setintensity( i );
|
|
282
|
+
}
|
|
283
|
+
void setcmd( SWSerLCDsf& s, uint8_t a, uint8_t b) {
|
|
284
|
+
return s.setcmd( a, b );
|
|
285
|
+
}
|
|
286
|
+
STR
|
|
287
|
+
end
|
|
288
|
+
@accessors << accessor
|
|
289
|
+
|
|
290
|
+
@signatures << "SWSerLCDsf& #{opts[ :as ]}();"
|
|
291
|
+
|
|
292
|
+
@other_setup << "\t_#{opts[ :as ]}.begin(#{rate});"
|
|
293
|
+
@other_setup << "\t_#{opts[ :as ]}.clearscr();" if :clear_screen == :true
|
|
294
|
+
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def loop_timer(opts={}) # loop timer methods #
|
|
300
|
+
|
|
301
|
+
if opts[:as]
|
|
302
|
+
@declarations << "LoopTimer _#{opts[ :as ]} = LoopTimer();"
|
|
303
|
+
$load_libraries << "LoopTimer"
|
|
304
|
+
accessor = <<-STR
|
|
305
|
+
LoopTimer& #{opts[ :as ]}() {
|
|
306
|
+
return _#{opts[ :as ]};
|
|
307
|
+
}
|
|
308
|
+
STR
|
|
309
|
+
@@loptim_inc ||= FALSE
|
|
310
|
+
if (@@loptim_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
311
|
+
@@limtim_inc = TRUE
|
|
312
|
+
accessor += <<-STR
|
|
313
|
+
void track( LoopTimer& s ) {
|
|
314
|
+
return s.track();
|
|
315
|
+
}
|
|
316
|
+
unsigned long get_total( LoopTimer& s ) {
|
|
317
|
+
return s.get_total();
|
|
318
|
+
}
|
|
319
|
+
STR
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
@accessors << accessor
|
|
323
|
+
|
|
324
|
+
@signatures << "LoopTimer& #{opts[ :as ]}();"
|
|
325
|
+
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
# use the servo library
|
|
330
|
+
def servo_setup(num, opts)
|
|
331
|
+
if opts[:position]
|
|
332
|
+
raise ArgumentError, "position must be an integer from 0 to 360, got #{opts[:position].class}" unless opts[:position].is_a?(Fixnum)
|
|
333
|
+
raise ArgumentError, "position must be an integer from 0 to 360---, got #{opts[:position]}" if opts[:position] < 0 || opts[:position] > 360
|
|
334
|
+
end
|
|
335
|
+
servo(num, opts)
|
|
336
|
+
# move this to better place ...
|
|
337
|
+
# should probably go along with servo code into plugin
|
|
338
|
+
@@servo_dh ||= FALSE
|
|
339
|
+
if (@@servo_dh == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
340
|
+
@@servo_dh = TRUE
|
|
341
|
+
@declarations << "void servo_refresh(void);"
|
|
342
|
+
helper_methods = []
|
|
343
|
+
helper_methods << "void servo_refresh(void)"
|
|
344
|
+
helper_methods << "{"
|
|
345
|
+
helper_methods << "\tServo::refresh();"
|
|
346
|
+
helper_methods << "}"
|
|
347
|
+
@helper_methods += "\n#{helper_methods.join("\n")}"
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def servo(pin, opts={}) # servo motor routines #
|
|
352
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
353
|
+
|
|
354
|
+
minp = opts[:min] ? opts[:min] : 544
|
|
355
|
+
maxp = opts[:max] ? opts[:max] : 2400
|
|
356
|
+
|
|
357
|
+
if opts[:as]
|
|
358
|
+
@declarations << "Servo _#{opts[ :as ]} = Servo();"
|
|
359
|
+
$load_libraries << "Servo"
|
|
360
|
+
accessor = <<-STR
|
|
361
|
+
Servo& #{opts[ :as ]}() {
|
|
362
|
+
return _#{opts[ :as ]};
|
|
363
|
+
}
|
|
364
|
+
STR
|
|
365
|
+
@@servo_inc ||= FALSE
|
|
366
|
+
if (@@servo_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
367
|
+
@@servo_inc = TRUE
|
|
368
|
+
accessor += <<-STR
|
|
369
|
+
uint8_t attach( Servo& s, int p ) {
|
|
370
|
+
return s.attach(p);
|
|
371
|
+
}
|
|
372
|
+
uint8_t attach( Servo& s, int p, int pos ) {
|
|
373
|
+
return s.attach(p, pos );
|
|
374
|
+
}
|
|
375
|
+
uint8_t attach( Servo& s, int p, uint16_t mn, uint16_t mx ) {
|
|
376
|
+
return s.attach(p, mn, mx);
|
|
377
|
+
}
|
|
378
|
+
uint8_t attach( Servo& s, int p, int pos, uint16_t mn, uint16_t mx ) {
|
|
379
|
+
return s.attach(p, pos, mn, mx);
|
|
380
|
+
}
|
|
381
|
+
void detach( Servo& s ) {
|
|
382
|
+
return s.detach();
|
|
383
|
+
}
|
|
384
|
+
void position( Servo& s, int b ) {
|
|
385
|
+
return s.position( b );
|
|
386
|
+
}
|
|
387
|
+
void speed( Servo& s, int b ) {
|
|
388
|
+
return s.speed( b );
|
|
389
|
+
}
|
|
390
|
+
uint8_t read( Servo& s ) {
|
|
391
|
+
return s.read();
|
|
392
|
+
}
|
|
393
|
+
uint8_t attached( Servo& s ) {
|
|
394
|
+
return s.attached();
|
|
395
|
+
}
|
|
396
|
+
static void refresh( Servo& s ) {
|
|
397
|
+
return s.refresh();
|
|
398
|
+
}
|
|
399
|
+
STR
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
@accessors << accessor
|
|
403
|
+
|
|
404
|
+
@signatures << "Servo& #{opts[ :as ]}();"
|
|
405
|
+
|
|
406
|
+
@other_setup << "\t_#{opts[ :as ]}.attach(#{pin}, #{opts[:position]}, #{minp}, #{maxp});" if opts[:position]
|
|
407
|
+
@other_setup << "\t_#{opts[ :as ]}.attach(#{pin}, #{minp}, #{maxp});" unless opts[:position]
|
|
408
|
+
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def twowire_stepper(pin1, pin2, opts={}) # servo motor routines #
|
|
413
|
+
raise ArgumentError, "can only define pin1 from Fixnum, got #{pin1.class}" unless pin1.is_a?(Fixnum)
|
|
414
|
+
raise ArgumentError, "can only define pin2 from Fixnum, got #{pin2.class}" unless pin2.is_a?(Fixnum)
|
|
415
|
+
|
|
416
|
+
st_speed = opts[:speed] ? opts[:speed] : 30
|
|
417
|
+
st_steps = opts[:steps] ? opts[:steps] : 100
|
|
418
|
+
|
|
419
|
+
if opts[:as]
|
|
420
|
+
@declarations << "Stepper _#{opts[ :as ]} = Stepper(#{st_steps},#{pin1},#{pin2});"
|
|
421
|
+
$load_libraries << "Stepper"
|
|
422
|
+
accessor = <<-STR
|
|
423
|
+
Stepper& #{opts[ :as ]}() {
|
|
424
|
+
return _#{opts[ :as ]};
|
|
425
|
+
}
|
|
426
|
+
STR
|
|
427
|
+
@@stepr_inc ||= FALSE
|
|
428
|
+
if (@@stepr_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
429
|
+
@@stepr_inc = TRUE
|
|
430
|
+
accessor = <<-STR
|
|
431
|
+
void set_speed( Stepper& s, long sp ) {
|
|
432
|
+
return s.set_speed( sp );
|
|
433
|
+
}
|
|
434
|
+
void set_steps( Stepper& s, int b ) {
|
|
435
|
+
return s.set_steps( b );
|
|
436
|
+
}
|
|
437
|
+
int version( Stepper& s ) {
|
|
438
|
+
return s.version();
|
|
439
|
+
}
|
|
440
|
+
STR
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
@accessors << accessor
|
|
444
|
+
|
|
445
|
+
@signatures << "Stepper& #{opts[ :as ]}();"
|
|
446
|
+
|
|
447
|
+
@other_setup << "\t_#{opts[ :as ]}.set_speed(#{st_speed});" if opts[:speed]
|
|
448
|
+
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def fourwire_stepper( pin1, pin2, pin3, pin4, opts={}) # servo motor routines #
|
|
453
|
+
raise ArgumentError, "can only define pin1 from Fixnum, got #{pin1.class}" unless pin1.is_a?(Fixnum)
|
|
454
|
+
raise ArgumentError, "can only define pin2 from Fixnum, got #{pin2.class}" unless pin2.is_a?(Fixnum)
|
|
455
|
+
raise ArgumentError, "can only define pin3 from Fixnum, got #{pin3.class}" unless pin3.is_a?(Fixnum)
|
|
456
|
+
raise ArgumentError, "can only define pin4 from Fixnum, got #{pin4.class}" unless pin4.is_a?(Fixnum)
|
|
457
|
+
|
|
458
|
+
st_speed = opts[:speed] ? opts[:speed] : 30
|
|
459
|
+
st_steps = opts[:steps] ? opts[:steps] : 100
|
|
460
|
+
|
|
461
|
+
if opts[:as]
|
|
462
|
+
@declarations << "Stepper _#{opts[ :as ]} = Stepper(#{st_steps},#{pin1},#{pin2},#{pin3},#{pin4});"
|
|
463
|
+
$load_libraries << "Stepper"
|
|
464
|
+
accessor = <<-STR
|
|
465
|
+
Stepper& #{opts[ :as ]}() {
|
|
466
|
+
return _#{opts[ :as ]};
|
|
467
|
+
}
|
|
468
|
+
STR
|
|
469
|
+
@@stepr_inc ||= FALSE
|
|
470
|
+
if (@@stepr_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
471
|
+
@@stepr_inc = TRUE
|
|
472
|
+
accessor += <<-STR
|
|
473
|
+
void set_speed( Stepper& s, long sp ) {
|
|
474
|
+
return s.set_speed( sp );
|
|
475
|
+
}
|
|
476
|
+
void set_steps( Stepper& s, int b ) {
|
|
477
|
+
return s.set_steps( b );
|
|
478
|
+
}
|
|
479
|
+
int version( Stepper& s ) {
|
|
480
|
+
return s.version();
|
|
481
|
+
}
|
|
482
|
+
STR
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
@accessors << accessor
|
|
486
|
+
|
|
487
|
+
@signatures << "Stepper& #{opts[ :as ]}();"
|
|
488
|
+
|
|
489
|
+
@other_setup << "\t_#{opts[ :as ]}.set_speed(#{st_speed});" if opts[:speed]
|
|
490
|
+
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def frequency_timer(pin, opts={}) # frequency timer routines
|
|
495
|
+
|
|
496
|
+
@@frequency_inc ||= FALSE
|
|
497
|
+
raise ArgumentError, "there can be only one instance of Frequency Timer2" if @@frequency_inc == TRUE
|
|
498
|
+
@@frequency_inc = TRUE
|
|
499
|
+
|
|
500
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
501
|
+
raise ArgumentError, "only pin 11 may be used for freq_out, got #{pin}" unless pin == 11
|
|
502
|
+
|
|
503
|
+
if opts[:enable]
|
|
504
|
+
raise ArgumentError, "enable option must include the frequency or period option" unless opts[:frequency] || opts[:period]
|
|
505
|
+
end
|
|
506
|
+
if opts[:frequency]
|
|
507
|
+
raise ArgumentError, "the frequency option must be an integer, got #{opts[:frequency].class}" unless opts[:frequency].is_a?(Fixnum)
|
|
508
|
+
end
|
|
509
|
+
if opts[:period]
|
|
510
|
+
raise ArgumentError, "the frequency option must be an integer, got #{opts[:period].class}" unless opts[:period].is_a?(Fixnum)
|
|
511
|
+
end
|
|
512
|
+
# refer to: http://www.arduino.cc/playground/Code/FrequencyTimer2
|
|
513
|
+
|
|
514
|
+
if opts[:as]
|
|
515
|
+
|
|
516
|
+
@declarations << "FrequencyTimer2 _#{opts[ :as ]} = FrequencyTimer2();"
|
|
517
|
+
|
|
518
|
+
$load_libraries << "FrequencyTimer2"
|
|
519
|
+
accessor = <<-STR
|
|
520
|
+
FrequencyTimer2& #{opts[ :as ]}() {
|
|
521
|
+
return _#{opts[ :as ]};
|
|
522
|
+
}
|
|
523
|
+
void set_frequency( FrequencyTimer2& s, int b ) {
|
|
524
|
+
return s.setPeriod( 1000000L/b );
|
|
525
|
+
}
|
|
526
|
+
void set_period( FrequencyTimer2& s, int b ) {
|
|
527
|
+
return s.setPeriod( b );
|
|
528
|
+
}
|
|
529
|
+
void enable( FrequencyTimer2& s ) {
|
|
530
|
+
return s.enable();
|
|
531
|
+
}
|
|
532
|
+
void disable( FrequencyTimer2& s ) {
|
|
533
|
+
return s.disable();
|
|
534
|
+
}
|
|
535
|
+
STR
|
|
536
|
+
|
|
537
|
+
@accessors << accessor
|
|
538
|
+
|
|
539
|
+
@signatures << "FrequencyTimer2& #{opts[ :as ]}();"
|
|
540
|
+
|
|
541
|
+
@other_setup << "\tFrequencyTimer2::setPeriod(0L);" unless opts[:frequency] || opts[:period]
|
|
542
|
+
@other_setup << "\tFrequencyTimer2::setPeriod(1000000L/#{opts[:frequency]});" if opts[:frequency]
|
|
543
|
+
@other_setup << "\tFrequencyTimer2::setPeriod(#{opts[:period]});" if opts[:period]
|
|
544
|
+
@other_setup << "\tFrequencyTimer2::enable();" if opts[:enable] == :true
|
|
545
|
+
end
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
def one_wire(pin, opts={})
|
|
549
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
550
|
+
|
|
551
|
+
if opts[:as]
|
|
552
|
+
@declarations << "OneWire _#{opts[ :as ]} = OneWire(#{pin});"
|
|
553
|
+
accessor = []
|
|
554
|
+
$load_libraries << "OneWire"
|
|
555
|
+
accessor = <<-STR
|
|
556
|
+
OneWire& #{opts[ :as ]}() {
|
|
557
|
+
return _#{opts[ :as ]};
|
|
558
|
+
}
|
|
559
|
+
STR
|
|
560
|
+
@@onewire_inc ||= FALSE
|
|
561
|
+
if (@@onewire_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
562
|
+
@@onewire_inc = TRUE
|
|
563
|
+
accessor += <<-STR
|
|
564
|
+
uint8_t reset(OneWire& s) {
|
|
565
|
+
return s.reset();
|
|
566
|
+
}
|
|
567
|
+
void skip(OneWire& s) {
|
|
568
|
+
return s.skip();
|
|
569
|
+
}
|
|
570
|
+
void write(OneWire& s, uint8_t v, uint8_t p = 0) {
|
|
571
|
+
return s.write( v, p );
|
|
572
|
+
}
|
|
573
|
+
uint8_t read(OneWire& s) {
|
|
574
|
+
return s.read();
|
|
575
|
+
}
|
|
576
|
+
void write_bit( OneWire& s, uint8_t b ) {
|
|
577
|
+
return s.write_bit( b );
|
|
578
|
+
}
|
|
579
|
+
uint8_t read_bit(OneWire& s) {
|
|
580
|
+
return s.read_bit();
|
|
581
|
+
}
|
|
582
|
+
void depower(OneWire& s) {
|
|
583
|
+
return s.depower();
|
|
584
|
+
}
|
|
585
|
+
STR
|
|
586
|
+
end
|
|
587
|
+
@accessors << accessor
|
|
588
|
+
|
|
589
|
+
@signatures << "OneWire& #{opts[ :as ]}();"
|
|
590
|
+
end
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
def two_wire (pin, opts={}) # i2c Two-Wire
|
|
594
|
+
|
|
595
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
596
|
+
raise ArgumentError, "only pin 19 may be used for i2c, got #{pin}" unless pin == 19
|
|
597
|
+
|
|
598
|
+
if opts[:as]
|
|
599
|
+
|
|
600
|
+
@@twowire_inc = TRUE
|
|
601
|
+
@declarations << "TwoWire _wire = TwoWire();"
|
|
602
|
+
$load_libraries << "Wire"
|
|
603
|
+
accessor = <<-STR
|
|
604
|
+
TwoWire& wire() {
|
|
605
|
+
return _wire;
|
|
606
|
+
}
|
|
607
|
+
void begin( TwoWire& s) {
|
|
608
|
+
return s.begin();
|
|
609
|
+
}
|
|
610
|
+
void begin( TwoWire& s, uint8_t a) {
|
|
611
|
+
return s.begin(a);
|
|
612
|
+
}
|
|
613
|
+
void begin( TwoWire& s, int a) {
|
|
614
|
+
return s.begin(a);
|
|
615
|
+
}
|
|
616
|
+
void beginTransmission( TwoWire& s, uint8_t a ) {
|
|
617
|
+
return s.beginTransmission( a );
|
|
618
|
+
}
|
|
619
|
+
void beginTransmission( TwoWire& s, int a ) {
|
|
620
|
+
return s.beginTransmission( a );
|
|
621
|
+
}
|
|
622
|
+
void endTransmission( TwoWire& s ) {
|
|
623
|
+
return s.endTransmission();
|
|
624
|
+
}
|
|
625
|
+
void requestFrom( TwoWire& s, uint8_t a, uint8_t q) {
|
|
626
|
+
return s.requestFrom( a, q );
|
|
627
|
+
}
|
|
628
|
+
void requestFrom( TwoWire& s, int a, int q) {
|
|
629
|
+
return s.requestFrom( a, q );
|
|
630
|
+
}
|
|
631
|
+
void send( TwoWire& s, uint8_t d) {
|
|
632
|
+
return s.send(d);
|
|
633
|
+
}
|
|
634
|
+
void send( TwoWire& s, int d) {
|
|
635
|
+
return s.send(d);
|
|
636
|
+
}
|
|
637
|
+
void send( TwoWire& s, char* d) {
|
|
638
|
+
return s.send(d);
|
|
639
|
+
}
|
|
640
|
+
void send( TwoWire& s, uint8_t* d, uint8_t q) {
|
|
641
|
+
return s.send( d, q );
|
|
642
|
+
}
|
|
643
|
+
uint8_t available( TwoWire& s) {
|
|
644
|
+
return s.available();
|
|
645
|
+
}
|
|
646
|
+
uint8_t receive( TwoWire& s) {
|
|
647
|
+
return s.receive();
|
|
648
|
+
}
|
|
649
|
+
STR
|
|
650
|
+
|
|
651
|
+
@accessors << accessor
|
|
652
|
+
|
|
653
|
+
@signatures << "TwoWire& wire();"
|
|
654
|
+
|
|
655
|
+
@other_setup << "\t_wire.begin();" # We never get here a second time. If we go to the trouble
|
|
656
|
+
# of setting up i2c, we gotta start it and it never gets
|
|
657
|
+
# stopped. This is not 'optional!'
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
# work in progress
|
|
663
|
+
def ethernet(pin, opts={})
|
|
664
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
665
|
+
if opts[:as]
|
|
666
|
+
accessor = []
|
|
667
|
+
$load_libraries << "AF_XPort"
|
|
668
|
+
$load_libraries << "AFSoftSerial"
|
|
669
|
+
# needs to be more granular:
|
|
670
|
+
accessor << "AF_XPort xport = AF_XPort(XPORT_RXPIN, XPORT_TXPIN, XPORT_RESETPIN, XPORT_DTRPIN, XPORT_RTSPIN, XPORT_CTSPIN);"
|
|
671
|
+
rate = opts[:rate] ? opts[:rate] : 57600
|
|
672
|
+
@other_setup << "xport.begin(#{rate});"
|
|
673
|
+
@accessors << accessor.join( "\n" )
|
|
674
|
+
end
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
def i2c_eeprom(pin, opts={}) # i2c serial eeprom routines #
|
|
679
|
+
|
|
680
|
+
dev_addr = opts[:address] ? opts[:address] : 0
|
|
681
|
+
|
|
682
|
+
if opts[:as]
|
|
683
|
+
@declarations << "I2CEEPROM _#{opts[ :as ]} = I2CEEPROM(#{dev_addr});"
|
|
684
|
+
$load_libraries << "I2CEEPROM"
|
|
685
|
+
accessor = <<-STR
|
|
686
|
+
I2CEEPROM& #{opts[ :as ]}() {
|
|
687
|
+
return _#{opts[ :as ]};
|
|
688
|
+
}
|
|
689
|
+
STR
|
|
690
|
+
@@i2cepr_inc ||= FALSE
|
|
691
|
+
if (@@i2cepr_inc == FALSE) # on second instance this stuff can't be repeated - BBR
|
|
692
|
+
@@i2cepr_inc = TRUE
|
|
693
|
+
accessor += <<-STR
|
|
694
|
+
void write_byte( I2CEEPROM& s, unsigned int addr, byte b ) {
|
|
695
|
+
return s.write_byte( addr, b );
|
|
696
|
+
}
|
|
697
|
+
void write_page( I2CEEPROM& s, unsigned int addr, byte* d, int l ) {
|
|
698
|
+
return s.write_page( addr, d, l );
|
|
699
|
+
}
|
|
700
|
+
byte read_byte( I2CEEPROM& s, unsigned int addr ) {
|
|
701
|
+
return s.read_byte( addr );
|
|
702
|
+
}
|
|
703
|
+
void read_buffer( I2CEEPROM& s, unsigned int addr, byte *d, int l ) {
|
|
704
|
+
return s.read_buffer( addr, d, l );
|
|
705
|
+
}
|
|
706
|
+
STR
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
@accessors << accessor
|
|
710
|
+
|
|
711
|
+
@signatures << "I2CEEPROM& #{opts[ :as ]}();"
|
|
712
|
+
|
|
713
|
+
end
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
def ds1307(pin, opts={}) # DS1307 real time clock routines routines
|
|
719
|
+
|
|
720
|
+
@@ds1307_inc ||= FALSE
|
|
721
|
+
raise ArgumentError, "only one DS1307 may be used for i2c" unless @@ds1307_inc == FALSE
|
|
722
|
+
@@ds1307_inc = TRUE
|
|
723
|
+
raise ArgumentError, "can only define pin from Fixnum, got #{pin.class}" unless pin.is_a?(Fixnum)
|
|
724
|
+
raise ArgumentError, "only pin 19 may be used for i2c, got #{pin}" unless pin == 19
|
|
725
|
+
if opts[:as]
|
|
726
|
+
@declarations << "DS1307 _#{opts[ :as ]} = DS1307();"
|
|
727
|
+
$load_libraries << "DS1307"
|
|
728
|
+
accessor = <<-STR
|
|
729
|
+
DS1307& #{opts[ :as ]}() {
|
|
730
|
+
return _#{opts[ :as ]};
|
|
731
|
+
}
|
|
732
|
+
void get( DS1307& s, byte *buf, boolean r ) {
|
|
733
|
+
return s.get( buf, r );
|
|
734
|
+
}
|
|
735
|
+
byte get( DS1307& s, int b, boolean r ) {
|
|
736
|
+
return s.get( b, r );
|
|
737
|
+
}
|
|
738
|
+
void set( DS1307& s, int b, int r ) {
|
|
739
|
+
return s.set( b, r );
|
|
740
|
+
}
|
|
741
|
+
void start( DS1307& s ) {
|
|
742
|
+
return s.start();
|
|
743
|
+
}
|
|
744
|
+
void stop( DS1307& s ) {
|
|
745
|
+
return s.stop();
|
|
746
|
+
}
|
|
747
|
+
STR
|
|
748
|
+
|
|
749
|
+
@accessors << accessor
|
|
750
|
+
|
|
751
|
+
@signatures << "DS1307& #{opts[ :as ]}();"
|
|
752
|
+
@other_setup << "\t_#{opts[ :as ]}.start();" if opts[:rtcstart]
|
|
753
|
+
end
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
private
|
|
757
|
+
|
|
758
|
+
def serial_boilerplate #:nodoc:
|
|
759
|
+
|
|
760
|
+
out = <<-STR
|
|
761
|
+
int serial_available() {
|
|
762
|
+
return (Serial.available() > 0);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
char serial_read() {
|
|
766
|
+
return (char) Serial.read();
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
void serial_flush() {
|
|
770
|
+
return Serial.flush();
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
void serial_print( char str ) {
|
|
774
|
+
return Serial.print( str );
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
void serial_print( char* str ) {
|
|
778
|
+
return Serial.print( str );
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
void serial_print( int i ) {
|
|
782
|
+
return Serial.print( i );
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
void serial_print( long i ) {
|
|
786
|
+
return Serial.print( i );
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
void serial_println( char* str ) {
|
|
790
|
+
return Serial.println( str );
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
void serial_println( char str ) {
|
|
794
|
+
return Serial.println( str );
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
void serial_println( int i ) {
|
|
798
|
+
return Serial.println( i );
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
void serial_println( long i ) {
|
|
802
|
+
return Serial.println( i );
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
void serial_print( unsigned long i ) {
|
|
806
|
+
return Serial.print( i );
|
|
807
|
+
}
|
|
808
|
+
STR
|
|
809
|
+
|
|
810
|
+
return out
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
end
|