madrona-rad 0.2.4 → 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 (37) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +26 -0
  3. data/bin/rad +28 -36
  4. data/lib/examples/blink_m_hello.rb +14 -0
  5. data/lib/examples/debounce_methods.rb +49 -0
  6. data/lib/examples/external_variable_fu.rb +24 -0
  7. data/lib/examples/external_variables.rb +31 -0
  8. data/lib/examples/hello_eeprom.rb +54 -0
  9. data/lib/examples/i2c_with_clock_chip.rb +124 -0
  10. data/lib/examples/two_wire.rb +14 -0
  11. data/lib/libraries/DS1307/DS1307.cpp +161 -0
  12. data/lib/libraries/DS1307/DS1307.h +64 -0
  13. data/lib/libraries/DS1307/keywords.txt +18 -0
  14. data/lib/libraries/OneWire/OneWire.cpp +194 -0
  15. data/lib/libraries/OneWire/OneWire.h +63 -0
  16. data/lib/libraries/OneWire/keywords.txt +35 -0
  17. data/lib/libraries/OneWire/readme.txt +13 -0
  18. data/lib/libraries/Wire/Wire.cpp +262 -0
  19. data/lib/libraries/Wire/Wire.h +67 -0
  20. data/lib/libraries/Wire/keywords.txt +31 -0
  21. data/lib/libraries/Wire/twi.h +57 -0
  22. data/lib/plugins/bitwise_ops.rb +54 -0
  23. data/lib/plugins/blink_m.rb +304 -6
  24. data/lib/plugins/debounce.rb +46 -24
  25. data/lib/plugins/i2c_eeprom.rb +70 -0
  26. data/lib/rad/arduino_plugin.rb +27 -4
  27. data/lib/rad/arduino_sketch.rb +354 -115
  28. data/lib/rad/generators/makefile/makefile.erb +2 -2
  29. data/lib/rad/generators/makefile/makefile.rb +5 -9
  30. data/lib/rad/init.rb +3 -1
  31. data/lib/rad/rad_processor.rb +11 -0
  32. data/lib/rad/rad_rewriter.rb +1 -1
  33. data/lib/rad/tasks/build_and_make.rake +25 -12
  34. data/lib/rad/variable_processing.rb +116 -0
  35. data/lib/test/test_array_processing.rb +78 -0
  36. data/lib/test/test_variable_processing.rb +188 -0
  37. metadata +29 -3
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 0.2.5 2008-07-21
2
+ * 1ish large post Bastille Day update:
3
+ - added i2c capability
4
+ - added actual Wire library until workaround for os_x file caching is found
5
+ - added DS1307 and OneWire libraries
6
+ - added cool instance variable style global variables
7
+ - added array and define methods
8
+ - added def setup method, which added to setup 
9
+ - added numerous examples
10
+
1
11
  == 0.2.4 2008-07-12
2
12
  * 1ish large update:
3
13
  - added incredibly primitive tests
data/Manifest.txt CHANGED
@@ -5,19 +5,33 @@ README.rdoc
5
5
  Rakefile
6
6
  bin/rad
7
7
  lib/examples/add_hysteresis.rb
8
+ lib/examples/blink_m_hello.rb
9
+ lib/examples/debounce_methods.rb
10
+ lib/examples/external_variables.rb
11
+ lib/examples/external_variable_fu.rb
8
12
  lib/examples/first_sound.rb
9
13
  lib/examples/frequency_generator.rb
14
+ lib/examples/hello_eeprom.rb
10
15
  lib/examples/hello_servos.rb
11
16
  lib/examples/hello_world.rb
17
+ lib/examples/i2c_with_clock_chip.rb
12
18
  lib/examples/orig_servo_throttle.rb
13
19
  lib/examples/servo_buttons.rb
14
20
  lib/examples/servo_throttle.rb
15
21
  lib/examples/sparkfun_lcd.rb
16
22
  lib/examples/times_method.rb
17
23
  lib/examples/toggle.rb
24
+ lib/examples/two_wire.rb
25
+ lib/libraries/DS1307/DS1307.cpp
26
+ lib/libraries/DS1307/DS1307.h
27
+ lib/libraries/DS1307/keywords.txt
18
28
  lib/libraries/FrequencyTimer2/keywords.txt
19
29
  lib/libraries/FrequencyTimer2/FrequencyTimer2.cpp
20
30
  lib/libraries/FrequencyTimer2/FrequencyTimer2.h
