neo_rad 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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