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.
Files changed (143) hide show
  1. data/History.txt +104 -0
  2. data/License.txt +282 -0
  3. data/Manifest.txt +142 -0
  4. data/README.rdoc +55 -0
  5. data/Rakefile +142 -0
  6. data/bin/hello_world_test/Makefile +436 -0
  7. data/bin/hello_world_test/hello_world.cpp +23 -0
  8. data/bin/rad +302 -0
  9. data/lib/examples/add_hysteresis.rb +13 -0
  10. data/lib/examples/basic_blink.rb +10 -0
  11. data/lib/examples/blink_m_address_assignment.rb +104 -0
  12. data/lib/examples/blink_m_hello.rb +14 -0
  13. data/lib/examples/blink_m_multi.rb +61 -0
  14. data/lib/examples/blink_with_serial.rb +16 -0
  15. data/lib/examples/configure_pa_lcd_boot.rb +91 -0
  16. data/lib/examples/debounce_methods.rb +49 -0
  17. data/lib/examples/external_variable_fu.rb +26 -0
  18. data/lib/examples/external_variables.rb +32 -0
  19. data/lib/examples/first_sound.rb +23 -0
  20. data/lib/examples/frequency_generator.rb +30 -0
  21. data/lib/examples/hello_array.rb +48 -0
  22. data/lib/examples/hello_array2.rb +79 -0
  23. data/lib/examples/hello_array_eeprom.rb +59 -0
  24. data/lib/examples/hello_clock.rb +84 -0
  25. data/lib/examples/hello_eeprom.rb +51 -0
  26. data/lib/examples/hello_eeprom_lcdpa.rb +81 -0
  27. data/lib/examples/hello_format_print.rb +94 -0
  28. data/lib/examples/hello_lcd_charset.rb +75 -0
  29. data/lib/examples/hello_pa_lcd.rb +59 -0
  30. data/lib/examples/hello_servos.rb +88 -0
  31. data/lib/examples/hello_spectra_sound.rb +38 -0
  32. data/lib/examples/hello_world.rb +11 -0
  33. data/lib/examples/hello_xbee.rb +12 -0
  34. data/lib/examples/hysteresis_duel.rb +39 -0
  35. data/lib/examples/i2c_with_clock_chip.rb +124 -0
  36. data/lib/examples/midi_beat_box.rb +86 -0
  37. data/lib/examples/midi_scales.rb +94 -0
  38. data/lib/examples/motor_knob.rb +30 -0
  39. data/lib/examples/servo_buttons.rb +23 -0
  40. data/lib/examples/servo_calibrate_continuous.rb +92 -0
  41. data/lib/examples/servo_throttle.rb +40 -0
  42. data/lib/examples/software_serial.rb +10 -0
  43. data/lib/examples/sparkfun_lcd.rb +48 -0
  44. data/lib/examples/spectra_soft_pot.rb +34 -0
  45. data/lib/examples/times_method.rb +8 -0
  46. data/lib/examples/toggle.rb +10 -0
  47. data/lib/examples/twitter.rb +57 -0
  48. data/lib/examples/two_wire.rb +14 -0
  49. data/lib/libraries/AFSoftSerial/AFSoftSerial.cpp +321 -0
  50. data/lib/libraries/AFSoftSerial/AFSoftSerial.h +61 -0
  51. data/lib/libraries/AFSoftSerial/keywords.txt +18 -0
  52. data/lib/libraries/AF_XPort/AF_XPort.cpp +166 -0
  53. data/lib/libraries/AF_XPort/AF_XPort.h +48 -0
  54. data/lib/libraries/DS1307/DS1307.cpp +162 -0
  55. data/lib/libraries/DS1307/DS1307.h +66 -0
  56. data/lib/libraries/DS1307/keywords.txt +18 -0
  57. data/lib/libraries/FrequencyTimer2/FrequencyTimer2.cpp +144 -0
  58. data/lib/libraries/FrequencyTimer2/FrequencyTimer2.h +42 -0
  59. data/lib/libraries/FrequencyTimer2/keywords.txt +22 -0
  60. data/lib/libraries/I2CEEPROM/I2CEEPROM.cpp +120 -0
  61. data/lib/libraries/I2CEEPROM/I2CEEPROM.h +70 -0
  62. data/lib/libraries/I2CEEPROM/keywords.txt +21 -0
  63. data/lib/libraries/LoopTimer/LoopTimer.cpp +35 -0
  64. data/lib/libraries/LoopTimer/LoopTimer.h +34 -0
  65. data/lib/libraries/LoopTimer/keywords.txt +27 -0
  66. data/lib/libraries/OneWire/OneWire.cpp +194 -0
  67. data/lib/libraries/OneWire/OneWire.h +63 -0
  68. data/lib/libraries/OneWire/keywords.txt +35 -0
  69. data/lib/libraries/OneWire/readme.txt +13 -0
  70. data/lib/libraries/SWSerLCDpa/SWSerLCDpa.cpp +296 -0
  71. data/lib/libraries/SWSerLCDpa/SWSerLCDpa.h +69 -0
  72. data/lib/libraries/SWSerLCDsf/SWSerLCDsf.cpp +311 -0
  73. data/lib/libraries/SWSerLCDsf/SWSerLCDsf.h +67 -0
  74. data/lib/libraries/Servo/Servo.cpp +192 -0
  75. data/lib/libraries/Servo/Servo.h +61 -0
  76. data/lib/libraries/Stepper/Stepper.cpp +220 -0
  77. data/lib/libraries/Stepper/Stepper.h +86 -0
  78. data/lib/libraries/Stepper/keywords.txt +28 -0
  79. data/lib/libraries/Wire/Wire.cpp +262 -0
  80. data/lib/libraries/Wire/Wire.h +67 -0
  81. data/lib/libraries/Wire/keywords.txt +31 -0
  82. data/lib/libraries/Wire/twi.h +57 -0
  83. data/lib/libraries/Wire/utility/twi.c +449 -0
  84. data/lib/libraries/Wire/utility/twi.h +57 -0
  85. data/lib/plugins/bitwise_ops.rb +54 -0
  86. data/lib/plugins/blink.rb +25 -0
  87. data/lib/plugins/blink_m.rb +356 -0
  88. data/lib/plugins/debounce.rb +138 -0
  89. data/lib/plugins/debug_output_to_lcd.rb +71 -0
  90. data/lib/plugins/hysteresis.rb +52 -0
  91. data/lib/plugins/input_output_state.rb +84 -0
  92. data/lib/plugins/lcd_padding.rb +58 -0
  93. data/lib/plugins/mem_test.rb +37 -0
  94. data/lib/plugins/midi.rb +60 -0
  95. data/lib/plugins/parallax_ping.rb +50 -0
  96. data/lib/plugins/servo_pulse.rb +31 -0
  97. data/lib/plugins/servo_setup.rb +86 -0
  98. data/lib/plugins/smoother.rb +54 -0
  99. data/lib/plugins/spark_fun_serial_lcd.rb +100 -0
  100. data/lib/plugins/spectra_symbol.rb +79 -0
  101. data/lib/plugins/twitter_connect.rb +145 -0
  102. data/lib/rad.rb +5 -0
  103. data/lib/rad/README.rdoc +5 -0
  104. data/lib/rad/arduino_plugin.rb +246 -0
  105. data/lib/rad/arduino_sketch.rb +627 -0
  106. data/lib/rad/generators/makefile/makefile.erb +243 -0
  107. data/lib/rad/generators/makefile/makefile.rb +38 -0
  108. data/lib/rad/hardware_library.rb +813 -0
  109. data/lib/rad/init.rb +14 -0
  110. data/lib/rad/progressbar.rb +236 -0
  111. data/lib/rad/rad_processor.rb +128 -0
  112. data/lib/rad/rad_rewriter.rb +94 -0
  113. data/lib/rad/rad_type_checker.rb +26 -0
  114. data/lib/rad/sim/arduino_sketch.rb +57 -0
  115. data/lib/rad/sketch_compiler.rb +47 -0
  116. data/lib/rad/tasks/build_and_make.rake +210 -0
  117. data/lib/rad/tasks/rad.rb +2 -0
  118. data/lib/rad/todo.txt +13 -0
  119. data/lib/rad/variable_processing.rb +153 -0
  120. data/lib/rad/version.rb +9 -0
  121. data/scripts/txt2html +67 -0
  122. data/setup.rb +1585 -0
  123. data/spec/examples/hello_world.rb +11 -0
  124. data/spec/examples/serial_motor.rb +12 -0
  125. data/spec/models/arduino_sketch_spec.rb +82 -0
  126. data/spec/models/sketch_compiler_spec.rb +96 -0
  127. data/spec/models/spec_helper.rb +2 -0
  128. data/spec/sim/hello_world_spec.rb +42 -0
  129. data/spec/spec.opts +1 -0
  130. data/test/test_array_processing.rb +179 -0
  131. data/test/test_plugin_loading.rb +151 -0
  132. data/test/test_translation_post_processing.rb +185 -0
  133. data/test/test_variable_processing.rb +238 -0
  134. data/website/examples/assembler_test.rb.html +73 -0
  135. data/website/examples/gps_reader.rb.html +39 -0
  136. data/website/examples/hello_world.rb.html +38 -0
  137. data/website/examples/serial_motor.rb.html +41 -0
  138. data/website/index.html +178 -0
  139. data/website/index.txt +64 -0
  140. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  141. data/website/stylesheets/screen.css +169 -0
  142. data/website/template.rhtml +48 -0
  143. 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