31
+ lib/libraries/OneWire/keywords.txt
32
+ lib/libraries/OneWire/OneWire.cpp
33
+ lib/libraries/OneWire/OneWire.h
34
+ lib/libraries/OneWire/readme.txt
21
35
  lib/libraries/Servo/keywords.txt
22
36
  lib/libraries/Servo/Servo.cpp
23
37
  lib/libraries/Servo/Servo.h
@@ -25,9 +39,17 @@ lib/libraries/SWSerLCDpa/SWSerLCDpa.cpp
25
39
  lib/libraries/SWSerLCDpa/SWSerLCDpa.h
26
40
  lib/libraries/SWSerLCDsf/SWSerLCDsf.cpp
27
41
  lib/libraries/SWSerLCDsf/SWSerLCDsf.h
42
+ lib/libraries/Wire/Wire.cpp
43
+ lib/libraries/Wire/keywords.txt
44
+ lib/libraries/Wire/Wire.h
45
+ lib/libraries/Wire/twi.h
46
+ lib/libraries/Wire/utilities/twi.c
47
+ lib/libraries/Wire/utilities/twi.h
48
+ lib/plugins/bitwise_ops.rb
28
49
  lib/plugins/blink_m.rb
29
50
  lib/plugins/debounce.rb
30
51
  lib/plugins/debug_output_to_lcd.rb
52
+ lib/plugins/i2c_eeprom.rb
31
53
  lib/plugins/input_output_state.rb
32
54
  lib/plugins/mem_test.rb
33
55
  lib/plugins/servo_pulse.rb
@@ -39,13 +61,17 @@ lib/rad/arduino_sketch.rb
39
61
  lib/rad/arduino_plugin.rb
40
62
  lib/rad/rad_processor.rb
41
63
  lib/rad/rad_rewriter.rb
64
+ lib/rad/variable_processing.rb
42
65
  lib/rad/init.rb
43
66
  lib/rad/todo.txt
44
67
  lib/rad/tasks/build_and_make.rake
68
+ lib/rad/developer.rake
45
69
  lib/rad/tasks/rad.rb
46
70
  lib/rad/version.rb
47
71
  lib/rad/generators/makefile/makefile.erb
48
72
  lib/rad/generators/makefile/makefile.rb
73
+ lib/test/test_array_processing.rb
74
+ lib/test/test_variable_processing.rb
49
75
  scripts/txt2html
50
76
  setup.rb
51
77
  spec/models/spec_helper.rb
data/bin/rad CHANGED
@@ -103,9 +103,16 @@ puts
103
103
  FileUtils.mkdir_p "#{sketch_name}/vendor/libraries"
104
104
  puts "Successfully created your libraries directory."
105
105
 
106
+ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/DS1307/.", "#{sketch_name}/vendor/libraries/DS1307"
107
+ puts "Installed DS1307 into #{sketch_name}/vendor/libraries"
108
+ puts
106
109
 
107
110
  FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/FrequencyTimer2/.", "#{sketch_name}/vendor/libraries/FrequencyTimer2"
108
- puts "Installed Servo into #{sketch_name}/vendor/libraries"
111
+ puts "Installed FrequencyTimer2 into #{sketch_name}/vendor/libraries"
112
+ puts
113
+
114
+ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/OneWire/.", "#{sketch_name}/vendor/libraries/OneWire"
115
+ puts "Installed OneWire into #{sketch_name}/vendor/libraries"
109
116
  puts
110
117
 
111
118
  FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/Servo/.", "#{sketch_name}/vendor/libraries/Servo"
@@ -120,6 +127,10 @@ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/SWSerLCDsf/.", "#{ske
120
127
  puts "Installed SWSerLCDsf into #{sketch_name}/vendor/libraries"
121
128
  puts
122
129
 
130
+ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/libraries/Wire/.", "#{sketch_name}/vendor/libraries/Wire"
131
+ puts "Installed Wire into #{sketch_name}/vendor/libraries"
132
+ puts
133
+
123
134
  # Build examples -- used for basic testing
124
135
 
125
136
  FileUtils.mkdir_p "#{sketch_name}/vendor/libraries"
@@ -129,6 +140,14 @@ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/examples/.", "#{sketch_name}/ex
129
140
  puts "Installed examples into #{sketch_name}/examples"
130
141
  puts
131
142
 
143
+ # Build test -- used testing
144
+
145
+ FileUtils.mkdir_p "#{sketch_name}/test"
146
+ puts "Successfully created your test directory."
147
+
148
+ FileUtils.cp_r "#{File.dirname(__FILE__)}/../lib/test/.", "#{sketch_name}/test"
149
+ puts "Installed tests into #{sketch_name}/test"
150
+ puts
132
151
 
