subduino 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. data/.document +5 -0
  2. data/.gitignore +26 -0
  3. data/Rakefile +76 -0
  4. data/Readme.textile +46 -0
  5. data/VERSION +1 -0
  6. data/bin/subduino +34 -0
  7. data/bin/subduino-cli +65 -0
  8. data/duino/.gitignore +2 -0
  9. data/duino/Makefile +401 -0
  10. data/duino/duino.pde +17 -0
  11. data/duino/duino.rb +16 -0
  12. data/duino/methods.pde +5 -0
  13. data/lib/subduino/ard_io.rb +60 -0
  14. data/lib/subduino/ard_ps.rb +38 -0
  15. data/lib/subduino/arduino.rb +30 -0
  16. data/lib/subduino/parse.rb +61 -0
  17. data/lib/subduino/scaffold/Makefile +401 -0
  18. data/lib/subduino/scaffold/Makefile2 +247 -0
  19. data/lib/subduino/scaffold/generator.rb +29 -0
  20. data/lib/subduino/scaffold/scaffold.pde +17 -0
  21. data/lib/subduino/scaffold/scaffold.rb +16 -0
  22. data/lib/subduino/store.rb +65 -0
  23. data/lib/subduino.rb +48 -0
  24. data/node/arduinode.js +68 -0
  25. data/node/server.js +45 -0
  26. data/node/vendor/faye.js +1925 -0
  27. data/spec/spec_helper.rb +10 -0
  28. data/spec/subduino/ard_io_spec.rb +9 -0
  29. data/spec/subduino/parse_spec.rb +21 -0
  30. data/spec/subduino/store_spec.rb +17 -0
  31. data/spec/subduino_spec.rb +20 -0
  32. data/subduino.gemspec +239 -0
  33. data/webapp/Gemfile +8 -0
  34. data/webapp/Gemfile.lock +14 -0
  35. data/webapp/Rakefile +49 -0
  36. data/webapp/Readme.textile +45 -0
  37. data/webapp/VERSION +1 -0
  38. data/webapp/lib/app.rb +103 -0
  39. data/webapp/lib/duino.rb +213 -0
  40. data/webapp/lib/environment.rb +36 -0
  41. data/webapp/lib/messenger.rb +16 -0
  42. data/webapp/public/app.css +119 -0
  43. data/webapp/public/app.js +34 -0
  44. data/webapp/public/faye.js +1 -0
  45. data/webapp/public/icons/alarm-clock-blue.png +0 -0
  46. data/webapp/public/icons/alarm-clock.png +0 -0
  47. data/webapp/public/icons/balloon-left.png +0 -0
  48. data/webapp/public/icons/bandaid.png +0 -0
  49. data/webapp/public/icons/bell-disable.png +0 -0
  50. data/webapp/public/icons/bell.png +0 -0
  51. data/webapp/public/icons/big_icon.png +0 -0
  52. data/webapp/public/icons/bomb.png +0 -0
  53. data/webapp/public/icons/bookmark.png +0 -0
  54. data/webapp/public/icons/box-label.png +0 -0
  55. data/webapp/public/icons/brightness-control-up.png +0 -0
  56. data/webapp/public/icons/brightness-control.png +0 -0
  57. data/webapp/public/icons/brightness-small.png +0 -0
  58. data/webapp/public/icons/broom.png +0 -0
  59. data/webapp/public/icons/bug.png +0 -0
  60. data/webapp/public/icons/calculator.png +0 -0
  61. data/webapp/public/icons/calendar-day.png +0 -0
  62. data/webapp/public/icons/camera.png +0 -0
  63. data/webapp/public/icons/cards-address.png +0 -0
  64. data/webapp/public/icons/chart.png +0 -0
  65. data/webapp/public/icons/clock-select.png +0 -0
  66. data/webapp/public/icons/color.png +0 -0
  67. data/webapp/public/icons/compass.png +0 -0
  68. data/webapp/public/icons/control-power-small.png +0 -0
  69. data/webapp/public/icons/control-power.png +0 -0
  70. data/webapp/public/icons/control-record-small.png +0 -0
  71. data/webapp/public/icons/cpus.png +0 -0
  72. data/webapp/public/icons/credit-card.png +0 -0
  73. data/webapp/public/icons/cross-small.png +0 -0
  74. data/webapp/public/icons/dashboard.png +0 -0
  75. data/webapp/public/icons/database.png +0 -0
  76. data/webapp/public/icons/databases.png +0 -0
  77. data/webapp/public/icons/door-open-in.png +0 -0
  78. data/webapp/public/icons/door-open-out.png +0 -0
  79. data/webapp/public/icons/door-open.png +0 -0
  80. data/webapp/public/icons/door.png +0 -0
  81. data/webapp/public/icons/drive-globe.png +0 -0
  82. data/webapp/public/icons/equalizer.png +0 -0
  83. data/webapp/public/icons/exclamation-diamond.png +0 -0
  84. data/webapp/public/icons/exclamation.png +0 -0
  85. data/webapp/public/icons/eye-disable.png +0 -0
  86. data/webapp/public/icons/eye.png +0 -0
  87. data/webapp/public/icons/false.png +0 -0
  88. data/webapp/public/icons/gear-small.png +0 -0
  89. data/webapp/public/icons/gear.png +0 -0
  90. data/webapp/public/icons/groups.png +0 -0
  91. data/webapp/public/icons/heart.png +0 -0
  92. data/webapp/public/icons/heart_empty.png +0 -0
  93. data/webapp/public/icons/info.png +0 -0
  94. data/webapp/public/icons/key.png +0 -0
  95. data/webapp/public/icons/lightbulb.png +0 -0
  96. data/webapp/public/icons/lightbulb_off.png +0 -0
  97. data/webapp/public/icons/lightning-disable.png +0 -0
  98. data/webapp/public/icons/lightning-small.png +0 -0
  99. data/webapp/public/icons/lightning.png +0 -0
  100. data/webapp/public/icons/lock-unlock.png +0 -0
  101. data/webapp/public/icons/lock.png +0 -0
  102. data/webapp/public/icons/marker.png +0 -0
  103. data/webapp/public/icons/media-player-phone.png +0 -0
  104. data/webapp/public/icons/megaphone.png +0 -0
  105. data/webapp/public/icons/mem.png +0 -0
  106. data/webapp/public/icons/microphone.png +0 -0
  107. data/webapp/public/icons/monitor.png +0 -0
  108. data/webapp/public/icons/navigation.png +0 -0
  109. data/webapp/public/icons/off.png +0 -0
  110. data/webapp/public/icons/on.png +0 -0
  111. data/webapp/public/icons/pin.png +0 -0
  112. data/webapp/public/icons/plug--exclamation.png +0 -0
  113. data/webapp/public/icons/plug-disable.png +0 -0
  114. data/webapp/public/icons/plug.png +0 -0
  115. data/webapp/public/icons/restart.png +0 -0
  116. data/webapp/public/icons/ruby.png +0 -0
  117. data/webapp/public/icons/server.png +0 -0
  118. data/webapp/public/icons/shield-disable.png +0 -0
  119. data/webapp/public/icons/shield.png +0 -0
  120. data/webapp/public/icons/socket--exclamation.png +0 -0
  121. data/webapp/public/icons/socket-disable.png +0 -0
  122. data/webapp/public/icons/socket.png +0 -0
  123. data/webapp/public/icons/start.png +0 -0
  124. data/webapp/public/icons/stop.png +0 -0
  125. data/webapp/public/icons/switch--exclamation.png +0 -0
  126. data/webapp/public/icons/switch-disable.png +0 -0
  127. data/webapp/public/icons/switch-small.png +0 -0
  128. data/webapp/public/icons/switch.png +0 -0
  129. data/webapp/public/icons/target.png +0 -0
  130. data/webapp/public/icons/television-off.png +0 -0
  131. data/webapp/public/icons/television.png +0 -0
  132. data/webapp/public/icons/terminal.png +0 -0
  133. data/webapp/public/icons/tick-small.png +0 -0
  134. data/webapp/public/icons/traffic-light-off.png +0 -0
  135. data/webapp/public/icons/traffic-light.png +0 -0
  136. data/webapp/public/icons/traffic.png +0 -0
  137. data/webapp/public/icons/true.png +0 -0
  138. data/webapp/public/icons/umbrella.png +0 -0
  139. data/webapp/public/icons/unmonitor.png +0 -0
  140. data/webapp/public/icons/unmonitored.png +0 -0
  141. data/webapp/public/icons/users.png +0 -0
  142. data/webapp/public/icons/vcard.png +0 -0
  143. data/webapp/public/icons/wall.png +0 -0
  144. data/webapp/public/icons/wall_brick.png +0 -0
  145. data/webapp/public/icons/wall_disable.png +0 -0
  146. data/webapp/public/icons/wand-disable.png +0 -0
  147. data/webapp/public/icons/wand.png +0 -0
  148. data/webapp/public/icons/warn.png +0 -0
  149. data/webapp/public/icons/weather_clouds.png +0 -0
  150. data/webapp/public/icons/weather_cloudy.png +0 -0
  151. data/webapp/public/icons/weather_lightning.png +0 -0
  152. data/webapp/public/icons/weather_rain.png +0 -0
  153. data/webapp/public/icons/weather_snow.png +0 -0
  154. data/webapp/public/icons/weather_sun.png +0 -0
  155. data/webapp/public/icons/wrench-screwdriver.png +0 -0
  156. data/webapp/public/icons/wrench.png +0 -0
  157. data/webapp/public/iui/backButton.png +0 -0
  158. data/webapp/public/iui/blueButton.png +0 -0
  159. data/webapp/public/iui/cancel.png +0 -0
  160. data/webapp/public/iui/grayButton.png +0 -0
  161. data/webapp/public/iui/greenButton.png +0 -0
  162. data/webapp/public/iui/iui-logo-touch-icon.png +0 -0
  163. data/webapp/public/iui/iui.css +396 -0
  164. data/webapp/public/iui/iui.js +511 -0
  165. data/webapp/public/iui/iuix.css +1 -0
  166. data/webapp/public/iui/iuix.js +1 -0
  167. data/webapp/public/iui/listArrow.png +0 -0
  168. data/webapp/public/iui/listArrowSel.png +0 -0
  169. data/webapp/public/iui/listGroup.png +0 -0
  170. data/webapp/public/iui/loading.gif +0 -0
  171. data/webapp/public/iui/pinstripes.png +0 -0
  172. data/webapp/public/iui/redButton.png +0 -0
  173. data/webapp/public/iui/selection.png +0 -0
  174. data/webapp/public/iui/thumb.png +0 -0
  175. data/webapp/public/iui/toggle.png +0 -0
  176. data/webapp/public/iui/toggleOn.png +0 -0
  177. data/webapp/public/iui/toolButton.png +0 -0
  178. data/webapp/public/iui/toolbar.png +0 -0
  179. data/webapp/public/iui/whiteButton.png +0 -0
  180. data/webapp/public/iui/yellowButton.png +0 -0
  181. data/webapp/public/jquery.js +154 -0
  182. data/webapp/public/layout.css +33 -0
  183. data/webapp/public/right.js +9 -0
  184. data/webapp/public/rt.js +7 -0
  185. data/webapp/public/sparkline.js +85 -0
  186. data/webapp/spec/duino_spec.rb +8 -0
  187. data/webapp/spec/spec_helper.rb +10 -0
  188. data/webapp/views/command.haml +4 -0
  189. data/webapp/views/icon.haml +6 -0
  190. data/webapp/views/index.haml +51 -0
  191. data/webapp/views/layout.haml +17 -0
  192. data/webapp/views/mobile.haml +21 -0
  193. data/webapp/views/switch.haml +56 -0
  194. data/webapp/views/top.haml +4 -0
  195. data/webapp/views/watch.haml +26 -0
  196. metadata +277 -0
