diff options
Diffstat (limited to 'datasources')
-rw-r--r-- | datasources/arduino/arduinoAnalogSerial/.gitignore | 1 | ||||
-rwxr-xr-x | datasources/arduino/arduinoAnalogSerial/Arduino.mk | 720 | ||||
-rwxr-xr-x | datasources/arduino/arduinoAnalogSerial/Makefile | 9 | ||||
-rwxr-xr-x | datasources/arduino/arduinoAnalogSerial/analog.ino | 61 | ||||
-rw-r--r-- | datasources/serialparser.hs | 50 |
5 files changed, 829 insertions, 12 deletions
diff --git a/datasources/arduino/arduinoAnalogSerial/.gitignore b/datasources/arduino/arduinoAnalogSerial/.gitignore new file mode 100644 index 0000000..d900568 --- /dev/null +++ b/datasources/arduino/arduinoAnalogSerial/.gitignore @@ -0,0 +1 @@ +build-uno diff --git a/datasources/arduino/arduinoAnalogSerial/Arduino.mk b/datasources/arduino/arduinoAnalogSerial/Arduino.mk new file mode 100755 index 0000000..09819ac --- /dev/null +++ b/datasources/arduino/arduinoAnalogSerial/Arduino.mk @@ -0,0 +1,720 @@ +######################################################################## +# +# Arduino command line tools Makefile +# System part (i.e. project independent) +# +# Copyright (C) 2010,2011,2012 Martin Oldfield <m@mjo.tc>, based on +# work that is copyright Nicholas Zambetti, David A. Mellis & Hernando +# Barragan. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. +# +# Adapted from Arduino 0011 Makefile by M J Oldfield +# +# Original Arduino adaptation by mellis, eighthave, oli.keller +# +# Version 0.1 17.ii.2009 M J Oldfield +# +# 0.2 22.ii.2009 M J Oldfield +# - fixes so that the Makefile actually works! +# - support for uploading via ISP +# - orthogonal choices of using the Arduino for +# tools, libraries and uploading +# +# 0.3 21.v.2010 M J Oldfield +# - added proper license statement +# - added code from Philip Hands to reset +# Arduino prior to upload +# +# 0.4 25.v.2010 M J Oldfield +# - tweaked reset target on Philip Hands' advice +# +# 0.5 23.iii.2011 Stefan Tomanek +# - added ad-hoc library building +# 17.v.2011 M J Oldfield +# - grabbed said version from Ubuntu +# +# 0.6 22.vi.2011 M J Oldfield +# - added ard-parse-boards supports +# - added -lc to linker opts, +# on Fabien Le Lez's advice +# +# 0.7 12.vii.2011 M J Oldfield +# - moved -lm to the end of linker opts, +# to solve Frank Knopf's problem; +# - added -F to stty opts: Craig Hollabaugh +# reckons it's good for Ubuntu +# +# 0.8 12.ii.2012 M J Oldfield +# - Patches for Arduino 1.0 IDE: +# support .ino files; +# handle board 'variants'; +# tweaked compile flags. +# - Build a library from all the system +# supplied code rather than linking the .o +# files directly. +# - Let TARGET default to current directory +# as per Daniele Vergini's patch. +# - Add support for .c files in system +# libraries: Dirk-Willem van Gulik and Evan +# Goldenberg both reported this and +# provided patches in the same spirit. +# +# 0.9 26.iv.2012 M J Oldfield +# - Allow the punter to specify boards.txt +# file and parser independently (after +# Peplin and Brotchie on github) +# - Support user libraries (Peplin's patch) +# - Remove main.cpp if NO_CORE_MAIN_CPP is +# defined (ex Peplin) +# - Added a monitor target which talks to the +# Arduino serial port (Peplin's suggestion) +# - Rejigged PATH calculations for general +# tidiness (ex Peplin) +# - Moved the reset target to Perl for +# clarity and better error handling (ex +# Daniele Vergini) +# +# 0.10 17.ix.12 M J Oldfield +# - Added installation notes for Fedora (ex Rickard Lindberg). +# - Changed size target so that it looks at the ELF object, +# not the hexfile (ex Jared Szechy and Scott Howard). +# - Fixed ARDUNIO typo in README.md (ex Kalin Kozhuharov). +# - Tweaked OBJDIR handling (ex Matthias Urlichs and Scott Howard). +# - Changed the name of the Debian/Ubuntu package (ex +# Scott Howard). +# - Only set AVRDUDE_CONF if it's not set (ex Tom Hall). +# - Added support for USB_PID/VID used by the Leonardo (ex Dan +# Villiom Podlaski Christiansen and Marc Plano-Lesay). +# +######################################################################## +# +# PATHS YOU NEED TO SET UP +# +# I've reworked the way paths to executables are constructed in this +# version (0.9) of the Makefile. +# +# We need to worry about three different sorts of file: +# +# 1. Things which are included in this distribution e.g. ard-parse-boards +# => ARDMK_DIR +# +# 2. Things which are always in the Arduino distribution e.g. +# boards.txt, libraries, &c. +# => ARDUINO_DIR +# +# 3. Things which might be bundled with the Arduino distribution, but +# might come from the system. Most of the toolchain is like this: +# on Linux it's supplied by the system. +# => AVR_TOOLS_DIR +# +# Having set these three variables, we can work out the rest assuming +# that things are canonically arranged beneath the directories defined +# above. +# +# On the Mac you might want to set: +# +# ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java +# ARDMK_DIR = /usr/local +# +# On Linux, you might prefer: +# +# ARDUINO_DIR = /usr/share/arduino +# ARDMK_DIR = /usr/local +# AVR_TOOLS_DIR = /usr +# +# You can either set these up in the Makefile, or put them in your +# environment e.g. in your .bashrc +# +# If you don't install the ard-... binaries to /usr/local/bin, but +# instead copy them to e.g. /home/mjo/arduino.mk/bin then set +# ARDML_DIR = /home/mjo/arduino.mk +# +######################################################################## +# +# DEPENDENCIES +# +# The Perl programs need a couple of libraries: +# YAML +# Device::SerialPort +# +######################################################################## +# +# STANDARD ARDUINO WORKFLOW +# +# Given a normal sketch directory, all you need to do is to create +# a small Makefile which defines a few things, and then includes this one. +# +# For example: +# +# ARDUINO_LIBS = Ethernet Ethernet/utility SPI +# BOARD_TAG = uno +# ARDUINO_PORT = /dev/cu.usb* +# +# include /usr/local/share/Arduino.mk +# +# Hopefully these will be self-explanatory but in case they're not: +# +# ARDUINO_LIBS - A list of any libraries used by the sketch (we +# assume these are in +# $(ARDUINO_DIR)/hardware/libraries +# +# ARDUINO_PORT - The port where the Arduino can be found (only needed +# when uploading +# +# BOARD_TAG - The ard-parse-boards tag for the board e.g. uno or mega +# 'make show_boards' shows a list +# +# Once this file has been created the typical workflow is just +# +# $ make upload +# +# All of the object files are created in the build-cli subdirectory +# All sources should be in the current directory and can include: +# - at most one .pde or .ino file which will be treated as C++ after +# the standard Arduino header and footer have been affixed. +# - any number of .c, .cpp, .s and .h files +# +# Included libraries are built in the build-cli/libs subdirectory. +# +# Besides make upload you can also +# make - no upload +# make clean - remove all our dependencies +# make depends - update dependencies +# make reset - reset the Arduino by tickling DTR on the serial port +# make raw_upload - upload without first resetting +# make show_boards - list all the boards defined in boards.txt +# make monitor - connect to the Arduino's serial port +# +######################################################################## +# +# SERIAL MONITOR +# +# The serial monitor just invokes the GNU screen program with suitable +# options. For more information see screen (1) and search for +# 'character special device'. +# +# The really useful thing to know is that ^A-k gets you out! +# +# The fairly useful thing to know is that you can bind another key to +# escape too, by creating $HOME{.screenrc} containing e.g. +# +# bindkey ^C kill +# +# If you want to change the baudrate, just set MONITOR_BAUDRATE. If you +# don't set it, it defaults to 9600 baud. +# +######################################################################## +# +# PATHS +# +# I've reworked the way paths to executables are constructed in this +# version of Makefile. +# +# We need to worry about three different sorts of file: +# +# 1. Things which are included in this distribution e.g. ard-parse-boards +# => ARDMK_DIR +# +# 2. Things which are always in the Arduino distribution e.g. +# boards.txt, libraries, &c. +# => ARDUINO_DIR +# +# 3. Things which might be bundled with the Arduino distribution, but +# might come from the system. Most of the toolchain is like this: +# on Linux it's supplied by the system. +# => AVR_TOOLS_DIR +# +# Having set these three variables, we can work out the rest assuming +# that things are canonically arranged beneath the directories defined +# above. +# +# So, on the Mac you might want to set: +# +# ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java +# ARDMK_DIR = /usr/local +# +# On Linux, you might prefer: +# +# ARDUINO_DIR = /usr/share/arduino +# ARDMK_DIR = /usr/local +# AVR_TOOLS_DIR = /usr +# +# +# +# +######################################################################## +# +# ARDUINO WITH ISP +# +# You need to specify some details of your ISP programmer and might +# also need to specify the fuse values: +# +# ISP_PROG = -c stk500v2 +# ISP_PORT = /dev/ttyACM0 +# +# You might also need to set the fuse bits, but typically they'll be +# read from boards.txt, based on the BOARD_TAG variable: +# +# ISP_LOCK_FUSE_PRE = 0x3f +# ISP_LOCK_FUSE_POST = 0xcf +# ISP_HIGH_FUSE = 0xdf +# ISP_LOW_FUSE = 0xff +# ISP_EXT_FUSE = 0x01 +# +# I think the fuses here are fine for uploading to the ATmega168 +# without bootloader. +# +# To actually do this upload use the ispload target: +# +# make ispload +# +# +######################################################################## + +######################################################################## +# +# Default TARGET to cwd (ex Daniele Vergini) +ifndef TARGET +TARGET = $(notdir $(CURDIR)) +endif + +######################################################################## + +# +# Arduino version number +ifndef ARDUINO_VERSION +ARDUINO_VERSION = 100 +endif + +######################################################################## +# Arduino and system paths +# +ifdef ARDUINO_DIR + +ifndef AVR_TOOLS_DIR +AVR_TOOLS_DIR = $(ARDUINO_DIR)/hardware/tools/avr +# The avrdude bundled with Arduino can't find its config +ifndef AVRDUDE_CONF +AVRDUDE_CONF = $(AVR_TOOLS_DIR)/etc/avrdude.conf +endif +endif + +ifndef AVR_TOOLS_PATH +AVR_TOOLS_PATH = $(AVR_TOOLS_DIR)/bin +endif + +ARDUINO_LIB_PATH = $(ARDUINO_DIR)/libraries +ARDUINO_CORE_PATH = $(ARDUINO_DIR)/hardware/arduino/cores/arduino +ARDUINO_VAR_PATH = $(ARDUINO_DIR)/hardware/arduino/variants + +else + +echo $(error "ARDUINO_DIR is not defined") + +endif + +######################################################################## +# Makefile distribution path +# +ifdef ARDMK_DIR + +ifndef ARDMK_PATH +ARDMK_PATH = $(ARDMK_DIR)/bin +endif + +else + +echo $(error "ARDMK_DIR is not defined") + +endif + +######################################################################## +# Miscellanea +# +ifndef ARDUINO_SKETCHBOOK +ARDUINO_SKETCHBOOK = $(HOME)/sketchbook +endif + +ifndef USER_LIB_PATH +USER_LIB_PATH = $(ARDUINO_SKETCHBOOK)/libraries +endif + +######################################################################## +# Serial monitor (just a screen wrapper) +# +# Quite how to construct the monitor command seems intimately tied +# to the command we're using (here screen). So, read the screen docs +# for more information (search for 'character special device'). +# +ifndef MONITOR_BAUDRATE +MONITOR_BAUDRATE = 9600 +endif + +ifndef MONITOR_CMD +MONITOR_CMD = screen +endif + +######################################################################## +# Reset +ifndef RESET_CMD +RESET_CMD = $(ARDMK_PATH)/ard-reset-arduino $(ARD_RESET_OPTS) +endif + +######################################################################## +# boards.txt parsing +# +ifndef BOARD_TAG +BOARD_TAG = uno +endif + +ifndef BOARDS_TXT +BOARDS_TXT = $(ARDUINO_DIR)/hardware/arduino/boards.txt +endif + +ifndef PARSE_BOARD +PARSE_BOARD = $(ARDMK_PATH)/ard-parse-boards +endif + +ifndef PARSE_BOARD_OPTS +PARSE_BOARD_OPTS = --boards_txt=$(BOARDS_TXT) +endif + +ifndef PARSE_BOARD_CMD +PARSE_BOARD_CMD = $(PARSE_BOARD) $(PARSE_BOARD_OPTS) +endif + +# Which variant ? This affects the include path +ifndef VARIANT +VARIANT = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.variant) +endif + +# processor stuff +ifndef MCU +MCU = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.mcu) +endif + +ifndef F_CPU +F_CPU = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.f_cpu) +endif + +# USB IDs for the Leonardo +ifndef USB_VID +USB_VID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.vid) +endif + +ifndef USB_PID +USB_PID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.pid) +endif + +# normal programming info +ifndef AVRDUDE_ARD_PROGRAMMER +AVRDUDE_ARD_PROGRAMMER = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) upload.protocol) +endif + +ifndef AVRDUDE_ARD_BAUDRATE +AVRDUDE_ARD_BAUDRATE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) upload.speed) +endif + +# fuses if you're using e.g. ISP +ifndef ISP_LOCK_FUSE_PRE +ISP_LOCK_FUSE_PRE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.unlock_bits) +endif + +ifndef ISP_LOCK_FUSE_POST +ISP_LOCK_FUSE_POST = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.lock_bits) +endif + +ifndef ISP_HIGH_FUSE +ISP_HIGH_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.high_fuses) +endif + +ifndef ISP_LOW_FUSE +ISP_LOW_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.low_fuses) +endif + +ifndef ISP_EXT_FUSE +ISP_EXT_FUSE = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) bootloader.extended_fuses) +endif + +# Everything gets built in here (include BOARD_TAG now) +ifndef OBJDIR +OBJDIR = build-$(BOARD_TAG) +endif + +######################################################################## +# Local sources +# +LOCAL_C_SRCS = $(wildcard *.c) +LOCAL_CPP_SRCS = $(wildcard *.cpp) +LOCAL_CC_SRCS = $(wildcard *.cc) +LOCAL_PDE_SRCS = $(wildcard *.pde) +LOCAL_INO_SRCS = $(wildcard *.ino) +LOCAL_AS_SRCS = $(wildcard *.S) +LOCAL_OBJ_FILES = $(LOCAL_C_SRCS:.c=.o) $(LOCAL_CPP_SRCS:.cpp=.o) \ + $(LOCAL_CC_SRCS:.cc=.o) $(LOCAL_PDE_SRCS:.pde=.o) \ + $(LOCAL_INO_SRCS:.ino=.o) $(LOCAL_AS_SRCS:.S=.o) +LOCAL_OBJS = $(patsubst %,$(OBJDIR)/%,$(LOCAL_OBJ_FILES)) + +# Dependency files +DEPS = $(LOCAL_OBJS:.o=.d) + +# core sources +ifeq ($(strip $(NO_CORE)),) +ifdef ARDUINO_CORE_PATH +CORE_C_SRCS = $(wildcard $(ARDUINO_CORE_PATH)/*.c) +CORE_CPP_SRCS = $(wildcard $(ARDUINO_CORE_PATH)/*.cpp) + +ifneq ($(strip $(NO_CORE_MAIN_CPP)),) +CORE_CPP_SRCS := $(filter-out %main.cpp, $(CORE_CPP_SRCS)) +endif + +CORE_OBJ_FILES = $(CORE_C_SRCS:.c=.o) $(CORE_CPP_SRCS:.cpp=.o) +CORE_OBJS = $(patsubst $(ARDUINO_CORE_PATH)/%, \ + $(OBJDIR)/%,$(CORE_OBJ_FILES)) +endif +endif + + +######################################################################## +# Rules for making stuff +# + +# The name of the main targets +TARGET_HEX = $(OBJDIR)/$(TARGET).hex +TARGET_ELF = $(OBJDIR)/$(TARGET).elf +TARGETS = $(OBJDIR)/$(TARGET).* +CORE_LIB = $(OBJDIR)/libcore.a + +# A list of dependencies +DEP_FILE = $(OBJDIR)/depends.mk + +# Names of executables +CC = $(AVR_TOOLS_PATH)/avr-gcc +CXX = $(AVR_TOOLS_PATH)/avr-g++ +OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy +OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump +AR = $(AVR_TOOLS_PATH)/avr-ar +SIZE = $(AVR_TOOLS_PATH)/avr-size +NM = $(AVR_TOOLS_PATH)/avr-nm +REMOVE = rm -f +MV = mv -f +CAT = cat +ECHO = echo + +# General arguments +SYS_LIBS = $(patsubst %,$(ARDUINO_LIB_PATH)/%,$(ARDUINO_LIBS)) +USER_LIBS = $(patsubst %,$(USER_LIB_PATH)/%,$(ARDUINO_LIBS)) +SYS_INCLUDES = $(patsubst %,-I%,$(SYS_LIBS)) +USER_INCLUDES = $(patsubst %,-I%,$(USER_LIBS)) +LIB_C_SRCS = $(wildcard $(patsubst %,%/*.c,$(SYS_LIBS))) +LIB_CPP_SRCS = $(wildcard $(patsubst %,%/*.cpp,$(SYS_LIBS))) +USER_LIB_CPP_SRCS = $(wildcard $(patsubst %,%/*.cpp,$(USER_LIBS))) +USER_LIB_C_SRCS = $(wildcard $(patsubst %,%/*.c,$(USER_LIBS))) +LIB_OBJS = $(patsubst $(ARDUINO_LIB_PATH)/%.c,$(OBJDIR)/libs/%.o,$(LIB_C_SRCS)) \ + $(patsubst $(ARDUINO_LIB_PATH)/%.cpp,$(OBJDIR)/libs/%.o,$(LIB_CPP_SRCS)) +USER_LIB_OBJS = $(patsubst $(USER_LIB_PATH)/%.cpp,$(OBJDIR)/libs/%.o,$(USER_LIB_CPP_SRCS)) \ + $(patsubst $(USER_LIB_PATH)/%.c,$(OBJDIR)/libs/%.o,$(USER_LIB_C_SRCS)) + +CPPFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -DARDUINO=$(ARDUINO_VERSION) \ + -I. -I$(ARDUINO_CORE_PATH) -I$(ARDUINO_VAR_PATH)/$(VARIANT) \ + $(SYS_INCLUDES) $(USER_INCLUDES) -g -Os -w -Wall \ + -DUSB_VID=$(USB_VID) -DUSB_PID=$(USB_PID) \ + -ffunction-sections -fdata-sections + +CFLAGS = -std=gnu99 +CXXFLAGS = -fno-exceptions +ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp +LDFLAGS = -mmcu=$(MCU) -Wl,--gc-sections -Os + +# Expand and pick the first port +ARD_PORT = $(firstword $(wildcard $(ARDUINO_PORT))) + +# Implicit rules for building everything (needed to get everything in +# the right directory) +# +# Rather than mess around with VPATH there are quasi-duplicate rules +# here for building e.g. a system C++ file and a local C++ +# file. Besides making things simpler now, this would also make it +# easy to change the build options in future + +# library sources +$(OBJDIR)/libs/%.o: $(ARDUINO_LIB_PATH)/%.c + mkdir -p $(dir $@) + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(OBJDIR)/libs/%.o: $(ARDUINO_LIB_PATH)/%.cpp + mkdir -p $(dir $@) + $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ + +$(OBJDIR)/libs/%.o: $(USER_LIB_PATH)/%.cpp + mkdir -p $(dir $@) + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(OBJDIR)/libs/%.o: $(USER_LIB_PATH)/%.c + mkdir -p $(dir $@) + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +# normal local sources +# .o rules are for objects, .d for dependency tracking +# there seems to be an awful lot of duplication here!!! +$(OBJDIR)/%.o: %.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(OBJDIR)/%.o: %.cc + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ + +$(OBJDIR)/%.o: %.cpp + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ + +$(OBJDIR)/%.o: %.S + $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ + +$(OBJDIR)/%.o: %.s + $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ + +$(OBJDIR)/%.d: %.c + $(CC) -MM $(CPPFLAGS) $(CFLAGS) $< -MF $@ -MT $(@:.d=.o) + +$(OBJDIR)/%.d: %.cc + $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) + +$(OBJDIR)/%.d: %.cpp + $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) + +$(OBJDIR)/%.d: %.S + $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o) + +$(OBJDIR)/%.d: %.s + $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o) + +# the pde -> cpp -> o file +$(OBJDIR)/%.cpp: %.pde + $(ECHO) '#include "WProgram.h"' > $@ + $(CAT) $< >> $@ + +# the ino -> cpp -> o file +$(OBJDIR)/%.cpp: %.ino + $(ECHO) '#include <Arduino.h>' > $@ + $(CAT) $< >> $@ + +$(OBJDIR)/%.o: $(OBJDIR)/%.cpp + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ + +$(OBJDIR)/%.d: $(OBJDIR)/%.cpp + $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) + +# core files +$(OBJDIR)/%.o: $(ARDUINO_CORE_PATH)/%.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(OBJDIR)/%.o: $(ARDUINO_CORE_PATH)/%.cpp + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ + +# various object conversions +$(OBJDIR)/%.hex: $(OBJDIR)/%.elf + $(OBJCOPY) -O ihex -R .eeprom $< $@ + +$(OBJDIR)/%.eep: $(OBJDIR)/%.elf + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex $< $@ + +$(OBJDIR)/%.lss: $(OBJDIR)/%.elf + $(OBJDUMP) -h -S $< > $@ + +$(OBJDIR)/%.sym: $(OBJDIR)/%.elf + $(NM) -n $< > $@ + +######################################################################## +# +# Avrdude +# +ifndef AVRDUDE +AVRDUDE = $(AVR_TOOLS_PATH)/avrdude +endif + +AVRDUDE_COM_OPTS = -q -V -p $(MCU) +ifdef AVRDUDE_CONF +AVRDUDE_COM_OPTS += -C $(AVRDUDE_CONF) +endif + +AVRDUDE_ARD_OPTS = -c $(AVRDUDE_ARD_PROGRAMMER) -b $(AVRDUDE_ARD_BAUDRATE) -P $(ARD_PORT) + +ifndef ISP_PROG +ISP_PROG = -c stk500v2 +endif + +AVRDUDE_ISP_OPTS = -P $(ISP_PORT) $(ISP_PROG) + + +######################################################################## +# +# Explicit targets start here +# + +all: $(OBJDIR) $(TARGET_HEX) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(TARGET_ELF): $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS) + $(CC) $(LDFLAGS) -o $@ $(LOCAL_OBJS) $(CORE_LIB) $(OTHER_OBJS) -lc -lm + +$(CORE_LIB): $(CORE_OBJS) $(LIB_OBJS) $(USER_LIB_OBJS) + $(AR) rcs $@ $(CORE_OBJS) $(LIB_OBJS) $(USER_LIB_OBJS) + +$(DEP_FILE): $(OBJDIR) $(DEPS) + cat $(DEPS) > $(DEP_FILE) + +upload: reset raw_upload + +raw_upload: $(TARGET_HEX) + $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ARD_OPTS) \ + -U flash:w:$(TARGET_HEX):i + +reset: + $(RESET_CMD) $(ARD_PORT) + +# stty on MacOS likes -F, but on Debian it likes -f redirecting +# stdin/out appears to work but generates a spurious error on MacOS at +# least. Perhaps it would be better to just do it in perl ? +reset_stty: + for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \ + do $$STTYF /dev/tty >/dev/null 2>/dev/null && break ; \ + done ;\ + $$STTYF $(ARD_PORT) hupcl ;\ + (sleep 0.1 || sleep 1) ;\ + $$STTYF $(ARD_PORT) -hupcl + +ispload: $(TARGET_HEX) + $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e \ + -U lock:w:$(ISP_LOCK_FUSE_PRE):m \ + -U hfuse:w:$(ISP_HIGH_FUSE):m \ + -U lfuse:w:$(ISP_LOW_FUSE):m \ + -U efuse:w:$(ISP_EXT_FUSE):m + $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -D \ + -U flash:w:$(TARGET_HEX):i + $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \ + -U lock:w:$(ISP_LOCK_FUSE_POST):m + +clean: + $(REMOVE) $(LOCAL_OBJS) $(CORE_OBJS) $(LIB_OBJS) $(CORE_LIB) $(TARGETS) $(DEP_FILE) $(DEPS) $(USER_LIB_OBJS) + +depends: $(DEPS) + cat $(DEPS) > $(DEP_FILE) + +size: $(OBJDIR) $(TARGET_ELF) + $(SIZE) -C --mcu=$(MCU) $(TARGET_ELF) + +show_boards: + $(PARSE_BOARD_CMD) --boards + +monitor: + $(MONITOR_CMD) $(ARD_PORT) $(MONITOR_BAUDRATE) + +.PHONY: all clean depends upload raw_upload reset reset_stty size show_boards monitor + +include $(DEP_FILE) diff --git a/datasources/arduino/arduinoAnalogSerial/Makefile b/datasources/arduino/arduinoAnalogSerial/Makefile new file mode 100755 index 0000000..4f66c20 --- /dev/null +++ b/datasources/arduino/arduinoAnalogSerial/Makefile @@ -0,0 +1,9 @@ +ARDUINO_DIR= /usr/share/arduino +ARDMK_DIR= . +AVR_TOOLS_DIR = /usr + +BOARD_TAG = uno +ARDUINO_PORT = /dev/ttyACM0 +ARDUINO_LIBS = Ethernet Ethernet/utility SPI + +include Arduino.mk diff --git a/datasources/arduino/arduinoAnalogSerial/analog.ino b/datasources/arduino/arduinoAnalogSerial/analog.ino new file mode 100755 index 0000000..47bf63d --- /dev/null +++ b/datasources/arduino/arduinoAnalogSerial/analog.ino @@ -0,0 +1,61 @@ +// vim: filetype=cpp expandtab shiftwidth=4 softtabstop=4 + +const int ledPin = 13; // select the pin for the LED + +const long ADC_REF_MV = 3300; +const long ADC_MAX_STEP = 1024; +const long OV_FACTOR = 4; // Op. Verstärker Faktor = 4; 10mV = 1dB + +void sendKeyValue(const char *key, const char *value) { + Serial.print(key); + Serial.print("="); + Serial.println(value); +} + +void sendPinValue(int pin) { + long sensorValue, + sensorValueMV, + sensorValueDBA; + char buf[12]; + char *sensorKey = "arduino.aX", + *sensorKeyMV = "arduino.aX.mv", + *sensorKeyDBA = "arduino.aX.dba"; + int port = A0 + pin; + + sensorValue = analogRead(port); + sensorKey[9] = '0' + pin; + snprintf(buf, 8, "%u", sensorValue); + sendKeyValue(sensorKey, buf); + + sensorValueMV = sensorValue * (ADC_REF_MV*100/ADC_MAX_STEP); + sensorKeyMV[9] = '0' + pin; + snprintf(buf, 8, "%ld.%03ld", sensorValueMV/100, sensorValue%100); + sendKeyValue(sensorKeyMV, buf); + + sensorValueDBA = sensorValueMV / OV_FACTOR; + sensorKeyDBA[9] = '0' + pin; + snprintf(buf, 12, "%ld.%04ld", sensorValueDBA/1000, sensorValueDBA%1000); + sendKeyValue(sensorKeyDBA, buf); +} + +void setup() { + Serial.begin(115200); + // declare the ledPin as an OUTPUT: + pinMode(ledPin, OUTPUT); + // Reference is EXTERNAL (3v) + analogReference(EXTERNAL); +} + +void loop() { + if (Serial.available() > 0) { + digitalWrite(ledPin, HIGH); + + int pin = Serial.read(); + while (Serial.available()) Serial.read(); + + sendPinValue(pin-'0'); + Serial.flush(); + + digitalWrite(ledPin, LOW); + } +} diff --git a/datasources/serialparser.hs b/datasources/serialparser.hs index 24686f5..f2f6c09 100644 --- a/datasources/serialparser.hs +++ b/datasources/serialparser.hs @@ -1,45 +1,71 @@ {-# LANGUAGE OverloadedStrings #-} - import Control.Applicative((<*)) import Data.Attoparsec(Parser,takeWhile1) import Data.Attoparsec.Char8 (char8, endOfLine, isEndOfLine) import Data.Attoparsec.Enumerator(iterParser) import Data.Enumerator(Iteratee,Enumerator,run_,($$)) import Data.Enumerator.Binary (enumHandle) -import System.Environment(getArgs) -import System.IO (Handle,stdin) import Data.ByteString.Char8(ByteString,unpack) -import Network.HTTP(simpleHTTP,getRequest) -import Network.HTTP.Base(urlEncode) +import Network.HTTP(simpleHTTP) +import Network.HTTP.Headers(Header,mkHeader,HeaderName(HdrContentLength)) +import Network.HTTP.Base(urlEncode,mkRequest,Request(..),RequestMethod(PUT)) +import Network.URI(parseURI) +import System.Environment(getArgs) import System.Hardware.Serialport(hOpenSerial,defaultSerialSettings,commSpeed,CommSpeed(CS115200)) +import System.IO (Handle,hFlush,hPutStr,stdin,hWaitForInput) + data Message = Measurement ByteString ByteString deriving (Show) parser :: Parser Message -parser = do +parser = do sensor <- takeWhile1 (/=61) <* char8 '=' value <- takeWhile1 (not . isEndOfLine) <* endOfLine return $! Measurement sensor value -parserIteratee :: Handle -> Iteratee ByteString IO (Message) +parserIteratee :: Handle -> Iteratee ByteString IO (Message) parserIteratee handle = stdinEnumerator $$ iteratee where stdinEnumerator :: Enumerator ByteString IO b stdinEnumerator = enumHandle 1 handle iteratee :: Iteratee ByteString IO (Message) iteratee = iterParser parser -work :: Handle -> IO () +work :: Handle -> IO () work port = do (Measurement sensor value) <- run_ (parserIteratee port) - let url = "http://localhost:8080/api/value/" ++ (urlEncode $ unpack sensor) ++ "/" ++ (urlEncode $ unpack value) in - simpleHTTP (getRequest url) + let url = "http://localhost:8080/api/value/" ++ (urlEncode $ unpack sensor) + request = putRequest url in + simpleHTTP (putRequest url (unpack value)) putStrLn $ (unpack sensor) ++ "=" ++ (unpack value) + +loop :: Handle -> IO () +loop port = do sendRequest + work port work port + work port + loop port + where sendRequest :: IO (Bool) + sendRequest = do catch (hWaitForInput port 50) handler + return (True) + where handler e = do putStrLn "." + hPutStr port "0" + hFlush port + sendRequest main :: IO () -main = do +main = do args <- getArgs port <- case args of [path] -> hOpenSerial path defaultSerialSettings { commSpeed = CS115200 } _ -> return stdin - work port + loop port + +putRequest :: String -> String -> Request String +putRequest urlString body = + case parseURI urlString of + Nothing -> error ("putRequest: Not a valid URL - " ++ urlString) + Just u -> Request { rqURI = u + , rqBody = body + , rqHeaders = headers + , rqMethod = PUT } + where headers = [ mkHeader HdrContentLength (show (length body) :: String) ] |