neo_rad 0.4.0

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 (146) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +112 -0
  3. data/License.txt +282 -0
  4. data/Manifest.txt +144 -0
  5. data/README.rdoc +1 -0
  6. data/Rakefile +142 -0
  7. data/bin/rad +302 -0
  8. data/lib/examples/add_hysteresis.rb +13 -0
  9. data/lib/examples/basic_blink.rb +10 -0
  10. data/lib/examples/blink_m_address_assignment.rb +104 -0
  11. data/lib/examples/blink_m_hello.rb +14 -0
  12. data/lib/examples/blink_m_multi.rb +61 -0
  13. data/lib/examples/blink_with_serial.rb +16 -0
  14. data/lib/examples/configure_pa_lcd_boot.rb +91 -0
  15. data/lib/examples/debounce_methods.rb +49 -0
  16. data/lib/examples/external_variable_fu.rb +26 -0
  17. data/lib/examples/external_variables.rb +32 -0
  18. data/lib/examples/first_sound.rb +23 -0
  19. data/lib/examples/frequency_generator.rb +30 -0
  20. data/lib/examples/hello_array.rb +48 -0
  21. data/lib/examples/hello_array2.rb +112 -0
  22. data/lib/examples/hello_array_eeprom.rb +59 -0
  23. data/lib/examples/hello_clock.rb +84 -0
  24. data/lib/examples/hello_eeprom.rb +51 -0
  25. data/lib/examples/hello_eeprom_lcdpa.rb +81 -0
  26. data/lib/examples/hello_format_print.rb +94 -0
  27. data/lib/examples/hello_lcd_charset.rb +75 -0
  28. data/lib/examples/hello_pa_lcd.rb +59 -0
  29. data/lib/examples/hello_servos.rb +88 -0
  30. data/lib/examples/hello_spectra_sound.rb +38 -0
  31. data/lib/examples/hello_world.rb +11 -0
  32. data/lib/examples/hello_xbee.rb +12 -0
  33. data/lib/examples/hysteresis_duel.rb +39 -0
  34. data/lib/examples/i2c_with_clock_chip.rb +124 -0
  35. data/lib/examples/midi_beat_box.rb +86 -0
  36. data/lib/examples/midi_scales.rb +94 -0
  37. data/lib/examples/motor_knob.rb +30 -0
  38. data/lib/examples/servo_buttons.rb +23 -0
  39. data/lib/examples/servo_calibrate_continuous.rb +92 -0
  40. data/lib/examples/servo_throttle.rb +40 -0
  41. data/lib/examples/software_serial.rb +10 -0
  42. data/lib/examples/sparkfun_lcd.rb +48 -0
  43. data/lib/examples/spectra_soft_pot.rb +34 -0
  44. data/lib/examples/times_method.rb +8 -0
  45. data/lib/examples/toggle.rb +10 -0
  46. data/lib/examples/twitter.rb +57 -0
  47. data/lib/examples/two_wire.rb +14 -0
  48. data/lib/libraries/AFSoftSerial/AFSoftSerial.cpp +321 -0
  49. data/lib/libraries/AFSoftSerial/AFSoftSerial.h +61 -0
  50. data/lib/libraries/AFSoftSerial/keywords.txt +18 -0
  51. data/lib/libraries/AF_XPort/AF_XPort.cpp +166 -0
  52. data/lib/libraries/AF_XPort/AF_XPort.h +48 -0
  53. data/lib/libraries/DS1307/DS1307.cpp +162 -0
  54. data/lib/libraries/DS1307/DS1307.h +66 -0
  55. data/lib/libraries/DS1307/keywords.txt +18 -0
  56. data/lib/libraries/FrequencyTimer2/FrequencyTimer2.cpp +144 -0
  57. data/lib/libraries/FrequencyTimer2/FrequencyTimer2.h +42 -0
  58. data/lib/libraries/FrequencyTimer2/keywords.txt +22 -0
  59. data/lib/libraries/I2CEEPROM/I2CEEPROM.cpp +120 -0
  60. data/lib/libraries/I2CEEPROM/I2CEEPROM.h +70 -0
  61. data/lib/libraries/I2CEEPROM/keywords.txt +21 -0
  62. data/lib/libraries/LoopTimer/LoopTimer.cpp +35 -0
  63. data/lib/libraries/LoopTimer/LoopTimer.h +34 -0
  64. data/lib/libraries/LoopTimer/keywords.txt +27 -0
  65. data/lib/libraries/OneWire/OneWire.cpp +194 -0
  66. data/lib/libraries/OneWire/OneWire.h +63 -0
  67. data/lib/libraries/OneWire/keywords.txt +35 -0
  68. data/lib/libraries/OneWire/readme.txt +13 -0
  69. data/lib/libraries/SWSerLCDpa/SWSerLCDpa.cpp +296 -0
  70. data/lib/libraries/SWSerLCDpa/SWSerLCDpa.h +69 -0
  71. data/lib/libraries/SWSerLCDsf/SWSerLCDsf.cpp +311 -0
  72. data/lib/libraries/SWSerLCDsf/SWSerLCDsf.h +67 -0
  73. data/lib/libraries/Servo/Servo.cpp +192 -0
  74. data/lib/libraries/Servo/Servo.h +61 -0
  75. data/lib/libraries/Stepper/Stepper.cpp +220 -0
  76. data/lib/libraries/Stepper/Stepper.h +86 -0
  77. data/lib/libraries/Stepper/keywords.txt +28 -0
  78. data/lib/libraries/Wire/Wire.cpp +262 -0
  79. data/lib/libraries/Wire/Wire.h +67 -0
  80. data/lib/libraries/Wire/keywords.txt +31 -0
  81. data/lib/libraries/Wire/twi.h +57 -0
  82. data/lib/libraries/Wire/utility/twi.c +449 -0
  83. data/lib/libraries/Wire/utility/twi.h +57 -0
  84. data/lib/plugins/bitwise_ops.rb +54 -0
  85. data/lib/plugins/blink.rb +25 -0
  86. data/lib/plugins/blink_m.rb +356 -0
  87. data/lib/plugins/debounce.rb +138 -0
  88. data/lib/plugins/debug_output_to_lcd.rb +71 -0
  89. data/lib/plugins/hysteresis.rb +52 -0
  90. data/lib/plugins/input_output_state.rb +84 -0
  91. data/lib/plugins/lcd_padding.rb +58 -0
  92. data/lib/plugins/mem_test.rb +37 -0
  93. data/lib/plugins/midi.rb +60 -0
  94. data/lib/plugins/parallax_ping.rb +50 -0
  95. data/lib/plugins/servo_pulse.rb +31 -0
  96. data/lib/plugins/servo_setup.rb +86 -0
  97. data/lib/plugins/smoother.rb +54 -0
  98. data/lib/plugins/spark_fun_serial_lcd.rb +100 -0
  99. data/lib/plugins/spectra_symbol.rb +79 -0
  100. data/lib/plugins/twitter_connect.rb +145 -0
  101. data/lib/rad/README.rdoc +5 -0
  102. data/lib/rad/arduino_plugin.rb +246 -0
  103. data/lib/rad/arduino_sketch.rb +628 -0
  104. data/lib/rad/darwin_installer.rb +23 -0
  105. data/lib/rad/generators/makefile/makefile.erb +243 -0
  106. data/lib/rad/generators/makefile/makefile.rb +38 -0
  107. data/lib/rad/hardware_library.rb +813 -0
  108. data/lib/rad/init.rb +15 -0
  109. data/lib/rad/linux_installer.rb +132 -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/lib/rad.rb +5 -0
  122. data/scripts/txt2html +67 -0
  123. data/setup.rb +1585 -0
  124. data/spec/examples/hello_world.rb +11 -0
  125. data/spec/examples/serial_motor.rb +12 -0
  126. data/spec/models/arduino_sketch_spec.rb +82 -0
  127. data/spec/models/sketch_compiler_spec.rb +96 -0
  128. data/spec/models/spec_helper.rb +2 -0
  129. data/spec/sim/hello_world_spec.rb +42 -0
  130. data/spec/spec.opts +1 -0
  131. data/test/hello_world_test/Makefile +436 -0
  132. data/test/hello_world_test/hello_world.cpp +23 -0
  133. data/test/test_array_processing.rb +179 -0
  134. data/test/test_plugin_loading.rb +151 -0
  135. data/test/test_translation_post_processing.rb +185 -0
  136. data/test/test_variable_processing.rb +238 -0
  137. data/website/examples/assembler_test.rb.html +73 -0
  138. data/website/examples/gps_reader.rb.html +39 -0
  139. data/website/examples/hello_world.rb.html +38 -0
  140. data/website/examples/serial_motor.rb.html +41 -0
  141. data/website/index.html +178 -0
  142. data/website/index.txt +64 -0
  143. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  144. data/website/stylesheets/screen.css +169 -0
  145. data/website/template.rhtml +48 -0
  146. metadata +222 -0