@@ -0,0 +1,247 @@
1
+ #
2
+ # Copyright 2010 Alan Burlison. All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # 1. Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # THIS SOFTWARE IS PROVIDED BY ALAN BURLISON "AS IS" AND ANY EXPRESS OR IMPLIED
15
+ # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16
+ # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17
+ # EVENT SHALL ALAN BURLISON OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
18
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
20
+ # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
22
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
23
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
+ #
25
+ # Makefile for building Arduino projects outside of the Arduino environment
26
+ #
27
+ # This makefile should be included into a per-project Makefile of the following
28
+ # form:
29
+ #
30
+ # ----------
31
+ # BOARD = mega
32
+ # PORT = /dev/term/0
33
+ # INC_DIRS = ../common
34
+ # LIB_DIRS = ../libraries/Task ../../libraries/VirtualWire
35
+ # include ../../Makefile.master
36
+ # ----------
37
+ #
38
+ # Where:
39
+ # BOARD : Arduino board type, from $(ARD_HOME)/hardware/boards.txt
40
+ # PORT : USB port
41
+ # INC_DIRS : List pf directories containing header files
42
+ # LIB_DIRS : List of directories containing library source
43
+ #
44
+ # Before using this Makefile you should adjust the following macros to suit
45
+ # your environment, either by editing this file directly or by defining them in
46
+ # the Makefile that includes this one:
47
+ # ARD_REV : Arduino software revision, e.g. 0017, 0018
48
+ # ARD_HOME : Installation directory of the Arduino software.
49
+ # MON_TERM : terminal command for serial monitor
50
+ # MON_CMD : serial monitor command
51
+ # MON_SPEED : serial monitor speed
52
+ #
53
+
54
+ # Global configuration.
55
+ ARD_REV ?= 0018
56
+ ARD_HOME ?= /usr/share/arduino
57
+ MON_TERM ?= gnome-terminal
58
+ MON_SPEED ?= 9600
59
+ MON_CMD ?= tip
60
+
61
+ ### Nothing below here should require editing. ###
62
+
63
+ # Check for the required definitions.
64
+
65
+ ifndef BOARD
66
+ $(error $$(BOARD) not defined)
67
+ endif
68
+ ifndef PORT
69
+ $(error $$(PORT) not defined)
70
+ endif
71
+
72
+ # Version-specific settings
73
+ ifeq ($(ARD_REV),0018)
74
+ ARD_BOARDS = $(ARD_HOME)/hardware/arduino/boards.txt
75
+ ARD_SRC_DIR = $(ARD_HOME)/hardware/arduino/cores/arduino
76
+ ARD_MAIN = $(ARD_SRC_DIR)/main.cpp
77
+ else
78
+ ARD_BOARDS = $(ARD_HOME)/hardware/boards.txt
79
+ ARD_SRC_DIR = $(ARD_HOME)/hardware/cores/arduino
80
+ ARD_MAIN = $(ARD_SRC_DIR)/main.cxx
81
+ endif
82
+
83
+ # Standard macros.
84
+ PROGRAMMER ?= arduino
85
+ SKETCH = $(notdir $(CURDIR))
86
+ ARD_BIN = $(ARD_HOME)/hardware/tools/gcc-avr/bin
87
+ BUILD_DIR = build
88
+ VPATH = $(LIB_DIRS)
89
+
90
+ # Macros derived from boards.txt
91
+ MCU := $(shell sed -n 's/$(BOARD)\.build\.mcu=\(.*\)/\1/p' < $(ARD_BOARDS))
92
+ F_CPU := $(shell sed -n 's/$(BOARD)\.build\.f_cpu=\(.*\)/\1/p' < $(ARD_BOARDS))
93
+ UPLOAD_SPEED := \
94
+ $(shell sed -n 's/$(BOARD)\.upload\.speed=\(.*\)/\1/p' < $(ARD_BOARDS))
95
+
96
+ # Build tools.
97
+ CC = $(ARD_BIN)/avr-gcc
98
+ CXX = $(ARD_BIN)/avr-g++
99
+ CXXFILT = $(ARD_BIN)/avr-c++filt
100
+ OBJCOPY = $(ARD_BIN)/avr-objcopy
101
+ OBJDUMP = $(ARD_BIN)/avr-objdump
102
+ AR = $(ARD_BIN)/avr-ar
103
+ SIZE = $(ARD_BIN)/avr-size
104
+ NM = $(ARD_BIN)/avr-nm
105
+ AVRDUDE = $(ARD_HOME)/hardware/tools/avrdude
106
+ AVRDUDE_CONF = $(ARD_HOME)/hardware/tools/avrdude.conf
107
+ MKDIR = mkdir -p
108
+ RM = rm -rf
109
+ MV = mv -f
110
+
111
+ # Compiler flags.
112
+ INC_FLAGS = \
113
+ $(addprefix -I,$(INC_DIRS)) $(addprefix -I,$(LIB_DIRS)) -I$(ARD_SRC_DIR)
114
+ ARD_FLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=$(ARD_REV)
115
+ C_CXX_FLAGS = \
116
+ -Wall -Wextra -Wundef -Werror -Wno-unused-parameter \
117
+ -Wno-attributes -fdiagnostics-show-option -g -Wa,-adhlns=$(BUILD_DIR)/$*.lst
118
+ C_FLAGS = \
119
+ $(C_CXX_FLAGS) -std=gnu99 -Wstrict-prototypes -Wno-old-style-declaration
120
+ CXX_FLAGS = $(C_CXX_FLAGS)
121
+
122
+ # Optimiser flags.
123
+ # optimise for size, unsigned by default, pack data.
124
+ # separate sections, drop unused ones, shorten branches, jumps.
125
+ # don't inline, vectorise loops. no exceptions.
126
+ # no os preamble, use function calls in prologues.
127
+ # http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html
128
+ # http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html
129
+ # XXX does it really cause it to fail?
130
+ # NB would like to add -fno-split-wide-types but that makes upload verify fail
131
+ OPT_FLAGS = \
132
+ -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
133
+ -ffunction-sections -fdata-sections -Wl,--gc-sections,--relax \
134
+ -fno-inline-small-functions -fno-tree-scev-cprop -fno-exceptions \
135
+ -ffreestanding -mcall-prologues -fno-split-wide-types
136
+
137
+ # Build parameters.
138
+ IMAGE = $(BUILD_DIR)/$(SKETCH)
139
+ ARD_C_SRC = $(wildcard $(ARD_SRC_DIR)/*.c)
140
+ ARD_CXX_SRC = $(filter-out %/main.cpp,$(wildcard $(ARD_SRC_DIR)/*.cpp))
141
+ ARD_C_OBJ = $(patsubst %.c,%.o,$(notdir $(ARD_C_SRC)))
142
+ ARD_CXX_OBJ = $(patsubst %.cpp,%.o,$(notdir $(ARD_CXX_SRC)))
143
+ ARD_LIB = arduino
144
+ ARD_AR = $(BUILD_DIR)/lib$(ARD_LIB).a
145
+ ARD_AR_OBJ = $(ARD_AR)($(ARD_C_OBJ) $(ARD_CXX_OBJ))
146
+ ARD_LD_FLAG = -l$(ARD_LIB)
147
+
148
+ # Workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34734
149
+ $(ARD_AR)(Tone.o) : CXX_FLAGS += -w
150
+
151
+ # Sketch libraries.
152
+ LIB_C_SRC = $(foreach ld,$(LIB_DIRS),$(wildcard $(ld)/*.c))
153
+ LIB_CXX_SRC = $(foreach ld,$(LIB_DIRS),$(wildcard $(ld)/*.cpp))
154
+ LIB_SRC = $(LIB_C_SRC) $(LIB_CXX_SRC)
155
+ ifneq "$(strip $(LIB_C_SRC) $(LIB_CXX_SRC))" ""
156
+ LIB_C_OBJ = $(patsubst %.c,%.o,$(notdir $(LIB_C_SRC)))
157
+ LIB_CXX_OBJ = $(patsubst %.cpp,%.o,$(notdir $(LIB_CXX_SRC)))
158
+ LIB_LIB = library
159
+ LIB_AR = $(BUILD_DIR)/lib$(LIB_LIB).a
160
+ LIB_AR_OBJ = $(LIB_AR)($(LIB_C_OBJ) $(LIB_CXX_OBJ))
161
+ LIB_LD_FLAG = -l$(LIB_LIB)
162
+ endif
163
+
164
+ # Sketch PDE, C and C++ source.
165
+ SKT_PDE_SRC = $(wildcard *.pde)
166
+ SKT_C_SRC = $(wildcard *.c)
167
+ SKT_CXX_SRC = $(wildcard *.cpp)
168
+ ifneq "$(strip $(SKT_C_SRC) $(SKT_CXX_SRC))" ""
169
+ ifneq "$(strip $(SKT_PDE_SRC))" ""
170
+ SKT_PDE_OBJ = $(BUILD_DIR)/$(SKETCH)_pde.o
171
+ endif
172
+ SKT_C_OBJ = $(patsubst %.c,%.o,$(SKT_C_SRC))
173
+ SKT_CXX_OBJ = $(patsubst %.cpp,%.o,$(SKT_CXX_SRC))
174
+ SKT_LIB = sketch
175
+ SKT_AR = $(BUILD_DIR)/lib$(SKT_LIB).a
176
+ SKT_AR_OBJ = $(SKT_AR)/($(SKT_C_OBJ) $(SKT_CXX_OBJ))
177
+ SKT_LD_FLAG = -l$(SKT_LIB)
178
+ endif
179
+
180
+ # Definitions.
181
+ define run-cc
182
+ $(CC) -c $(C_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) $(INC_FLAGS) \
183
+ $< -o $(BUILD_DIR)/$*.o
184
+ @ $(AR) rc $@ $(BUILD_DIR)/$*.o
185
+ @ $(RM) $(BUILD_DIR)/$*.o
186
+ @ $(CXXFILT) < $(BUILD_DIR)/$*.lst > $(BUILD_DIR)/$*.lst.tmp
187
+ @ $(MV) $(BUILD_DIR)/$*.lst.tmp $(BUILD_DIR)/$*.lst
188
+ endef
189
+
190
+ define run-cxx
191
+ $(CXX) -c $(CXX_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) $(INC_FLAGS) \
192
+ $< -o $(BUILD_DIR)/$*.o
193
+ @ $(AR) rc $@ $(BUILD_DIR)/$*.o
194
+ @ $(RM) $(BUILD_DIR)/$*.o
195
+ @ $(CXXFILT) < $(BUILD_DIR)/$*.lst > $(BUILD_DIR)/$*.lst.tmp
196
+ @ $(MV) $(BUILD_DIR)/$*.lst.tmp $(BUILD_DIR)/$*.lst
197
+ endef
198
+
199
+ # Rules.
200
+ .PHONY : all clean upload monitor upload_monitor
201
+
202
+ all : $(BUILD_DIR) $(IMAGE).hex
203
+
204
+ clean : $(RM) $(BUILD_DIR)
205
+
206
+ $(BUILD_DIR) : $(MKDIR) $@
207
+
208
+ $(SKT_PDE_OBJ) : $(SKT_PDE_SRC)
209
+ echo '#include <WProgram.h>' > $(BUILD_DIR)/$(SKETCH)_pde.cpp
210
+ cat $^ $(ARD_MAIN) >> $(BUILD_DIR)/$(SKETCH)_pde.cpp
211
+ cd $(BUILD_DIR) && $(CXX) -c $(subst build/,,$(CXX_FLAGS)) \
212
+ $(OPT_FLAGS) $(ARD_FLAGS) -I.. \
213
+ $(subst -I../,-I../../,$(INC_FLAGS)) $(SKETCH)_pde.cpp -o $(@F)
214
+
215
+ (%.o) : $(ARD_SRC_DIR)/%.c
216
+ $(run-cc)
217
+
218
+ (%.o) : $(ARD_SRC_DIR)/%.cpp
219
+ $(run-cxx)
220
+
221
+ (%.o) : %.c
222
+ $(run-cc)
223
+
224
+ (%.o) : %.cpp
225
+ $(run-cxx)
226
+
227
+ $(IMAGE).hex : $(ARD_AR_OBJ) $(LIB_AR_OBJ) $(SKT_AR_OBJ) $(SKT_PDE_OBJ)
228
+ $(CXX) $(CXX_FLAGS) $(OPT_FLAGS) $(ARD_FLAGS) -L$(BUILD_DIR) \
229
+ $(SKT_PDE_OBJ) $(SKT_LD_FLAG) $(LIB_LD_FLAG) $(ARD_LD_FLAG) \
230
+ -o $(IMAGE).elf
231
+ $(OBJCOPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load \
232
+ --no-change-warnings --change-section-lma .eeprom=0 $(IMAGE).elf \
233
+ $(IMAGE).eep
234
+ $(OBJCOPY) -O ihex -R .eeprom $(IMAGE).elf $(IMAGE).hex
235
+ $(SIZE) $(IMAGE).hex
236
+
237
+ upload : all
238
+ - pkill -f $(MON_CMD).*$(PORT)
239
+ - $(AVRDUDE) -C$(AVRDUDE_CONF) -p$(MCU) -c$(PROGRAMMER) -P$(PORT) \
240
+ -b$(UPLOAD_SPEED) -D -Uflash:w:$(IMAGE).hex:i -q
241
+
242
+ monitor :
243
+ LD_LIBRARY_PATH= LD_PRELOAD= \
244
+ $(MON_TERM) -t '$(BOARD) $(PORT)' \
245
+ -e '$(MON_CMD) -$(MON_SPEED) $(PORT)' &
246
+
247
+ upload_monitor : upload monitor
@@ -0,0 +1,29 @@
1
+
2
+ module Subduino
3
+ class Generator
4
+
5
+ Files = %w{ Makefile scaffold.rb scaffold.pde}
6
+ class << self
7
+
8
+ def copy_files(dir)
9
+ name = dir.split("/").last
10
+ Files.each do |file|
11
+ puts "Working on #{file}"
12
+ dump = File.open(File.dirname(__FILE__) + "/#{file}").readlines
13
+ file.gsub!(/scaffold/, name)
14
+ File.open(dir + "/#{file}", 'w') do |f|
15
+ f.write(dump.join.gsub(/!!SCAFFOLD!!/, name))
16
+ end
17
+ end
18
+ end
19
+
20
+ def os_detect
21
+ case RUBY_PLATFORM
22
+ when /linux/ then ""
23
+ when /darwin/ then ""
24
+ else raise "Dunno how to play with #{RUBY_PLATFORM}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ /*
2
+ *
3
+ * SCAFFOLD
4
+ *
5
+ *
6
+ * #{Time.now}
7
+ */
8
+
9
+ #include <Messenger.h>
10
+
11
+ void setup() {
12
+
13
+ }
14
+
15
+ void loop() {
16
+
17
+ }
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # SCAFFOLD
4
+ #
5
+ #
6
+
7
+ require "rubygems"
8
+ require "subduino"
9
+
10
+
11
+ Subduino.start do |r|
12
+ puts "Received #{r}"
13
+ end
14
+
15
+ # Subduino.write("Hi")
16
+
@@ -0,0 +1,65 @@
1
+ #
2
+ # Subduino Persistent Store
3
+ #
4
+ #
5
+ # Uses redis to store.
6
+ # Maybe Tokyo/PG support in the future...
7
+ #
8
+ module Subduino
9
+ class Store
10
+ class << self
11
+
12
+ def redis
13
+ @redis ||= Redis.new(:timeout => 0) rescue false
14
+ end
15
+
16
+
17
+ def read(key)
18
+ redis.get key
19
+ end
20
+
21
+ def write(key, val=nil)
22
+ if val
23
+ add_to_store key, val
24
+ else
25
+ key.each do |k,v|
26
+ add_to_store k, v
27
+ end
28
+ end
29
+ end
30
+
31
+ def add_to_store(k, v)
32
+ return unless redis.connected?
33
+ redis.set k, v
34
+ redis.rpush "#{k}_log", v
35
+ end
36
+
37
+ def add_csv_to_store(csv)
38
+ Log.info "[STORE] CSV #{Time.now.to_i}"
39
+ csv.split(",").each do |d|
40
+ comm, value = d.split(":")
41
+ write(comm, value)
42
+ end
43
+ end
44
+
45
+ def count
46
+ redis.dbsize
47
+ end
48
+
49
+ def flush
50
+ redis.flushdb
51
+ #redis.flushall
52
+ end
53
+
54
+ def all
55
+ redis.keys
56
+ end
57
+
58
+
59
+ # def method_missing(*args)
60
+ # read(args[0])
61
+ # end
62
+
63
+ end
64
+ end
65
+ end
data/lib/subduino.rb ADDED
@@ -0,0 +1,48 @@
1
+ #
2
+ #
3
+ # Arduino PubSub Hub
4
+ #
5
+ #
6
+ #
7
+ require 'serialport'
8
+ require 'eventmachine'
9
+ require 'stringio'
10
+ require 'readline'
11
+ require 'logger'
12
+ require 'redis'
13
+
14
+ require 'subduino/ard_io'
15
+ require 'subduino/ard_ps'
16
+ require 'subduino/parse'
17
+ require 'subduino/store'
18
+ require 'subduino/arduino'
19
+
20
+ Thread.current.abort_on_exception = false
21
+
22
+ module Subduino
23
+ Log = Logger.new("out.log")
24
+ BAUDS = 115200 #BAUDS = 9600
25
+ # BAUDS = [300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200]
26
+ Sensors = [:temp, :lux]
27
+ # DATA_BITS = 8
28
+ # DATA_STOP = 1
29
+
30
+
31
+ def self.start(&proc)
32
+ trap(:TERM) { stop! }
33
+ trap(:INT) { stop! }
34
+ # Start some threads...
35
+ ArdIO.read &proc
36
+ ArdPS.read
37
+
38
+ # Be a daemon. Should be a better way..
39
+ # EM.run do; end
40
+ end
41
+
42
+ def self.stop!
43
+ ArdIO.stop!
44
+ ArdPS.stop!
45
+ exit 0
46
+ end
47
+
48
+ end
data/node/arduinode.js ADDED
@@ -0,0 +1,68 @@
1
+ // Arduino Node.js
2
+
3
+
4
+ var sys = require('sys'),
5
+ fs = require('fs'),
6
+ faye = require('./vendor/faye');
7
+
8
+ var dpath = "/dev/ttyUSB1";
9
+
10
+ var client = new faye.Client('http://localhost:8000/faye');
11
+
12
+ var subscription = client.subscribe('/foo', function(message) {
13
+ sys.puts("SUB!!!"); // handle message
14
+ });
15
+
16
+ var log = function(txt) {
17
+ sys.puts(txt)
18
+ }
19
+
20
+ var find_arduino = function(err, stats) {
21
+ if(err)
22
+ return log("Arduino not found...");
23
+
24
+ log("DUIN!");
25
+ log(sys.inspect(stats));
26
+ }
27
+
28
+ fs.stat("/dev/ttyUSB1", find_arduino);
29
+
30
+
31
+ var spawn = require('child_process').spawn,
32
+ stty = spawn('stty -F /dev/ttyUSB1 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts'); //, ['-lh', '/usr']);
33
+
34
+ stty.stdout.on('data', function (data) {
35
+ sys.print('stdout: ' + data);
36
+ });
37
+
38
+ stty.stderr.on('data', function (data) {
39
+ log("Could not stty " + dpath);
40
+ log('stderr: ' + data);
41
+ });
42
+
43
+ stty.on('exit', function (code) {
44
+ if (code == 0)
45
+ console.log('Done modding stty ' + dpath);
46
+ });
47
+
48
+
49
+ // stty -F /dev/ttyUSB1 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
50
+ var rr = fs.createReadStream(dpath, {
51
+ 'flags': 'r',
52
+ 'encoding': 'ascii', // binary, utf8
53
+ // 'mode': 0666,
54
+ // 'bufferSize': 4 * 1024
55
+ });
56
+
57
+
58
+ rr.addListener('data', function (chunk) {
59
+ log('data: ' + chunk);
60
+ log(sys.inspect(chunk));
61
+ });
62
+
63
+ rr.on('end', function () {
64
+ log('end, closed fs');
65
+ });
66
+
67
+
68
+
data/node/server.js ADDED
@@ -0,0 +1,45 @@
1
+ // Arduino <> Subduino/Node <> WWW
2
+
3
+ var sys = require('sys'),
4
+ http = require('http'),
5
+ faye = require('./vendor/faye');
6
+
7
+ var bayeux = new faye.NodeAdapter({
8
+ mount: '/faye',
9
+ timeout: 45
10
+ });
11
+
12
+ sys.puts("Starting server...");
13
+
14
+ // process.on('SIGHUP', function () {
15
+ // sys.puts('Got SIGHUP signal.');
16
+ // });
17
+ // process.on('SIGKILL', function () {
18
+ // sys.puts('Got SIGHUP signal.');
19
+ // });
20
+
21
+ // Handle non-Bayeux requests
22
+ var server = http.createServer(function(request, response) {
23
+ response.writeHead(200, {'Content-Type': 'text/plain'});
24
+ response.write('Nothing to see here...');
25
+ response.end();
26
+ });
27
+
28
+ server.on('stream', function(stream) {
29
+ sys.puts("Stream!");
30
+ sys.puts(stream);
31
+ })
32
+
33
+ var listen_callback = function() {
34
+ sys.log("Server started...");
35
+ }
36
+
37
+ bayeux.attach(server);
38
+ server.listen(8000, listen_callback);
39
+
40
+
41
+ // var client = new faye.Client('http://localhost:8000/faye');
42
+ // bayeux.getClient().publish('/email/new', {
43
+ // text: 'New email has arrived!',
44
+ // inboxSize: 34
45
+ // });