kopia lustrzana https://github.com/GuyCarver/MicroPython
Moved ST7735 to subdirectory
rodzic
fddeec64b2
commit
a7c9cd72ad
|
@ -213,3 +213,4 @@ pip-log.txt
|
||||||
|
|
||||||
#Mr Developer
|
#Mr Developer
|
||||||
.mr.developer.cfg
|
.mr.developer.cfg
|
||||||
|
pybcdc.inf
|
||||||
|
|
|
@ -336,7 +336,6 @@ class TFT(object) :
|
||||||
def fill( self, aColor ) :
|
def fill( self, aColor ) :
|
||||||
'''Fill screen with the given color.'''
|
'''Fill screen with the given color.'''
|
||||||
self.fillrect(Point(0, 0), self.size, aColor)
|
self.fillrect(Point(0, 0), self.size, aColor)
|
||||||
self._draw(self.size.x * self.size.y, aColor)
|
|
||||||
|
|
||||||
def _draw( self, aPixels, aColor ) :
|
def _draw( self, aPixels, aColor ) :
|
||||||
'''Send given color to the device aPixels times.'''
|
'''Send given color to the device aPixels times.'''
|
|
@ -0,0 +1,82 @@
|
||||||
|
##
|
||||||
|
# Ultrasonic library for MicroPython's pyboard.
|
||||||
|
# Compatible with HC-SR04 and SRF04.
|
||||||
|
#
|
||||||
|
# Copyright 2014 - Sergio Conde Gómez <skgsergio@gmail.com>
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
##
|
||||||
|
|
||||||
|
import pyb
|
||||||
|
|
||||||
|
# Pin configuration.
|
||||||
|
# WARNING: Do not use PA4-X5 or PA5-X6 as the echo pin without a 1k resistor.
|
||||||
|
|
||||||
|
def wait( aCount ):
|
||||||
|
j = 0;
|
||||||
|
for i in range(aCount):
|
||||||
|
j += i
|
||||||
|
|
||||||
|
class Ultrasonic:
|
||||||
|
def __init__(self, tPin, ePin):
|
||||||
|
self.triggerPin = tPin
|
||||||
|
self.echoPin = ePin
|
||||||
|
|
||||||
|
# Init trigger pin (out)
|
||||||
|
self.trigger = pyb.Pin(self.triggerPin)
|
||||||
|
self.trigger.init(pyb.Pin.OUT_PP, pyb.Pin.PULL_NONE)
|
||||||
|
self.trigger.low()
|
||||||
|
|
||||||
|
# Init echo pin (in)
|
||||||
|
self.echo = pyb.Pin(self.echoPin)
|
||||||
|
self.echo.init(pyb.Pin.IN, pyb.Pin.PULL_NONE)
|
||||||
|
|
||||||
|
def distance_in_inches(self):
|
||||||
|
return (self.distance_in_cm() * 0.3937)
|
||||||
|
|
||||||
|
def distance_in_cm(self):
|
||||||
|
start = 0
|
||||||
|
end = 0
|
||||||
|
|
||||||
|
# Create a microseconds counter.
|
||||||
|
micros = pyb.Timer(2, prescaler=83, period=0x3fffffff)
|
||||||
|
micros.counter(0)
|
||||||
|
|
||||||
|
# Send a 10us pulse.
|
||||||
|
self.trigger.high()
|
||||||
|
pyb.udelay(10)
|
||||||
|
self.trigger.low()
|
||||||
|
|
||||||
|
# Wait 'till whe pulse starts.
|
||||||
|
while self.echo.value() == 0:
|
||||||
|
start = micros.counter()
|
||||||
|
|
||||||
|
j = 0
|
||||||
|
|
||||||
|
# Wait 'till the pulse is gone.
|
||||||
|
while self.echo.value() == 1 and j < 1000:
|
||||||
|
# print("wait end")
|
||||||
|
# wait(1000)
|
||||||
|
j += 1
|
||||||
|
end = micros.counter()
|
||||||
|
|
||||||
|
# Deinit the microseconds counter
|
||||||
|
micros.deinit()
|
||||||
|
|
||||||
|
# Calc the duration of the recieved pulse, divide the result by
|
||||||
|
# 2 (round-trip) and divide it by 29 (the speed of sound is
|
||||||
|
# 340 m/s and that is 29 us/cm).
|
||||||
|
dist_in_cm = ((end - start) / 2) / 29
|
||||||
|
|
||||||
|
return dist_in_cm
|
|
@ -0,0 +1,9 @@
|
||||||
|
# boot.py -- run on boot-up
|
||||||
|
# can run arbitrary Python, but best to keep it minimal
|
||||||
|
|
||||||
|
import pyb
|
||||||
|
from ST7735 import *
|
||||||
|
|
||||||
|
#pyb.main('main.py') # main script to run after this one
|
||||||
|
#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device
|
||||||
|
#pyb.usb_mode('CDC+HID') # act as a serial device and a mouse
|
|
@ -0,0 +1,15 @@
|
||||||
|
#LED testing.
|
||||||
|
|
||||||
|
from pyb import *
|
||||||
|
|
||||||
|
dC = 5
|
||||||
|
|
||||||
|
def test( ):
|
||||||
|
l = LED(4)
|
||||||
|
for i in range(255):
|
||||||
|
l.intensity(i)
|
||||||
|
delay(dC)
|
||||||
|
for i in range(255, 0, -1):
|
||||||
|
l.intensity(i)
|
||||||
|
delay(dC)
|
||||||
|
l.off()
|
|
@ -0,0 +1,365 @@
|
||||||
|
"""Implement a simple shell for running on MicroPython."""
|
||||||
|
|
||||||
|
# from __future__ import print_function
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import cmd
|
||||||
|
import pyb
|
||||||
|
import time
|
||||||
|
|
||||||
|
# TODO:
|
||||||
|
# - Need to figure out how to get input without echo for term_size
|
||||||
|
# - Add sys.stdin.isatty() for when we support reading from a file
|
||||||
|
# - Need to integrate readline in a python callable way (into cmd.py)
|
||||||
|
# so that the up-arrow works.
|
||||||
|
# - Need to define input command to use this under windows
|
||||||
|
|
||||||
|
MONTH = ('', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||||
|
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
|
||||||
|
|
||||||
|
|
||||||
|
def term_size():
|
||||||
|
"""Print out a sequence of ANSI escape code which will report back the
|
||||||
|
size of the window.
|
||||||
|
"""
|
||||||
|
# ESC 7 - Save cursor position
|
||||||
|
# ESC 8 - Restore cursor position
|
||||||
|
# ESC [r - Enable scrolling for entire display
|
||||||
|
# ESC [row;colH - Move to cursor position
|
||||||
|
# ESC [6n - Device Status Report - send ESC [row;colR
|
||||||
|
repl= None
|
||||||
|
if 'repl_source' in dir(pyb):
|
||||||
|
repl = pyb.repl_source()
|
||||||
|
if repl is None:
|
||||||
|
repl = pyb.USB_VCP()
|
||||||
|
repl.send(b'\x1b7\x1b[r\x1b[999;999H\x1b[6n')
|
||||||
|
pos = b''
|
||||||
|
while True:
|
||||||
|
char = repl.recv(1)
|
||||||
|
if char == b'R':
|
||||||
|
break
|
||||||
|
if char != b'\x1b' and char != b'[':
|
||||||
|
pos += char
|
||||||
|
repl.send(b'\x1b8')
|
||||||
|
(height, width) = [int(i, 10) for i in pos.split(b';')]
|
||||||
|
return height, width
|
||||||
|
|
||||||
|
# def term_size():
|
||||||
|
# return (25, 80)
|
||||||
|
|
||||||
|
|
||||||
|
def get_mode(filename):
|
||||||
|
try:
|
||||||
|
return os.stat(filename)[0]
|
||||||
|
except OSError:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def get_stat(filename):
|
||||||
|
try:
|
||||||
|
return os.stat(filename)
|
||||||
|
except OSError:
|
||||||
|
return (0, 0, 0, 0, 0, 0, 0, 0)
|
||||||
|
|
||||||
|
|
||||||
|
def mode_exists(mode):
|
||||||
|
return mode & 0xc000 != 0
|
||||||
|
|
||||||
|
|
||||||
|
def mode_isdir(mode):
|
||||||
|
return mode & 0x4000 != 0
|
||||||
|
|
||||||
|
|
||||||
|
def mode_isfile(mode):
|
||||||
|
return mode & 0x8000 != 0
|
||||||
|
|
||||||
|
|
||||||
|
def print_cols(words, termwidth=79):
|
||||||
|
"""Takes a single column of words, and prints it as multiple columns that
|
||||||
|
will fit in termwidth columns.
|
||||||
|
"""
|
||||||
|
width = max([len(word) for word in words])
|
||||||
|
nwords = len(words)
|
||||||
|
ncols = max(1, (termwidth + 1) // (width + 1))
|
||||||
|
nrows = (nwords + ncols - 1) // ncols
|
||||||
|
for row in range(nrows):
|
||||||
|
for i in range(row, nwords, nrows):
|
||||||
|
print('%-*s' % (width, words[i]),
|
||||||
|
end='\n' if i + nrows >= nwords else ' ')
|
||||||
|
|
||||||
|
|
||||||
|
def print_long(files):
|
||||||
|
"""Prints detailed information about each file passed in."""
|
||||||
|
for file in files:
|
||||||
|
stat = get_stat(file)
|
||||||
|
mode = stat[0]
|
||||||
|
if mode_isdir(mode):
|
||||||
|
mode_str = '/'
|
||||||
|
else:
|
||||||
|
mode_str = ''
|
||||||
|
size = stat[6]
|
||||||
|
mtime = stat[8]
|
||||||
|
localtime = time.localtime(mtime)
|
||||||
|
print('%6d %s %2d %02d:%02d %s%s' % (size, MONTH[localtime[1]],
|
||||||
|
localtime[2], localtime[4], localtime[5], file, mode_str))
|
||||||
|
|
||||||
|
|
||||||
|
def sdcard_present():
|
||||||
|
"""Determine if the sdcard is present. This current solution is specific
|
||||||
|
to the pyboard. We should really have a pyb.scard.detected() method
|
||||||
|
or something.
|
||||||
|
"""
|
||||||
|
return pyb.Pin.board.SD.value() == 0
|
||||||
|
|
||||||
|
|
||||||
|
class Shell(cmd.Cmd):
|
||||||
|
"""Implements the shell as a command line interpreter."""
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
(self.term_height, self.term_width) = term_size()
|
||||||
|
cmd.Cmd.__init__(self, **kwargs)
|
||||||
|
|
||||||
|
self.stdout_to_shell = self.stdout
|
||||||
|
|
||||||
|
self.cur_dir = os.getcwd()
|
||||||
|
self.set_prompt()
|
||||||
|
|
||||||
|
def set_prompt(self):
|
||||||
|
self.prompt = self.cur_dir + '> '
|
||||||
|
|
||||||
|
def resolve_path(self, path):
|
||||||
|
if path[0] != '/':
|
||||||
|
# Relative path
|
||||||
|
if self.cur_dir[-1] == '/':
|
||||||
|
path = self.cur_dir + path
|
||||||
|
else:
|
||||||
|
path = self.cur_dir + '/' + path
|
||||||
|
comps = path.split('/')
|
||||||
|
new_comps = []
|
||||||
|
for comp in comps:
|
||||||
|
if comp == '.':
|
||||||
|
continue
|
||||||
|
if comp == '..' and len(new_comps) > 1:
|
||||||
|
new_comps.pop()
|
||||||
|
else:
|
||||||
|
new_comps.append(comp)
|
||||||
|
if len(new_comps) == 1:
|
||||||
|
return new_comps[0] + '/'
|
||||||
|
return '/'.join(new_comps)
|
||||||
|
|
||||||
|
def emptyline(self):
|
||||||
|
"""We want empty lines to do nothing. By default they would repeat the
|
||||||
|
previous command.
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def postcmd(self, stop, line):
|
||||||
|
self.stdout.close()
|
||||||
|
self.stdout = self.stdout_to_shell
|
||||||
|
self.set_prompt()
|
||||||
|
return stop
|
||||||
|
|
||||||
|
def line_to_args(self, line):
|
||||||
|
"""This will convert the line passed into the do_xxx functions into
|
||||||
|
an array of arguments and handle the Output Redirection Operator.
|
||||||
|
"""
|
||||||
|
args = line.split()
|
||||||
|
if '>' in args:
|
||||||
|
self.stdout = open(args[-1], 'a')
|
||||||
|
return args[:-2]
|
||||||
|
else:
|
||||||
|
return args
|
||||||
|
|
||||||
|
def help_args(self):
|
||||||
|
self.stdout.write('Prints out command line arguments.\n')
|
||||||
|
|
||||||
|
def do_args(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
for idx in range(len(args)):
|
||||||
|
print("arg[%d] = '%s'" % (idx, args[idx]))
|
||||||
|
|
||||||
|
def help_cat(self):
|
||||||
|
self.stdout.write('Concatinate files and send to stdout.\n')
|
||||||
|
|
||||||
|
def do_cat(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
for filename in args:
|
||||||
|
filename = self.resolve_path(filename)
|
||||||
|
mode = get_mode(filename)
|
||||||
|
if not mode_exists(mode):
|
||||||
|
self.stdout.write("Cannot access '%s': No such file\n" %
|
||||||
|
filename)
|
||||||
|
continue
|
||||||
|
if not mode_isfile(mode):
|
||||||
|
self.stdout.write("'%s': is not a file\n" % filename)
|
||||||
|
continue
|
||||||
|
with open(filename, 'r') as txtfile:
|
||||||
|
for line in txtfile:
|
||||||
|
self.stdout.write(line)
|
||||||
|
|
||||||
|
def help_cd(self):
|
||||||
|
self.stdout.write('Changes the current directory\n')
|
||||||
|
|
||||||
|
def do_cd(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
try:
|
||||||
|
dirname = self.resolve_path(args[0])
|
||||||
|
except IndexError:
|
||||||
|
dirname = '/'
|
||||||
|
mode = get_mode(dirname)
|
||||||
|
if mode_isdir(mode):
|
||||||
|
self.cur_dir = dirname
|
||||||
|
else:
|
||||||
|
self.stdout.write("Directory '%s' does not exist\n" % dirname)
|
||||||
|
|
||||||
|
def help_echo(self):
|
||||||
|
self.stdout.write('Display a line of text.\n')
|
||||||
|
|
||||||
|
def do_echo(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
self.stdout.write(args[0])
|
||||||
|
self.stdout.write('\n')
|
||||||
|
|
||||||
|
def help_help(self):
|
||||||
|
self.stdout.write('List available commands with "help" or detailed ' +
|
||||||
|
'help with "help cmd".\n')
|
||||||
|
|
||||||
|
def do_help(self, line):
|
||||||
|
cmd.Cmd.do_help(self, line)
|
||||||
|
|
||||||
|
def help_ls(self):
|
||||||
|
self.stdout.write('List directory contents.\n' +
|
||||||
|
'Use ls -a to show hidden files')
|
||||||
|
|
||||||
|
def do_ls(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
show_invisible = False
|
||||||
|
show_long = False
|
||||||
|
while len(args) > 0 and args[0][0] == '-':
|
||||||
|
if args[0] == '-a':
|
||||||
|
show_invisible = True
|
||||||
|
elif args[0] == '-l':
|
||||||
|
show_long = True
|
||||||
|
else:
|
||||||
|
self.stdout.write("Unrecognized option '%s'" % args[0])
|
||||||
|
return
|
||||||
|
args.remove(args[0])
|
||||||
|
if len(args) == 0:
|
||||||
|
args.append('.')
|
||||||
|
for idx in range(len(args)):
|
||||||
|
dirname = self.resolve_path(args[idx])
|
||||||
|
mode = get_mode(dirname)
|
||||||
|
if not mode_exists(mode):
|
||||||
|
self.stdout.write("Cannot access '%s': No such file or "
|
||||||
|
"directory\n" % dirname)
|
||||||
|
continue
|
||||||
|
if not mode_isdir(mode):
|
||||||
|
self.stdout.write(dirname)
|
||||||
|
self.stdout.write('\n')
|
||||||
|
continue
|
||||||
|
files = []
|
||||||
|
if len(args) > 1:
|
||||||
|
if idx > 0:
|
||||||
|
self.stdout.write('\n')
|
||||||
|
self.stdout.write("%s:\n" % dirname)
|
||||||
|
for filename in os.listdir(dirname):
|
||||||
|
if dirname[-1] == '/':
|
||||||
|
full_filename = dirname + filename
|
||||||
|
else:
|
||||||
|
full_filename = dirname + '/' + filename
|
||||||
|
|
||||||
|
mode = get_mode(full_filename)
|
||||||
|
if not show_long and mode_isdir(mode):
|
||||||
|
filename += '/'
|
||||||
|
if (show_invisible or
|
||||||
|
(filename[0] != '.' and filename[-1] != '~')):
|
||||||
|
files.append(filename)
|
||||||
|
if (len(files) > 0):
|
||||||
|
if show_long:
|
||||||
|
print_long(sorted(files))
|
||||||
|
else:
|
||||||
|
print_cols(sorted(files), self.term_width)
|
||||||
|
|
||||||
|
def help_micropython(self):
|
||||||
|
self.stdout.write('Micropython! Call any scripts! Interactive mode! ' +
|
||||||
|
'Quit with exit()')
|
||||||
|
|
||||||
|
def do_micropython(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
source = None
|
||||||
|
if len(args) == 1:
|
||||||
|
source = args[-1]
|
||||||
|
source = self.resolve_path(source)
|
||||||
|
mode = get_mode(source)
|
||||||
|
if not mode_exists(mode):
|
||||||
|
self.stdout.write("Cannot access '%s': No such file\n" %
|
||||||
|
source)
|
||||||
|
return
|
||||||
|
if not mode_isfile(mode):
|
||||||
|
self.stdout.write("'%s': is not a file\n" % source)
|
||||||
|
return
|
||||||
|
if source is None:
|
||||||
|
print('[Micropython]')
|
||||||
|
while True:
|
||||||
|
code_str = ''
|
||||||
|
line = input('|>>> ')
|
||||||
|
if line[0:4] == 'exit':
|
||||||
|
break
|
||||||
|
code_str += '%s\n' % line
|
||||||
|
if line[-1] == ':':
|
||||||
|
while True:
|
||||||
|
line = input('|... ')
|
||||||
|
if line == '':
|
||||||
|
break
|
||||||
|
code_str += '%s\n' % line
|
||||||
|
exec(code_str)
|
||||||
|
else:
|
||||||
|
code_str = ''
|
||||||
|
with open(source, 'r') as code:
|
||||||
|
for line in code:
|
||||||
|
code_str = code_str + line + '\n'
|
||||||
|
exec(code_str)
|
||||||
|
|
||||||
|
def help_mkdir(self):
|
||||||
|
self.stdout.write('Create directory.')
|
||||||
|
|
||||||
|
def do_mkdir(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
target = args[0]
|
||||||
|
mode = get_mode(target)
|
||||||
|
if not mode_exists(mode):
|
||||||
|
os.mkdir(target)
|
||||||
|
else:
|
||||||
|
print('%s already exists.' % target)
|
||||||
|
|
||||||
|
def help_rm(self):
|
||||||
|
self.stdout.write('Delete files and directories.')
|
||||||
|
|
||||||
|
def do_rm(self, line):
|
||||||
|
args = self.line_to_args(line)
|
||||||
|
if args[0] in ('pybcdc.inf', 'README.txt', 'boot.py', 'main.py'):
|
||||||
|
print('This file cannot be deleted')
|
||||||
|
try:
|
||||||
|
os.remove(args[0])
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
os.rmdir(args[0])
|
||||||
|
except:
|
||||||
|
print('%s is not a file or directory.' % args[0])
|
||||||
|
|
||||||
|
def help_EOF(self):
|
||||||
|
self.stdout.write('Control-D to quit.\n')
|
||||||
|
|
||||||
|
def do_EOF(self, _):
|
||||||
|
# The prompt will have been printed, so print a newline so that the
|
||||||
|
# REPL prompt shows up properly.
|
||||||
|
print('')
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
Shell().cmdloop()
|
||||||
|
|
||||||
|
run()
|
Ładowanie…
Reference in New Issue