Rejig path calculations.\nMove reset target to Perl.\n
This commit is contained in:
parent
9c7f173c7b
commit
79068828f1
12 changed files with 291 additions and 73 deletions
40
README.md
40
README.md
|
@ -7,7 +7,45 @@ still find [what
|
|||
documentation](http://mjo.tc/atelier/2009/02/arduino-cli.html
|
||||
"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
|
||||
|
||||
|
|
|
@ -72,7 +72,62 @@
|
|||
# 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)
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# 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:
|
||||
#
|
||||
# ARDUINO_DIR = /Applications/arduino-0013
|
||||
#
|
||||
# TARGET = CLItest
|
||||
# ARDUINO_LIBS = Ethernet Ethernet/utility SPI
|
||||
#
|
||||
# BOARD_TAG = uno
|
||||
# ARDUINO_PORT = /dev/cu.usb*
|
||||
#
|
||||
|
@ -95,12 +146,6 @@
|
|||
#
|
||||
# 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
|
||||
# assume these are in
|
||||
# $(ARDUINO_DIR)/hardware/libraries
|
||||
|
@ -111,11 +156,6 @@
|
|||
# BOARD_TAG - The ard-parse-boards tag for the board e.g. uno or mega
|
||||
# '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
|
||||
#
|
||||
# $ make upload
|
||||
|
@ -157,13 +197,42 @@
|
|||
#
|
||||
########################################################################
|
||||
#
|
||||
# ARDUINO WITH OTHER TOOLS
|
||||
# PATHS
|
||||
#
|
||||
# If the tools aren't in the Arduino distribution, then you need to
|
||||
# specify their location:
|
||||
# I've reworked the way paths to executables are constructed in this
|
||||
# version of Makefile.
|
||||
#
|
||||
# AVR_TOOLS_PATH = /usr/bin
|
||||
# AVRDUDE_CONF = /etc/avrdude/avrdude.conf
|
||||
# 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
|
||||
#
|
||||
#
|
||||
#
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
|
@ -209,28 +278,49 @@ ifndef ARDUINO_VERSION
|
|||
ARDUINO_VERSION = 100
|
||||
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
|
||||
AVR_TOOLS_PATH = $(ARDUINO_DIR)/hardware/tools/avr/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
|
||||
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
|
||||
|
@ -239,8 +329,6 @@ ifndef USER_LIB_PATH
|
|||
USER_LIB_PATH = $(ARDUINO_SKETCHBOOK)/libraries
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
########################################################################
|
||||
# Serial monitor (just a screen wrapper)
|
||||
#
|
||||
|
@ -256,6 +344,12 @@ 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
|
||||
#
|
||||
|
@ -268,7 +362,7 @@ BOARDS_TXT = $(ARDUINO_DIR)/hardware/arduino/boards.txt
|
|||
endif
|
||||
|
||||
ifndef PARSE_BOARD
|
||||
PARSE_BOARD = ard-parse-boards
|
||||
PARSE_BOARD = $(ARDMK_PATH)/ard-parse-boards
|
||||
endif
|
||||
|
||||
ifndef PARSE_BOARD_OPTS
|
||||
|
@ -554,10 +648,13 @@ 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:
|
||||
reset_stty:
|
||||
for STTYF in 'stty -F' 'stty --file' 'stty -f' 'stty <' ; \
|
||||
do $$STTYF /dev/tty >/dev/null 2>/dev/null && break ; \
|
||||
done ;\
|
||||
|
@ -591,6 +688,6 @@ show_boards:
|
|||
monitor:
|
||||
$(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)
|
||||
|
|
115
bin/ard-reset-arduino
Executable file
115
bin/ard-reset-arduino
Executable 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.
|
||||
|
||||
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS =
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
|
@ -1,10 +1,6 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS =
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
||||
include $(ARDMK_DIR)/arduino-mk/Arduino.mk
|
||||
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS =
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS =
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS = LiquidCrystal
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS = Ethernet Ethernet/utility SPI
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
||||
include ../../arduino-mk/Arduino.mk
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS = Wire Wire/utility
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
ARDUINO_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
PARSE_BOARD = ../../arduino-mk/ard-parse-boards
|
||||
|
||||
BOARD_TAG = uno
|
||||
ARDUINO_PORT = /dev/cu.usb*
|
||||
|
||||
ARDUINO_LIBS =
|
||||
|
||||
include ../../arduino-mk/Arduino.mk
|
||||
|
|
Loading…
Reference in a new issue