Rejig path calculations.\nMove reset target to Perl.\n

This commit is contained in:
Martin Oldfield 2012-04-29 18:55:17 +01:00
parent 9c7f173c7b
commit 79068828f1
12 changed files with 291 additions and 73 deletions

View file

@ -7,7 +7,45 @@ still find [what
documentation](http://mjo.tc/atelier/2009/02/arduino-cli.html documentation](http://mjo.tc/atelier/2009/02/arduino-cli.html
"Documentation") exists. "Documentation") exists.
If you're using Debian or Ubuntu, you can find this in the arduino-core package. If you're using Debian or Ubuntu, you can find this in the
arduino-core package.
# Important Changes, 2012-04-29
I've rejigged the path calculations so that:
1. Few, if any paths, need to specified in the project specific Makefiles.
1. The paths can be grabber from the environment e.g. set up in a user's .bashrc.
1. It should be easier to move between e.g. Mac and Linux.
I'm indebted to Christopher Peplin for making me think about this, and indeed for
contributing code which did similar things in different ways.
The upshot of all this is that you'll need to set up some variables if you want
this to work:
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
The Makefile also delegates resetting the board to a short Perl program.
You'll need to install Device::SerialPort to use it though. On Debian or
Ubuntu do
apt-get install libdevice-serial-perl
On other systems
cpanm Device::SerialPort
## User Libraries ## User Libraries

View file

@ -72,7 +72,62 @@
# defined (ex Peplin) # defined (ex Peplin)
# - Added a monitor target which talks to the # - Added a monitor target which talks to the
# Arduino serial port (Peplin's suggestion) # 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)
#
########################################################################
#
# 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
# #
######################################################################## ########################################################################
# #
@ -83,11 +138,7 @@
# #
# For example: # For example:
# #
# ARDUINO_DIR = /Applications/arduino-0013
#
# TARGET = CLItest
# ARDUINO_LIBS = Ethernet Ethernet/utility SPI # ARDUINO_LIBS = Ethernet Ethernet/utility SPI
#
# BOARD_TAG = uno # BOARD_TAG = uno
# ARDUINO_PORT = /dev/cu.usb* # ARDUINO_PORT = /dev/cu.usb*
# #
@ -95,12 +146,6 @@
# #
# Hopefully these will be self-explanatory but in case they're not: # Hopefully these will be self-explanatory but in case they're not:
# #
# ARDUINO_DIR - Where the Arduino software has been unpacked
#
# TARGET - The basename used for the final files. Canonically
# this would match the .pde file, but it's not needed
# here: you could always set it to xx if you wanted!
#
# ARDUINO_LIBS - A list of any libraries used by the sketch (we # ARDUINO_LIBS - A list of any libraries used by the sketch (we
# assume these are in # assume these are in
# $(ARDUINO_DIR)/hardware/libraries # $(ARDUINO_DIR)/hardware/libraries
@ -111,11 +156,6 @@
# BOARD_TAG - The ard-parse-boards tag for the board e.g. uno or mega # BOARD_TAG - The ard-parse-boards tag for the board e.g. uno or mega
# 'make show_boards' shows a list # 'make show_boards' shows a list
# #
# You might also want to specify these, but normally they'll be read from the
# boards.txt file i.e. implied by BOARD_TAG
#
# MCU,F_CPU - The target processor description
#
# Once this file has been created the typical workflow is just # Once this file has been created the typical workflow is just
# #
# $ make upload # $ make upload
@ -157,13 +197,42 @@
# #
######################################################################## ########################################################################
# #
# ARDUINO WITH OTHER TOOLS # PATHS
# #
# If the tools aren't in the Arduino distribution, then you need to # I've reworked the way paths to executables are constructed in this
# specify their location: # version of Makefile.
# #
# AVR_TOOLS_PATH = /usr/bin # We need to worry about three different sorts of file:
# AVRDUDE_CONF = /etc/avrdude/avrdude.conf #
# 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
#
#
#
# #
######################################################################## ########################################################################
# #
@ -209,28 +278,49 @@ ifndef ARDUINO_VERSION
ARDUINO_VERSION = 100 ARDUINO_VERSION = 100
endif endif
########################################################################
# Arduino and system paths
# #
# Some paths ifdef ARDUINO_DIR
#
ifneq (ARDUINO_DIR,) ifndef AVR_TOOLS_DIR
AVR_TOOLS_DIR = $(ARDUINO_DIR)/hardware/tools/avr
# The avrdude bundled with Arduino can't find it's config
AVRDUDE_CONF = $(AVR_TOOLS_DIR)/etc/avrdude.conf
endif
ifndef AVR_TOOLS_PATH ifndef AVR_TOOLS_PATH
AVR_TOOLS_PATH = $(ARDUINO_DIR)/hardware/tools/avr/bin AVR_TOOLS_PATH = $(AVR_TOOLS_DIR)/bin
endif
ifndef ARDUINO_ETC_PATH
ARDUINO_ETC_PATH = $(ARDUINO_DIR)/hardware/tools/avr/etc
endif
ifndef AVRDUDE_CONF
AVRDUDE_CONF = $(ARDUINO_ETC_PATH)/avrdude.conf
endif endif
ARDUINO_LIB_PATH = $(ARDUINO_DIR)/libraries ARDUINO_LIB_PATH = $(ARDUINO_DIR)/libraries
ARDUINO_CORE_PATH = $(ARDUINO_DIR)/hardware/arduino/cores/arduino ARDUINO_CORE_PATH = $(ARDUINO_DIR)/hardware/arduino/cores/arduino
ARDUINO_VAR_PATH = $(ARDUINO_DIR)/hardware/arduino/variants 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 ifndef ARDUINO_SKETCHBOOK
ARDUINO_SKETCHBOOK = $(HOME)/sketchbook ARDUINO_SKETCHBOOK = $(HOME)/sketchbook
endif endif
@ -239,8 +329,6 @@ ifndef USER_LIB_PATH
USER_LIB_PATH = $(ARDUINO_SKETCHBOOK)/libraries USER_LIB_PATH = $(ARDUINO_SKETCHBOOK)/libraries
endif endif
endif
######################################################################## ########################################################################
# Serial monitor (just a screen wrapper) # Serial monitor (just a screen wrapper)
# #
@ -256,6 +344,12 @@ ifndef MONITOR_CMD
MONITOR_CMD = screen MONITOR_CMD = screen
endif endif
########################################################################
# Reset
ifndef RESET_CMD
RESET_CMD = $(ARDMK_PATH)/ard-reset-arduino $(ARD_RESET_OPTS)
endif
######################################################################## ########################################################################
# boards.txt parsing # boards.txt parsing
# #
@ -268,7 +362,7 @@ BOARDS_TXT = $(ARDUINO_DIR)/hardware/arduino/boards.txt
endif endif
ifndef PARSE_BOARD ifndef PARSE_BOARD
PARSE_BOARD = ard-parse-boards PARSE_BOARD = $(ARDMK_PATH)/ard-parse-boards
endif endif
ifndef PARSE_BOARD_OPTS ifndef PARSE_BOARD_OPTS
@ -554,10 +648,13 @@ raw_upload: $(TARGET_HEX)
$(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ARD_OPTS) \ $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ARD_OPTS) \
-U flash:w:$(TARGET_HEX):i -U flash:w:$(TARGET_HEX):i
reset:
$(RESET_CMD) $(ARD_PORT)
# stty on MacOS likes -F, but on Debian it likes -f redirecting # 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 # 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 ? # least. Perhaps it would be better to just do it in perl ?
reset: reset_stty:
for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \ for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \
do $$STTYF /dev/tty >/dev/null 2>/dev/null && break ; \ do $$STTYF /dev/tty >/dev/null 2>/dev/null && break ; \
done ;\ done ;\
@ -591,6 +688,6 @@ show_boards:
monitor: monitor:
$(MONITOR_CMD) $(ARD_PORT) $(MONITOR_BAUDRATE) $(MONITOR_CMD) $(ARD_PORT) $(MONITOR_BAUDRATE)
.PHONY: all clean depends upload raw_upload reset size show_boards monitor .PHONY: all clean depends upload raw_upload reset reset_stty size show_boards monitor
include $(DEP_FILE) include $(DEP_FILE)