@@ -0,0 +1,356 @@
1
+ class BlinkM < ArduinoPlugin
2
+
3
+ #
4
+ #
5
+ # BlinkM_funcs.h -- Arduino library to control BlinkM
6
+ # --------------
7
+ #
8
+ #
9
+ # Note: original version of this file lives with the BlinkMTester sketch
10
+ #
11
+ # 2007, Tod E. Kurt, ThingM, http://thingm.com/
12
+ #
13
+ # version: 20080203
14
+ #
15
+ # history:
16
+ # 20080101 - initial release
17
+ # 20080203 - added setStartupParam(), bugfix receiveBytes() from Dan Julio
18
+ # 20080727 - ported to rad jd barnhart
19
+ #
20
+ # first step, declare output pin 19 as i2c
21
+ ## output_pin 19, :as => :wire, :device => :i2c, :enable => :true # reminder, true issues wire.begin
22
+
23
+
24
+ include_wire
25
+
26
+ add_blink_m_struct
27
+
28
+
29
+
30
+ # Not needed when pin is declared with :enable => :true
31
+ # In fact, declaring it twice causes nothing but problems
32
+
33
+ static void BlinkM_begin()
34
+ {
35
+ Wire.begin(); // join i2c bus (address optional for master)
36
+ }
37
+
38
+
39
+ // General version of BlinkM_beginWithPower().
40
+
41
+ static void BlinkM_beginWithPowerPins(byte pwrpin, byte gndpin)
42
+ {
43
+ DDRC |= _BV(pwrpin) | _BV(gndpin); // make outputs
44
+ PORTC &=~ _BV(gndpin);
45
+ PORTC |= _BV(pwrpin);
46
+ delay(100); // wait for things to stabilize
47
+
48
+ Wire.begin();
49
+ }
50
+
51
+ // Call this first when BlinkM is plugged directly into Arduino
52
+ // The BlinkMs PWR (power) pins should line up with pins 2 and 3 of the connector,
53
+ // while the I2C (communications) pins should line up with pins 4 and 5.
54
+
55
+ static void BlinkM_beginWithPower()
56
+ {
57
+ BlinkM_beginWithPowerPins( PC3, PC2 );
58
+ }
59
+
60
+ // sends a generic command
61
+
62
+ static void BlinkM_sendCmd(byte addr, byte* cmd, int cmdlen)
63
+ {
64
+ Wire.beginTransmission(addr);
65
+ for( byte i=0; i<cmdlen; i++)
66
+ Wire.send(cmd[i]);
67
+ Wire.endTransmission();
68
+ }
69
+
70
+ // receives generic data
71
+ // returns 0 on success, and -1 if no data available
72
+ // note: responsiblity of caller to know how many bytes to expect
73
+
74
+ static int BlinkM_receiveBytes(byte addr, byte* resp, byte len)
75
+ {
76
+ Wire.requestFrom(addr, len);
77
+ if( Wire.available() ) {
78
+ for( int i=0; i<len; i++)
79
+ resp[i] = Wire.receive();
80
+ return 0;
81
+ }
82
+ return -1;
83
+ }
84
+
85
+ // Sets the I2C address of the BlinkM(s)
86
+ // Typically used to setup BlinkM addresses
87
+ // Connect one and call this with an address like 10,
88
+ // then 11 for the next and so on and so forth
89
+ // Uses "general call" broadcast address
90
+
91
+ static void BlinkM_setAddress(byte newaddress)
92
+ {
93
+ Wire.beginTransmission(0x00); // general call (broadcast address)
94
+ Wire.send('A');
95
+ Wire.send(newaddress);
96
+ Wire.send(0xD0);
97
+ Wire.send(0x0D); // dood!
98
+ Wire.send(newaddress);
99
+ Wire.endTransmission();
100
+ delay(50); // just in case
101
+ }
102
+
103
+
104
+ // Gets the I2C addrss of the BlinkM
105
+ // Kind of redundant when sent to a specific address
106
+ // but uses to verify BlinkM communication
107
+
108
+ static int BlinkM_getAddress(byte addr)
109
+ {
110
+ Wire.beginTransmission(addr);
111
+ Wire.send('a');
112
+ Wire.endTransmission();
113
+ Wire.requestFrom(addr, (byte)1);
114
+ if( Wire.available() ) {
115
+ byte b = Wire.receive();
116
+ return b;
117
+ }
118
+ return -1;
119
+ }
120
+
121
+ // Gets the BlinkM firmware version
122
+
123
+ static int BlinkM_getVersion(byte addr)
124
+ {
125
+ Wire.beginTransmission(addr);
126
+ Wire.send('Z');
127
+ Wire.endTransmission();
128
+ Wire.requestFrom(addr, (byte)2);
129
+ if( Wire.available() ) {
130
+ byte major_ver = Wire.receive();
131
+ byte minor_ver = Wire.receive();
132
+ return (major_ver<<8) + minor_ver;
133
+ }
134
+ return -1;
135
+ }
136
+
137
+ // Demonstrates how to verify you-re talking to a BlinkM
138
+ // and that you know its address -- message version
139
+
140
+ static char* blink_m_check_address_message(byte addr) // :as => :optional
141
+ {
142
+ char message[50];
143
+ char status[5];
144
+ strcpy(message, "received 0x");
145
+ //Serial.print("Checking BlinkM address...");
146
+ int b = BlinkM_getAddress(addr);
147
+ if( b==-1 ) {
148
+ //Serial.println("No response, that's not good");
149
+ return "No response, that's not good"; // no response
150
+ }
151
+ itoa(b, status ,16);
152
+
153
+ //Serial.print("received addr: 0x");
154
+ //Serial.print(b,HEX);
155
+ if( b != addr )
156
+ return "error, mismatch"; // error, addr mismatch
157
+ else
158
+ return strcat(message, status); // match, everything okay
159
+ }
160
+
161
+ // Demonstrates how to verify you-re talking to a BlinkM
162
+ // and that you know its address -- digital version
163
+
164
+ static int BlinkM_checkAddress(byte addr)
165
+ {
166
+ //Serial.print("Checking BlinkM address...");
167
+ int b = BlinkM_getAddress(addr);
168
+ if( b==-1 ) {
169
+ //Serial.println("No response, that's not good");
170
+ return -1; // no response
171
+ }
172
+
173
+ //Serial.print("received addr: 0x");
174
+ //Serial.print(b,HEX);
175
+ if( b != addr )
176
+ return 1; // error, addr mismatch
177
+ else
178
+ return 0; // match, everything okay
179
+ }
180
+
181
+ // Sets the speed of fading between colors.
182
+ // Higher numbers means faster fading, 255 == instantaneous fading
183
+
184
+ static void BlinkM_setFadeSpeed(byte addr, byte fadespeed)
185
+ {
186
+ Wire.beginTransmission(addr);
187
+ Wire.send('f');
188
+ Wire.send(fadespeed);
189
+ Wire.endTransmission();
190
+ }
191
+
192
+ // Sets the light script playback time adjust
193
+ // The timeadj argument is signed, and is an additive value to all
194
+ // durations in a light script. Set to zero to turn off time adjust.
195
+
196
+ static void BlinkM_setTimeAdj(byte addr, byte timeadj)
197
+ {
198
+ Wire.beginTransmission(addr);
199
+ Wire.send('t');
200
+ Wire.send(timeadj);
201
+ Wire.endTransmission();
202
+ }
203
+
204
+ // Fades to an RGB color
205
+
206
+ static void BlinkM_fadeToRGB(byte addr, byte red, byte grn, byte blu)
207
+ {
208
+ Wire.beginTransmission(addr);
209
+ Wire.send('c');
210
+ Wire.send(red);
211
+ Wire.send(grn);
212
+ Wire.send(blu);
213
+ Wire.endTransmission();
214
+ }
215
+
216
+ // Fades to an HSB color
217
+
218
+ static void BlinkM_fadeToHSB(byte addr, byte hue, byte saturation, byte brightness)
219
+ {
220
+ Wire.beginTransmission(addr);
221
+ Wire.send('h');
222
+ Wire.send(hue);
223
+ Wire.send(saturation);
224
+ Wire.send(brightness);
225
+ Wire.endTransmission();
226
+ }
227
+
228
+ // Sets an RGB color immediately
229
+
230
+ static void BlinkM_setRGB(byte addr, byte red, byte grn, byte blu)
231
+ {
232
+ Wire.beginTransmission(addr);
233
+ Wire.send('n');
234
+ Wire.send(red);
235
+ Wire.send(grn);
236
+ Wire.send(blu);
237
+ Wire.endTransmission();
238
+ }
239
+
240
+ // Fades to a random RGB color
241
+
242
+ static void BlinkM_fadeToRandomRGB(byte addr, byte rrnd, byte grnd, byte brnd)
243
+ {
244
+ Wire.beginTransmission(addr);
245
+ Wire.send('C');
246
+ Wire.send(rrnd);
247
+ Wire.send(grnd);
248
+ Wire.send(brnd);
249
+ Wire.endTransmission();
250
+ }
251
+ // Fades to a random HSB color
252
+
253
+ static void BlinkM_fadeToRandomHSB(byte addr, byte hrnd, byte srnd, byte brnd)
254
+ {
255
+ Wire.beginTransmission(addr);
256
+ Wire.send('H');
257
+ Wire.send(hrnd);
258
+ Wire.send(srnd);
259
+ Wire.send(brnd);
260
+ Wire.endTransmission();
261
+ }
262
+
263
+ static void BlinkM_getRGBColor(byte addr, byte* r, byte* g, byte* b)
264
+ {
265
+ Wire.beginTransmission(addr);
266
+ Wire.send('g');
267
+ Wire.endTransmission();
268
+ Wire.requestFrom(addr, (byte)3);
269
+ if( Wire.available() ) {
270
+ *r = Wire.receive();
271
+ *g = Wire.receive();
272
+ *b = Wire.receive();
273
+ }
274
+ }
275
+
276
+ static void BlinkM_playScript(byte addr, byte script_id, byte reps, byte pos)
277
+ {
278
+ Wire.beginTransmission(addr);
279
+ Wire.send('p');
280
+ Wire.send(script_id);
281
+ Wire.send(reps);
282
+ Wire.send(pos);
283
+ Wire.endTransmission();
284
+ }
285
+
286
+ static void BlinkM_stopScript(byte addr)
287
+ {
288
+ Wire.beginTransmission(addr);
289
+ Wire.send('o');
290
+ Wire.endTransmission();
291
+ }
292
+
293
+ static void BlinkM_setScriptLengthReps(byte addr, byte script_id,
294
+ byte len, byte reps)
295
+ {
296
+ Wire.beginTransmission(addr);
297
+ Wire.send('L');
298
+ Wire.send(script_id);
299
+ Wire.send(len);
300
+ Wire.send(reps);
301
+ Wire.endTransmission();
302
+ }
303
+
304
+ static void BlinkM_writeScriptLine(byte addr, byte script_id,
305
+ byte pos, byte dur,
306
+ byte cmd, byte arg1, byte arg2, byte arg3)
307
+ {
308
+ #ifdef BLINKM_FUNCS_DEBUG
309
+ Serial.print("writing line:"); Serial.print(pos,DEC);
310
+ Serial.print(" with cmd:"); Serial.print(cmd);
311
+ Serial.print(" arg1:"); Serial.println(arg1,HEX);
312
+ #endif
313
+ Wire.beginTransmission(addr);
314
+ Wire.send('W');
315
+ Wire.send(script_id);
316
+ Wire.send(pos);
317
+ Wire.send(dur);
318
+ Wire.send(cmd);
319
+ Wire.send(arg1);
320
+ Wire.send(arg2);
321
+ Wire.send(arg3);
322
+ Wire.endTransmission();
323
+ }
324
+
325
+ static void BlinkM_writeScript(byte addr, byte script_id,
326
+ byte len, byte reps,
327
+ blinkm_script_line* lines)
328
+ {
329
+ #ifdef BLINKM_FUNCS_DEBUG
330
+ Serial.print("writing script to addr:"); Serial.print(addr,DEC);
331
+ Serial.print(", script_id:"); Serial.println(script_id,DEC);
332
+ #endif
333
+ for(byte i=0; i < len; i++) {
334
+ blinkm_script_line l = lines[i];
335
+ BlinkM_writeScriptLine( addr, script_id, i, l.dur,
336
+ l.cmd[0], l.cmd[1], l.cmd[2], l.cmd[3]);
337
+ }
338
+ BlinkM_setScriptLengthReps(addr, script_id, len, reps);
339
+ }
340
+
341
+
342
+ static void BlinkM_setStartupParams(byte addr, byte mode, byte script_id,
343
+ byte reps, byte fadespeed, byte timeadj)
344
+ {
345
+ Wire.beginTransmission(addr);
346
+ Wire.send('B');
347
+ Wire.send(mode);
348
+ Wire.send(script_id);
349
+ Wire.send(reps);
350
+ Wire.send(fadespeed);
351
+ Wire.send(timeadj);
352
+ Wire.endTransmission();
353
+ }
354
+
355
+
356
+ end
@@ -0,0 +1,138 @@
1
+ class Debounce < ArduinoPlugin
2
+
3
+
4
+ # RAD plugins are c methods, directives, external variables and assignments and calls
5
+ # that may be added to the main setup method
6
+ # function prototypes not needed since we generate them automatically
7
+
8
+ # directives, external variables and setup assignments and calls can be added rails style (not c style)
9
+ # hack from http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1209050315
10
+
11
+ # plugin_directives "#undef int", "#include <stdio.h>", "char _str[32];", "#define writeln(...) sprintf(_str, __VA_ARGS__); Serial.println(_str)"
12
+ # add to directives
13
+ #plugin_directives "#define EXAMPLE 10"
14
+
15
+ # add to external variables
16
+ # ok, we need to deal with
17
+ # what about variables
18
+ # need to loose the colon...
19
+ # external_variables "char status_message[40] = \"very cool\"", "char* msg[40]"
20
+
21
+ # add the following to the setup method
22
+ # add_to_setup "foo = 1";, "bar = 1;" "sub_setup();"
23
+
24
+ # one or more methods may be added and prototypes are generated automatically with rake make:upload
25
+
26
+ # call pulse(us) to pulse a servo
27
+
28
+ #####################
29
+
30
+ ## How this works
31
+
32
+ ## The cast:
33
+ ## a normally open push button (circuit is closed when button is depressed)
34
+ ## variables [input].
35
+ ## [input]read: or current read -- what we see from the input pin HIGH (1) untouched or LOW (1) depressed
36
+ ## [input]prev: or previous read – assigned to current reading at the end of the method
37
+ ## [input]state: the stored state HIGH (1) or LOW (0)
38
+ ## [input]time: the time when we last had a true
39
+ ## millis: number of milliseconds since the Arduino began running the current program
40
+
41
+ ## So….
42
+
43
+ ## If HIGH and the [input]read was LOW (button was depressed since the last time we looped) AND If millis() - [input]time > 200
44
+ ## Flip the state
45
+ ## And assign [input]time millis()
46
+ ## Else Set the pin to [input]state
47
+ ## Assign [input]prev to [input]read
48
+
49
+ ## abstract summary:
50
+
51
+ ## So 99%+ of the time, we always see a HIGH (unless the button is pushed)
52
+ ## If the button is pushed, we record this LOW to [input]prev, so the next time we enter the loop and the button is not being pushed we see true as long as millis() minus the [input]time of the last toggle is greater the 200 (adjust, which can be set with an adjust option)
53
+
54
+
55
+ ######################
56
+
57
+
58
+ add_debounce_struct
59
+
60
+ # increase the debounce_setting, increase if the output flickers
61
+ # need docs..
62
+ # and testing
63
+ #
64
+ # remember these are being called from the loop (typically)
65
+ #
66
+ # NOTE: if two buttons are controlling one output, today, strange
67
+ # things will happen since each button tries to assert its own state
68
+ # suggestion: we can fix this with an array of structs for shared outputs
69
+ # ie: output_pin 5, :as => :yellow_led, :shared => :yes # default no
70
+ # this would put the state at the output which could be compared to
71
+ # the inputs_state and override and set it if different
72
+
73
+
74
+
75
+ int toggle(int output)
76
+ {
77
+ return toggle_output(output);
78
+ }
79
+
80
+ int toggle_output(int output)
81
+ {
82
+ if (dbce[output].state == HIGH)
83
+ dbce[output].state = LOW;
84
+ else
85
+ dbce[output].state = HIGH;
86
+ digitalWrite(output, dbce[output].state);
87
+
88
+ return dbce[output].state;
89
+ }
90
+
91
+
92
+ int read_input(int input)
93
+ {
94
+ int state = LOW;
95
+ dbce[input].read = digitalRead(input);
96
+
97
+ if (dbce[input].read == HIGH && dbce[input].prev == LOW && millis() - dbce[input].time > dbce[input].adjust)
98
+ {
99
+ dbce[input].time = millis();
100
+ state = HIGH;
101
+ }
102
+ else
103
+ state = LOW;
104
+
105
+ dbce[input].prev = dbce[input].read;
106
+ return state;
107
+ }
108
+
109
+
110
+ int toggle(int input, int output)
111
+ {
112
+ return read_and_toggle(input, output);
113
+ }
114
+
115
+ int read_and_toggle(int input, int output)
116
+ {
117
+ dbce[input].read = digitalRead(input);
118
+ // did we just release a button which was depressed the last time we checked and over 200 millseconds has passed since this statement was last true?
119
+ if (dbce[input].read == HIGH && dbce[input].prev == LOW && millis() - dbce[input].time > dbce[input].adjust) {
120
+ // ... flip the output
121
+ if (dbce[input].state == HIGH)
122
+ dbce[input].state = LOW;
123
+ else
124
+ dbce[input].state = HIGH;
125
+
126
+ /* save time of last press */
127
+ dbce[input].time = millis();
128
+ }
129
+
130
+ digitalWrite(output, dbce[input].state);
131
+
132
+ dbce[input].prev = dbce[input].read;
133
+
134
+ return dbce[input].state;
135
+ }
136
+
137
+
138
+ end
@@ -0,0 +1,71 @@
1
+ class DebugOutputToLcd < ArduinoPlugin
2
+
3
+ # RAD plugins are c methods, directives, external variables and assignments and calls
4
+ # that may be added to the main setup method
5
+ # function prototypes not needed since we generate them automatically
6
+
7
+ # directives, external variables and setup assignments and calls can be added rails style (not c style)
8
+
9
+ # add to directives
10
+ #plugin_directives "#define ARY_SIZE 10"
11
+
12
+ # add to external variables
13
+ #external_variables "unsigned long start_loop_time = 0;", "unsigned long total_loop_time = 0;"
14
+
15
+ # add the following to the setup method
16
+ #add_to_setup "scan = &sm_ary[0];", "cur = &sm_ary[0];", "start = &sm_ary[0];", "end = &sm_ary[ARY_SIZE-1];"
17
+
18
+ # add an element to the array and return the average
19
+
20
+ # need a nice home for these
21
+
22
+
23
+
24
+
25
+
26
+ void send_servo_debug_to_lcd(int servo)
27
+ {
28
+ lcd_first_line();
29
+ Serial.print("pw ");
30
+ Serial.print( find_servo_pulse_width(servo));
31
+ Serial.print(" lp ");
32
+ Serial.print( find_servo_last_pulse(servo));
33
+ Serial.print("s");
34
+ Serial.print( find_servo_start_pulse(servo));
35
+ // Serial.print(" t");
36
+ // Serial.print( find_debounce_time(servo));
37
+
38
+ lcd_second_line();
39
+ Serial.print("d");
40
+ // Serial.print( millis() - find_debounce_time(servo));
41
+ Serial.print(" m");
42
+ Serial.print(millis());
43
+
44
+ }
45
+
46
+
47
+ void send_button_debug_to_lcd(int button)
48
+ {
49
+
50
+ lcd_first_line();
51
+ Serial.print("r");
52
+ Serial.print( find_debounce_read(button));
53
+ Serial.print("p");
54
+ Serial.print( find_debounce_prev(button));
55
+ Serial.print("s");
56
+ Serial.print( find_debounce_state(button));
57
+ Serial.print(" t");
58
+ Serial.print( find_debounce_time(button));
59
+
60
+ lcd_second_line();
61
+ Serial.print("d");
62
+ Serial.print( millis() - find_debounce_time(button));
63
+ Serial.print(" m");
64
+ Serial.print(millis());
65
+
66
+ }
67
+
68
+
69
+
70
+
71
+ end
@@ -0,0 +1,52 @@
1
+ class Hysteresis < ArduinoPlugin
2
+
3
+ # jdbarnhart
4
+ # 20080728
5
+ #
6
+ #
7
+ # purpose
8
+ #
9
+ # add hysteresis to analog readings, typically sensors or potentiometers
10
+ #
11
+ # use
12
+ # two steps
13
+ #
14
+ # one
15
+ # declare :device => :sensor
16
+ # example:
17
+ # input_pin 1, :as => :sensor_one, :device => :sensor
18
+ #
19
+ # two
20
+ # instead of:
21
+ # my_lcd.print analogRead sensor_two
22
+ # use add_hyst
23
+ # my_lcd.print sensor_one.with_hyst 4
24
+ #
25
+ # # note, 4 is the amount of hysteresis
26
+ #
27
+ #
28
+ void with_hysteresis(int pin, int amt)
29
+ {
30
+ with_hyst(pin, amt);
31
+ }
32
+
33
+ int with_hyst(int pin, int amt)
34
+ {
35
+ int read;
36
+ unsigned int i;
37
+ read = analogRead(pin);
38
+ for (i = 0; i < (int) (sizeof(hyst) / sizeof(hyst[0])); i++) {
39
+ if (pin == hyst[i].pin) {
40
+ if (((read - hyst[i].state) > amt ) || ((hyst[i].state - read) > amt )) {
41
+ hyst[i].state = read;
42
+ return hyst[i].state;
43
+ }
44
+ else
45
+ return hyst[i].state;
46
+ }
47
+ }
48
+ }
49
+
50
+
51
+
52
+ end
@@ -0,0 +1,84 @@
1
+ class InputOutputState < ArduinoPlugin
2
+
3
+ # RAD plugins are c methods, directives, external variables and assignments and calls
4
+ # that may be added to the main setup method
5
+ # function prototypes not needed since we generate them automatically
6
+
7
+ # directives, external variables and setup assignments and calls can be added rails style (not c style)
8
+
9
+ # add to directives
10
+ #plugin_directives "#define ARY_SIZE 10"
11
+
12
+ # add to external variables
13
+ #external_variables "int *cur, *scan, *start, *end;", "int sm_ary[ARY_SIZE];"
14
+
15
+ # add the following to the setup method
16
+ #add_to_setup "scan = &sm_ary[0];", "cur = &sm_ary[0];", "start = &sm_ary[0];", "end = &sm_ary[ARY_SIZE-1];"
17
+
18
+ # return states of button and servo output stored in
19
+ # array structs dbcd (debounce) and serv (servo)
20
+ # need error catch ...
21
+ # how about auto generating documentation from plugins
22
+ # at least showing
23
+
24
+
25
+
26
+ int find_debounce_state(int input)
27
+ {
28
+ return dbce[input].state;
29
+ }
30
+
31
+ int find_debounce_read(int input)
32
+ {
33
+ return dbce[input].read;
34
+ }
35
+
36
+ int find_debounce_prev(int input)
37
+ {
38
+ return dbce[input].prev;
39
+ }
40
+
41
+ unsigned long find_debounce_time(int input)
42
+ {
43
+ return dbce[input].time;
44
+ }
45
+
46
+ int find_debounce_adjust(int input)
47
+ {
48
+ return dbce[input].adjust;
49
+ }
50
+
51
+ long unsigned find_servo_pulse_width(int input)
52
+ {
53
+ return serv[input].pulseWidth;
54
+ }
55
+
56
+ unsigned long find_servo_last_pulse(int input)
57
+ {
58
+ return serv[input].lastPulse;
59
+ }
60
+
61
+ unsigned long find_servo_start_pulse(int input)
62
+ {
63
+ return serv[input].startPulse;
64
+
65
+ }
66
+
67
+ unsigned long find_servo_refresh_time(int input)
68
+ {
69
+ return serv[input].refreshTime;
70
+ }
71
+
72
+ int find_servo_min(int input)
73
+ {
74
+ return serv[input].min;
75
+ }
76
+
77
+ int find_servo_max(int input)
78
+ {
79
+ return serv[input].max;
80
+
81
+ }
82
+
83
+
84
+ end