replace perl reset script with python one

Fix #180
Fix #127
This commit is contained in:
Simon John 2014-03-24 13:27:36 +00:00 committed by Sudar
parent 5599d2ab1e
commit 392a6b9db1
6 changed files with 53 additions and 157 deletions

View file

@ -16,6 +16,7 @@ I tried to give credit whenever possible. If I have missed anyone, kindly add it
- Fix: Consider usb or usb:... to be a valid ISP_PORT (https://github.com/geoffholden)
- Add: Add phony target to run pre-build hook script (https://github.com/jrid)
- Fix: Add BOOTLOADER_PARENT to `arduino-mk-vars.md` and fixed BOOTLOADER_PATH example. (https://github.com/sej7278)
- Tweak: Replace perl reset script with Python script. (https://github.com/sej7278)
### 1.3.1 (2014-02-04)
- Fix: BUNDLED_AVR_TOOLS_DIR is now set properly when using only arduino-core and not the whole arduino package. (https://github.com/sej7278)

View file

@ -34,30 +34,36 @@ package and can be installed using `apt-get` or `aptitude`.
You need to have the Arduino IDE. You can either install it through the
installer or download the distribution zip file and extract it.
The Makefile also delegates resetting the board to a short Perl program.
You'll need to install `Device::SerialPort` to use it though.
The Makefile also delegates resetting the board to a short Python program.
You'll need to install `pySerial` to use it though.
On Debian or Ubuntu:
apt-get install libdevice-serialport-perl
apt-get install python-serial
On Fedora:
yum install perl-Device-SerialPort
yum install pyserial
On openSUSE:
zypper install perl-Device-SerialPort
zypper install python-serial
On Mac using MacPorts:
sudo port install p5-device-serialport
sudo port install py27-serial
and use /opt/local/bin/perl5 instead of /usr/bin/perl
On Windows:
pySerial can be downloaded from PyPi
On other systems:
cpan Device::SerialPort
pip install pyserial
or
easy_install -U pyserial
## Usage

View file

@ -1,147 +1,37 @@
#!/usr/bin/env perl
#!/usr/bin/python
use strict;
use warnings;
import serial
import os.path
import argparse
from time import sleep
use Device::SerialPort;
use Getopt::Long;
use Pod::Usage;
parser = argparse.ArgumentParser(description='Reset an Arduino')
parser.add_argument('--caterina', action='store_true', help='Reset a Leonardo, Micro, Robot or LilyPadUSB.')
parser.add_argument('--verbose', action='store_true', help="Watch what's going on on STDERR.")
parser.add_argument('--period', default=0.1, help='Specify the DTR pulse width in seconds.')
parser.add_argument('port', nargs=1, help='Serial device e.g. /dev/ttyACM0')
args = parser.parse_args()
my %Opt =
(
period => 0.1,
);
GetOptions(\%Opt,
"period=f", # width of reset pulse in seconds
"verbose!",
"help!",
"info!",
"caterina!",
);
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";
if ($Opt{caterina})
{
$p->baudrate(1200);
$p->write_settings;
$p->close;
print STDERR "Forcing reset using 1200bps open/close on port $dev\n"
if $Opt{verbose};
# wait for it to come back
sleep 1;
while( ! -e $dev ) {
print STDERR "Waiting for $dev to come back\n"
if $Opt{verbose};
sleep 1;
}
print STDERR "$dev has come back after reset\n"
if $Opt{verbose};
}
else
{
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*
$ ard-reset-arduino --verbose --caterina /dev/ttyUSB0
=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.
=item --caterina
Reset a Leonardo, Micro, Robot or LilyPadUSB.
=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
Support for Leonardo/Micro added by sej7278, https://github.com/sej7278
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.
if args.caterina:
if args.verbose: print 'Forcing reset using 1200bps open/close on port %s' % args.port[0]
ser = serial.Serial(args.port[0], 57600)
ser.close()
ser.open()
ser.close()
ser.setBaudrate(1200)
ser.open()
ser.close()
sleep(1)
while not os.path.exists(args.port[0]):
if args.verbose: print 'Waiting for %s to come back' % args.port[0]
sleep(1)
if args.verbose: print '%s has come back after reset' % args.port[0]
else:
if args.verbose: print 'Setting DTR high on %s for %ss' % (args.port[0],args.period)
ser = serial.Serial(args.port[0], 115200)
ser.setDTR(False)
sleep(args.period)
ser.setDTR(True)
ser.close()

View file

@ -7,7 +7,7 @@ or [Ubuntu](https://launchpad.net/ubuntu/+source/arduino-mk) or use apt.
First install the dependencies for building/running the package, as root:
apt-get build-dep arduino-mk
apt-get install arduino-core libdevice-serialport-perl help2man build-essential dpkg-dev fakeroot perl-doc devscripts
apt-get install arduino-core build-essential dpkg-dev fakeroot devscripts python-serial
Fetch the Debian source:

View file

@ -2,7 +2,7 @@
First install the dependencies as root:
yum install arduino-core perl-Device-SerialPort help2man rpm-build
yum install arduino-core rpm-build pyserial
From the top-level Arduino-Makefile directory you've checked out of github, run the following (as unprivileged user) to create a compressed tarball using the naming conventions required by rpmbuild:

View file

@ -9,8 +9,8 @@ Group: Development/Tools
License: LGPLv2+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
Requires: arduino-core, perl-Device-SerialPort
BuildRequires: arduino-core, perl-Device-SerialPort, help2man
Requires: arduino-core pyserial
BuildRequires: arduino-core pyserial
%description
Arduino is an open-source electronics prototyping platform based on
@ -27,7 +27,6 @@ Arduino platform.
%install
mkdir -p %{buildroot}/%{_datadir}/arduino
mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/%{_mandir}/man1
mkdir -p %{buildroot}/%{_docdir}/%{name}/examples
install -m 755 -d %{buildroot}/%{_docdir}/%{name}
install -m 755 -d %{buildroot}/%{_docdir}/%{name}/examples
@ -36,7 +35,6 @@ for file in `find examples -type f ! -name .gitignore` ; do install -m 644 $file
install -m 644 *.mk arduino-mk-vars.md %{buildroot}/%{_datadir}/arduino
install -m 644 licence.txt %{buildroot}/%{_docdir}/%{name}
install -m 755 bin/ard-reset-arduino %{buildroot}/%{_bindir}/ard-reset-arduino
help2man %{buildroot}/%{_bindir}/ard-reset-arduino -n "Reset Arduino board" -s 1 -m "Arduino CLI Reset" --version-string=%{version} -N -o %{buildroot}/%{_mandir}/man1/ard-reset-arduino.1
%clean
rm -rf %{buildroot}
@ -44,7 +42,6 @@ rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%{_bindir}/ard-reset-arduino
%{_mandir}/man1/ard-reset-arduino.1*
%{_datadir}/arduino/*.mk
%{_datadir}/arduino/arduino-mk-vars.md
%doc %{_docdir}/%{name}/licence.txt
@ -52,6 +49,8 @@ rm -rf %{buildroot}
%{_docdir}/%{name}/examples
%changelog
* Mon Mar 24 2014 Simon John <git@the-jedi.co.uk>
- Replaced perl/help2man with pyserial for reset script.
* Tue Feb 04 2014 Simon John <git@the-jedi.co.uk>
- Added arduino-mk-vars.md to the files to be installed/packaged.
* Sat Feb 01 2014 Simon John <git@the-jedi.co.uk>