115
bin/ard-reset-arduino Executable file
View file

@ -0,0 +1,115 @@
#! /usr/bin/perl
use strict;
use warnings;
use Device::SerialPort;
use Getopt::Long;
use Pod::Usage;
my %Opt =
(
period => 0.1,
);
GetOptions(\%Opt,
"period=f", # width of reset pulse in seconds
"verbose!",
"help!",
"info!",
);
if ($Opt{help} || $Opt{info})
{
usage();
}
die "No Arduinos found!\n"
unless @ARGV;
foreach my $dev (@ARGV)
{
my $p = Device::SerialPort->new($dev)
or die "Unable to open $dev: $!\n";
my $dt = $Opt{period};
print STDERR "Setting DTR high for ${dt}s on $dev\n"
if $Opt{verbose};
die "Invalid pulse width ($dt), "
unless $dt > 0.0;
$p->pulse_dtr_on($dt * 1000.0);
}
## here endeth the main
sub usage
{
pod2usage(-verbose => 2);
}
__END__
=head1 NAME
ard-reset-arduino - Reset an Arduino
=head1 USAGE
$ ard-reset-arduino /dev/cu.usb*
$ ard-reset-arduino --verbose --period=0.1 /dev/cu.usb*
=head1 DESCRIPTION
To reset (most) Arduinos, it's enough to just pulse the DTR line.
You can do that from the shell with stty, but there's an interesting
diversity of command flags. This little program gives a uniform interface
at the cost of requiring C<Device::SerialPort>.
=head1 OPTIONS
=over
=item --verbose
Watch what's going on on STDERR.
=item --period=0.25
Specify the DTR pulse width in seconds.
=back
=head1 BUGS AND LIMITATIONS
There are no known bugs in this application.
Please report problems to the author.
Patches are welcome.
=head1 AUTHOR
Martin Oldfield, ex-atelier@mjo.tc
Thanks to Daniele Vergini who suggested this to me, and supplied
a command line version.
=head1 LICENCE AND COPYRIGHT
Copyright (c) 2012, Martin Oldfield. All rights reserved.
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = ARDUINO_LIBS =
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,10 +1,6 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = ARDUINO_LIBS =
include ../../arduino-mk/Arduino.mk include $(ARDMK_DIR)/arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = ARDUINO_LIBS =
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = ARDUINO_LIBS =
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = LiquidCrystal ARDUINO_LIBS = LiquidCrystal
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = Ethernet Ethernet/utility SPI ARDUINO_LIBS = Ethernet Ethernet/utility SPI
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = Wire Wire/utility ARDUINO_LIBS = Wire Wire/utility
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk

View file

@ -1,9 +1,5 @@
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
BOARD_TAG = uno BOARD_TAG = uno
ARDUINO_PORT = /dev/cu.usb* ARDUINO_PORT = /dev/cu.usb*
ARDUINO_LIBS = ARDUINO_LIBS =
include ../../arduino-mk/Arduino.mk include ../../arduino-mk/Arduino.mk