133
152
  # Build vendor/plugins:
134
153
 
@@ -151,42 +170,15 @@ File.open("#{sketch_name}/#{sketch_name}.rb", "w") do |file|
151
170
  file << <<-EOS
152
171
  class #{sketch_name.split("_").collect{|c| c.capitalize}.join("")} < ArduinoSketch
153
172
 
154
- # quick overview:
155
- # external variables can be added.. use a comma separation, colons are added automatically
156
- #
157
- #external_vars :foo => "long unsigned, 0", :bar => "int"
158
- # result "long unsigned foo = 0" and "int bar;"
159
- # note while this is ruby, many methods and some operators you take for granted are not implemented
160
- # some examples: blocks, case statements, +=
161
- # keep it simple and remember that the arduino uses a simple loop
162
- # you can branch out with your other methods here or use
163
- # add_to_setup to call a method once (todo: look at signatures)
164
- # since all the methods are converted to C, assumptions are made regarding variable types
165
- # for example if we need integers to call serial_print hack = input + output + 1
166
- # pin examples
167
- # input_pin 10, :as => :back_on_button, :latch => :off
168
- # input_pin 12, :as => :back_off_button, :latch => :off
169
- # output_pin 5, :as => :red_led
170
- # input_pin 8, :as => :red_button, :latch => :off, :adjust => 250
171
- # output_pin 4, :as => :top_servo, :min => 700, :max => 2200
172
-
173
- # three line servo (don't forget do declare servo_amount')
174
- # sensor_position = analogRead(sensor)
175
- # servo_amount = (sensor_position*2 + 500)
176
- # move_servo top_servo, servo_amount
177
- # one line debounce:
178
- # debounce_toggle(button, led)
179
- # debounce a read (returns high)
180
- # do_something if debounce_read(button, led)
181
-
182
-
173
+ # looking for hints? check out the examples directory
174
+ # example sketches can be uploaded to your arduino with
175
+ # rake make:upload sketch=examples/hello_world
176
+ # just replace hello_world with other examples
183
177
 
184
- # hello world (uncomment to run)
185
-
186
- #output_pin 13, :as => :led
187
- # def loop
188
- # blink led, 100
189
- # end
178
+ def loop
179
+ # your code here
180
+ end
181
+
190
182
  end
191
183
  EOS
192
184
  end
