#!/usr/bin/python2.5
# encoding: utf-8
"""
Created by Brendan Erwin on 2008-05-21.
Modified by John Gilmore 2008-08-23
Copyright (c) 2008 Brendan Erwin. All rights reserved.
Copyright (c) 2008 John Gilmore.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 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. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
"""
import os
import sys
import getopt
import RepRapArduinoSerialSender
help_message = '''
Usage: send [options] [...]
--verbose : Verbose - print ALL communication, not just comments.
-v : prints responses from the arduino, and every command sent.
--quiet : Quiet - don't print anything, whereas
-q : normally comments are printed.
--noreset : skip the reset.
-n : causes the arduino to not be deliberately reset.
--port : Set the port to write to
-p : default is "/dev/ttyUSB0" for posix, "COM3" for windows.
--baud : Set the baud rate to use
-b : defaults to 19200
You may call this with either a single statement of g-code
to be sent to the arduino, or with the name of a g-code file.
------------------------------------------------------------------
Copyright (C) 2008 Brendan Erwin
Copyright (C) 2008 John Gilmore
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 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. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
'''
#This was originally release by Brendan under GPLv2 or later
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
def main(argv=None):
# Set resonable defaults for port, verbosity, and reset.
verbose = 1
baud = 19200
reset = True
if os.name == "posix":
port = "/dev/ttyUSB0"
elif os.name == "nt":
port = "COM3"
else:
port = "/dev/ttyUSB0"
if argv is None:
argv = sys.argv
try:
try:
opts, argv = getopt.getopt(argv[1:], "vqnhb:p:", ["verbose","quiet","noreset","help","baud=","port="])
except getopt.error, msg:
raise Usage(msg)
# option processing
for option, value in opts:
if option in ( "-v" , "--verbose" ):
verbose = 2
print "You have requested that verbosity be set to True"
print "All communication with the arduino will be printed"
elif option in ( "-q" , "--quiet" ):
verbose = 0
#don't print "quiet mode on"
elif option in ( "-n" , "--noreset" ):
reset = False
if verbose:
print "Arduino will not be reset before sending gcode"
elif option in ( "-p" , "--port" ):
port = value
elif option in ("-h", "--help" ):
raise Usage(help_message)
elif option in ("-b", "--baud" ):
baud = int(value)
if verbose:
print "Arduino port set to " + port
except Usage, err:
#print >> sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)
print >> sys.stderr, str(err.msg)
print >> sys.stderr, "For help use --help"
return 2
sender = RepRapArduinoSerialSender.RepRapArduinoSerialSender(port, baud, verbose>1)
if reset:
sender.reset()
for filename in argv:
processfile(filename,sender,verbose)
def processfile(filename,sender,verbose):
try:
datafile = open(filename)
except IOError:
#Ignore verbosity settings here, as if it's a typo we'll want to know.
line=filename
if line.lstrip().startswith(("G","X","Y","Z","M")):
if verbose:
print "Unable to open file \"" + line + "\", assuming it's one line of direct G-code..."
sender.write(line)
return 0
else:
print "Unable to open file \"" + line + "\""
sys.exit(-1)
try:
for line in datafile:
line=line.rstrip()
# Ignore lines with comments (not technically correct, should ignore only the comment,
# but all gcode files that I've actually seen so far don't have code on comment lines.
if line.lstrip().startswith( ('(', '"' , '\\') ):
if verbose:
print line
continue
# This is the place to insert G-Code interpretation.
# Subroutines, Variables, all sorts of fun stuff.
# probably by calling a "gcode interpreter" class intead
# of simply "sender".
sender.write(line)
finally:
datafile.close()
return 0
if __name__ == "__main__":
sys.exit(main())