@@ -0,0 +1,14 @@
1
+ class BlinkMHello < ArduinoSketch
2
+
3
+ # just a scaffolding for blink_m_demo
4
+
5
+ output_pin 19, :as => :wire, :device => :i2c, :enable => :true
6
+
7
+ def loop
8
+
9
+ x = 4
10
+
11
+ end
12
+
13
+
14
+ end
@@ -0,0 +1,49 @@
1
+ class DebounceMethods < ArduinoSketch
2
+
3
+ output_pin 13, :as => :led
4
+ input_pin 6, :as => :button_one, :device => :button # can also :adjust => 300
5
+ input_pin 7, :as => :button_two, :device => :button
6
+ input_pin 8, :as => :button_three, :device => :button
7
+ input_pin 9, :as => :button_four, :device => :button
8
+ input_pin 10, :as => :button_five, :device => :button
9
+
10
+ # depressing and releasing button_one, button_two or button_four do the same thing
11
+ # with a slightly different syntax and number of blinks
12
+ # button_three simply toggles the led with the read_and_toggle method
13
+ # button_five does it with a twist
14
+
15
+ def loop
16
+ blink_twice if read_input button_one
17
+ blink_three_times if read_input button_two
18
+ button_three.read_and_toggle led #
19
+ blink_three_times_basic if read_input button_four
20
+ blink_with_a_twist if read_input button_five
21
+ end
22
+
23
+ def blink_twice
24
+ 2.times do |i|
25
+ led.blink 200 + i
26
+ end
27
+ end
28
+
29
+ def blink_three_times
30
+ 3.times { led.blink 200 }
31
+ end
32
+
33
+ # no blink helper
34
+ def blink_three_times_basic
35
+ 4.times do
36
+ led.digitalWrite HIGH
37
+ delay 200
38
+ led.digitalWrite LOW
39
+ delay 200
40
+ end
41
+ end
42
+
43
+ def blink_with_a_twist
44
+ 20.times do |i|
45
+ led.blink i * 10
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,24 @@
1
+ class ExternalVariableFu < ArduinoSketch
2
+
3
+ @one = int
4
+ @two = long
5
+ @three = unsigned
6
+ @four = short
7
+ @five = byte
8
+ @six = 1
9
+ @seven = 1.2
10
+ @eight = "0x00"
11
+ @nine = "arduino"
12
+ @ten = true
13
+ @eleven = false
14
+ @twelve = "1, long"
15
+ @thirteen = "1, unsigned"
16
+ @fourteen = "1, byte"
17
+
18
+
19
+
20
+ def loop
21
+ delay @six
22
+ end
23
+
24
+ end
@@ -0,0 +1,31 @@
1
+ class ExternalVariables < ArduinoSketch
2
+
3
+ define "DS1307_CTRL 7"
4
+ define "DS1308_CTRL 7"
5
+ array "char buffer[32];"
6
+ array "char bufferz[32];"
7
+
8
+
9
+ @foo = 1
10
+ @bidda = "badda"
11
+ @boom = "1, int"
12
+ @rad = "1.00"
13
+
14
+
15
+
16
+ def loop
17
+
18
+ delay 1
19
+ @foo = 2
20
+
21
+ end
22
+
23
+ def setup # special one time only method
24
+ delay 100
25
+ delay 100
26
+ @foo = 10
27
+ 5.times { delay 200 }
28
+ end
29
+
30
+
31
+ end
@@ -0,0 +1,54 @@
1
+ class HelloEeprom < ArduinoSketch
2
+
3
+ output_pin 19, :as => :rtc, :device => :i2c_ds1307, :enable => :true
4
+ output_pin 19, :as => :mem0, :device => :i2c_eeprom
5
+
6
+ output_pin 14, :as => :myLCD, :device => :pa_lcd, :rate => 19200
7
+
8
+ def loop
9
+ myLCD.home # set to 0,0
10
+ myLCD.print rtc.get(5, 1) # refresh registers (=1) get month
11
+ myLCD.print "/"
12
+ myLCD.print rtc.get(4, 0) # no need to refresh (=0) get day
13
+ myLCD.print "/"
14
+ myLCD.print rtc.get(6, 0) # get year
15
+ myLCD.setxy(1,1) # set in 1 byte line 1 (second line)
16
+ printlz 2 # print hours with lead zero
17
+ myLCD.print ":"
18
+ printlz 1 # print minutes with lead zero
19
+ myLCD.print ":"
20
+ printlz 0 # print seconds with lead zero
21
+
22
+
23
+ myLCD.setxy 10,0
24
+ myLCD.print "write test"
25
+ myLCD.setxy 0,2
26
+ 32.upto(109) do # write address of byte to that b yte
27
+ |x| i2c_eeprom_write_byte 0x50, x, x
28
+ myLCD.print(".") if x%2
29
+ delay 10
30
+ end
31
+
32
+ delay 2000
33
+
34
+ myLCD.setxy 0,2 # clears bottom two lines
35
+ myLCD.print "?l"
36
+ myLCD.setxy 0,3
37
+ myLCD.print "?l"
38
+
39
+ myLCD.setxy 10,0
40
+ myLCD.print "read test "
41
+ myLCD.setxy 0,2
42
+ # read and print 39 addresses with printable numbers
43
+ 75.upto(113) { |x| myLCD.print(i2c_eeprom_read_byte(0x50, x)) }
44
+ delay 10000
45
+ myLCD.clearscr
46
+ end
47
+
48
+ def printlz(w)
49
+ i = 0 + rtc.get(w,0) # the '0 +' is YARH (Yet Another RubyToc Hack)
50
+ myLCD.print "0" if i < 10
51
+ myLCD.print i
52
+ end
53
+
54
+ end
@@ -0,0 +1,124 @@
1
+ class I2cWithClockChip < ArduinoSketch
2
+
3
+ # ----------------------------------------------------------------------------------
4
+ # <b>Time and Temp (20 July 2008)</b>
5
+ # Example #1 - Brian Riley, Underhill Center, VT USA <brianbr@wulden.org>
6
+ #
7
+ # Connections
8
+ # I2C bus - DS1307 Real Time Clock chip
9
+ # Analog 0 (a.k.a Digital 14) - Wulfden K107 seria LCD Controller
10
+ # Peter Anderson chip
11
+ # Digital 8 - Dallas SemiConductor DS18B20 One-Wire temperature Sensor (12 bit)
12
+ #
13
+ # Comment
14
+ # - This is a straight forward, program with minimal error checking and brute force
15
+ # delay() calls waiting for temperature conversion readings
16
+ #
17
+ # - for the external data busses make sure you have 4.7K pullup resistors on the
18
+ # data line (OnewWire) and the SDA/SCL (I2C)
19
+
20
+ # ----------------------------------------------------------------------------------
21
+
22
+ @hi_byte = int
23
+ @lo_byte = int
24
+ @t_reading = int
25
+ @device_crc = int
26
+ @sign_bit = int
27
+ @tc_100 = int
28
+ # implicit in :device => Z:ds1307 is that this i i2c
29
+ # :enable => true issues the Wire.begin to ick over i2c
30
+ output_pin 19, :as => :rtc, :device => :i2c_ds1307, :enable => :true
31
+ # software serial tx drives LCD display, screen cleared at startup
32
+ # defines the softare protocol for controller as Peter Anderson
33
+ output_pin 14, :as => :myLCD, :device => :pa_lcd, :rate => 19200, :clear_screen => :true
34
+ # defines this pin as being connected to a DalSemi 1-Wire device
35
+ # no specific device drivers yet, the specific device code is on you
36
+ output_pin 8, :as => :myTemp, :device => :onewire
37
+
38
+
39
+ def loop
40
+ until myTemp.reset do # reset bus, verify its clear and high
41
+ clear_bottom_line
42
+ myLCD.print " <1Wire Buss Error>"
43
+ delay 2000
44
+ end
45
+
46
+ myTemp.skip # "listen up - everybody!"
47
+ myTemp.write 0x44, 1 # temperature sensors, strta conversion
48
+
49
+ myLCD.setxy 6,0 # while they do that, lets print date/time
50
+ myLCD.print rtc.get(5, 1)
51
+ myLCD.print "/"
52
+ myLCD.print rtc.get(4, 0)
53
+ myLCD.print "/"
54
+ myLCD.print rtc.get(6, 0)
55
+ myLCD.setxy 6,1
56
+ printlz rtc.get(2, 0)
57
+ myLCD.print ":"
58
+ printlz rtc.get(1, 0)
59
+ myLCD.print ":"
60
+ printlz rtc.get(0, 0)
61
+
62
+ delay 800 # conversion takes about 750 msecs
63
+
64
+ until myTemp.reset do # reset bus, verify its clear and high
65
+ clear_bottom_line
66
+ myLCD.print " <1Wire Buss Error>"
67
+ delay 2000
68
+ end
69
+ myTemp.skip # listen up!
70
+ myTemp.write 0xBE, 1 # send me your data conversions
71
+
72
+ @lo_byte = myTemp.read # get irst byte
73
+ @hi_byte = myTemp.read # get second byte
74
+
75
+ # -------------------------------------------------------------
76
+ clear_bottom_line # this code is debug - not necessary
77
+ myLCD.setxy 4,3 # raw hex display of temp value
78
+ myLCD.print "raw = 0x"
79
+ print_hexbyte @hi_byte # prints 2 digit hex w/lead 0
80
+ print_hexbyte @lo_byte
81
+ # -------------------------------------------------------------
82
+
83
+ 7.times { @device_crc = myTemp.read } # get next 6 bytes, drop them on floor
84
+ # next byte the ninth byte is the CRC
85
+
86
+ # DS18B20 brings data temperature back as 12 bits
87
+ # in degrees centigrade with 4 bits fractional, that is
88
+ # each bit s 1/16 of a degreeC
89
+
90
+ @t_reading = build_int @hi_byte, @lo_byte
91
+ @sign_bit = bit_and @t_reading, 0x8000
92
+ @t_reading = twos_comp @t_reading if @sign_bit # negative
93
+
94
+ @tc_100 = (6 * @t_reading) + (@t_reading / 4) #multiply by (100 * 0.0625) or 6.25
95
+
96
+ myLCD.setxy 2,2
97
+ if @sign_bit
98
+ myLCD.print "-"
99
+ else
100
+ myLCD.print " "
101
+ end
102
+ myLCD.print(@tc_100 / 100) # separate off the whole
103
+ myLCD.print "."
104
+ printlz(@tc_100 % 100) # and fractional portions
105
+ myLCD.print " degrees C"
106
+
107
+ end
108
+
109
+ def printlz(w)
110
+ myLCD.print "0" if w < 10
111
+ myLCD.print w
112
+ end
113
+
114
+ def print_hexbyte(w)
115
+ myLCD.print "0" if w < 0x10
116
+ myLCD.print w, 0x10
117
+ end
118
+
119
+ def clear_bottom_line
120
+ myLCD.setxy 0,3
121
+ myLCD.print "?l"
122
+ end
123
+
124
+ end