Save wip...
This commit is contained in:
@@ -27,16 +27,17 @@ import sys
|
|||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
import signal
|
import signal
|
||||||
|
import tempfile
|
||||||
import binascii
|
import binascii
|
||||||
import textwrap
|
import textwrap
|
||||||
|
import subprocess
|
||||||
|
|
||||||
from serial import Serial
|
from serial import Serial
|
||||||
from watchdog.observers import Observer
|
|
||||||
from watchdog.events import PatternMatchingEventHandler
|
|
||||||
from typing import Dict, List, Optional, Tuple, Union
|
from typing import Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
|
|
||||||
BUFFER_SIZE: int = 126
|
BUFFER_SIZE: int = 126
|
||||||
|
CURRENT_DIRECTORY: str = os.getcwd().replace('\\', '/')
|
||||||
|
|
||||||
def strpad(text: str, length: int = 30) -> str:
|
def strpad(text: str, length: int = 30) -> str:
|
||||||
return text + ' ' * (length - len(text))
|
return text + ' ' * (length - len(text))
|
||||||
@@ -258,14 +259,14 @@ class Pyboard(object):
|
|||||||
for call in traceback[1][:-2].split('\\r\\n'):
|
for call in traceback[1][:-2].split('\\r\\n'):
|
||||||
reason += f'{call}\n'
|
reason += f'{call}\n'
|
||||||
|
|
||||||
raise Exception(f'-------\n{reason.strip()}')
|
raise Exception(f'-------------------\n{reason.strip()}')
|
||||||
else:
|
else:
|
||||||
raise Exception(f'-------\n{exception}')
|
raise Exception(f'-------------------\n{exception}')
|
||||||
|
|
||||||
return data.strip()
|
return data.strip()
|
||||||
|
|
||||||
|
|
||||||
class FileSystem(object):
|
class PicoTerminal(object):
|
||||||
_pyboard: Pyboard
|
_pyboard: Pyboard
|
||||||
|
|
||||||
def __init__(self, pyboard: Pyboard):
|
def __init__(self, pyboard: Pyboard):
|
||||||
@@ -512,20 +513,20 @@ class FileSystem(object):
|
|||||||
|
|
||||||
|
|
||||||
class Picowatch(object):
|
class Picowatch(object):
|
||||||
_fs: FileSystem
|
pico_terminal: PicoTerminal
|
||||||
|
|
||||||
def __init__(self, pyboard: Pyboard):
|
def __init__(self, pyboard: Pyboard):
|
||||||
self._fs = FileSystem(pyboard)
|
self.pico_terminal = PicoTerminal(pyboard)
|
||||||
signal.signal(signal.SIGINT, lambda a, b: self.interupt())
|
signal.signal(signal.SIGINT, lambda a, b: self.interupt())
|
||||||
|
|
||||||
def interupt(self):
|
def interupt(self):
|
||||||
self._fs._pyboard.send_ctrl_c()
|
self.pico_terminal._pyboard.send_ctrl_c()
|
||||||
|
|
||||||
def terminal(self, command: str):
|
def terminal(self, command: str):
|
||||||
self._fs.terminal(command, stream_output=True)
|
self.pico_terminal.terminal(command, stream_output=True)
|
||||||
|
|
||||||
def listing(self, remote: str = '/'):
|
def listing(self, remote: str = '/'):
|
||||||
status, output, exception = self._fs.ls(remote)
|
status, output, exception = self.pico_terminal.ls(remote)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print('-' * 60)
|
print('-' * 60)
|
||||||
@@ -542,7 +543,7 @@ class Picowatch(object):
|
|||||||
|
|
||||||
def contents(self, remote: str):
|
def contents(self, remote: str):
|
||||||
try:
|
try:
|
||||||
content, _ = self._fs.get(remote)
|
content, _ = self.pico_terminal.get(remote)
|
||||||
|
|
||||||
for ln in content.decode('utf-8').split('\n'):
|
for ln in content.decode('utf-8').split('\n'):
|
||||||
print(ln)
|
print(ln)
|
||||||
@@ -575,7 +576,7 @@ class Picowatch(object):
|
|||||||
|
|
||||||
for filename, remote in queue:
|
for filename, remote in queue:
|
||||||
try:
|
try:
|
||||||
print('[↑]', strpad(filename), self._fs.upload(filename, remote))
|
print('[↑]', strpad(filename), self.pico_terminal.upload(filename, remote))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('[?]', strpad(filename), str(e))
|
print('[?]', strpad(filename), str(e))
|
||||||
|
|
||||||
@@ -583,7 +584,7 @@ class Picowatch(object):
|
|||||||
if filepath.startswith('.'):
|
if filepath.startswith('.'):
|
||||||
filepath = filepath[1:]
|
filepath = filepath[1:]
|
||||||
|
|
||||||
status, output, exception = self._fs.ls(filepath)
|
status, output, exception = self.pico_terminal.ls(filepath)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print('-' * 60)
|
print('-' * 60)
|
||||||
@@ -599,14 +600,14 @@ class Picowatch(object):
|
|||||||
|
|
||||||
if not size == -1:
|
if not size == -1:
|
||||||
try:
|
try:
|
||||||
print('[↓]', strpad(local), self._fs.download(remote, local))
|
print('[↓]', strpad(local), self.pico_terminal.download(remote, local))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('[?]', strpad(local), str(e))
|
print('[?]', strpad(local), str(e))
|
||||||
else:
|
else:
|
||||||
print('[?]', strpad(filepath), exception)
|
print('[?]', strpad(filepath), exception)
|
||||||
|
|
||||||
def delete(self, filepath: str):
|
def delete(self, filepath: str):
|
||||||
status, output, exception = self._fs.rm(filepath)
|
status, output, exception = self.pico_terminal.rm(filepath)
|
||||||
|
|
||||||
if status:
|
if status:
|
||||||
print('-' * 60)
|
print('-' * 60)
|
||||||
@@ -622,9 +623,27 @@ class Picowatch(object):
|
|||||||
print('[?]', strpad(local), message)
|
print('[?]', strpad(local), message)
|
||||||
else:
|
else:
|
||||||
print('[?]', strpad(filepath), exception)
|
print('[?]', strpad(filepath), exception)
|
||||||
|
|
||||||
|
def compare(self, source: str):
|
||||||
|
content, _ = self.pico_terminal.get(source)
|
||||||
|
fh, filename = tempfile.mkstemp()
|
||||||
|
|
||||||
|
try:
|
||||||
|
with os.fdopen(fh, 'wb') as tmp:
|
||||||
|
tmp.write(content)
|
||||||
|
|
||||||
|
subprocess.Popen(f'code --diff "./src/{source}" "{filename}"', stdout=subprocess.PIPE, shell=True).communicate()
|
||||||
|
print(filename)
|
||||||
|
finally:
|
||||||
|
input('<<< ')
|
||||||
|
os.remove(filename)
|
||||||
|
|
||||||
|
def status(self):
|
||||||
|
status_out = subprocess.check_output(['git', 'status', '-s'])
|
||||||
|
print(status_out)
|
||||||
|
|
||||||
def launch(self, filepath: str):
|
def launch(self, filepath: str):
|
||||||
self._fs.launch(filepath)
|
self.pico_terminal.launch(filepath)
|
||||||
|
|
||||||
def watch(self, filename: str):
|
def watch(self, filename: str):
|
||||||
if filename.startswith('/'):
|
if filename.startswith('/'):
|
||||||
@@ -634,7 +653,7 @@ class Picowatch(object):
|
|||||||
filename = './' + filename
|
filename = './' + filename
|
||||||
|
|
||||||
with open(filename, 'r') as fh:
|
with open(filename, 'r') as fh:
|
||||||
self._fs.terminal(fh.read(), stream_output=True)
|
self.pico_terminal.terminal(fh.read(), stream_output=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -656,89 +675,33 @@ print('Welcome to Picowatch Terminal')
|
|||||||
picowatch = Picowatch(Pyboard('COM5'))
|
picowatch = Picowatch(Pyboard('COM5'))
|
||||||
picowatch.interupt()
|
picowatch.interupt()
|
||||||
|
|
||||||
# sessions = {'deleted': set(), 'modified': set()}
|
|
||||||
|
|
||||||
# def on_modified_callback(event):
|
|
||||||
# if event.is_directory == True:
|
|
||||||
# return
|
|
||||||
|
|
||||||
# source = event.src_path.replace(WATCHING_DIRECTORY, '').replace('\\', '/')
|
|
||||||
# sessions['modified'].add(source)
|
|
||||||
|
|
||||||
|
|
||||||
# def on_deleted_callback(event):
|
|
||||||
# source = event.src_path.replace(WATCHING_DIRECTORY, '').replace('\\', '/')
|
|
||||||
|
|
||||||
# if event.is_directory == True and not source.endswith('/'):
|
|
||||||
# source += '/'
|
|
||||||
# elif len(source.split('.')) == 1:
|
|
||||||
# source += '/'
|
|
||||||
|
|
||||||
# sessions['deleted'].add(source)
|
|
||||||
|
|
||||||
|
|
||||||
# def watchdog_callback():
|
|
||||||
# for source in sessions['deleted']:
|
|
||||||
# delete(source, is_directory=source.endswith('/'))
|
|
||||||
|
|
||||||
# for source in sessions['modified']:
|
|
||||||
# upload(source)
|
|
||||||
|
|
||||||
# sessions['deleted'] = set()
|
|
||||||
# sessions['modified'] = set()
|
|
||||||
|
|
||||||
|
|
||||||
# watchdog_event = PatternMatchingEventHandler(
|
|
||||||
# patterns = ['*'],
|
|
||||||
# ignore_patterns = None,
|
|
||||||
# ignore_directories = False,
|
|
||||||
# case_sensitive = True
|
|
||||||
# )
|
|
||||||
# watchdog_event.on_modified = on_modified_callback
|
|
||||||
# watchdog_event.on_deleted = on_deleted_callback
|
|
||||||
|
|
||||||
# watchdog = Observer()
|
|
||||||
# watchdog.schedule(watchdog_event, path = './', recursive = True)
|
|
||||||
# watchdog.start()
|
|
||||||
|
|
||||||
# try:
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
unmessage = input('>>> ').strip()
|
unmessage = input('>>> ').strip()
|
||||||
|
|
||||||
for message in unmessage.split('&'):
|
for message in unmessage.split('&'):
|
||||||
match message.strip().split(' '):
|
match message.strip().split(' '):
|
||||||
case ['0' | 'exit']:
|
case ['exit']:
|
||||||
sys.exit()
|
sys.exit()
|
||||||
case ['reboot' | 'reset']:
|
case ['reboot']:
|
||||||
picowatch.terminal('help()')
|
picowatch.terminal('help()')
|
||||||
case ['ls' | 'stat', *source]:
|
case ['ls', *source]:
|
||||||
picowatch.listing(source[0] if source else '/')
|
picowatch.listing(source[0] if source else '/')
|
||||||
case ['cat' | 'open' | 'contents', source]:
|
case ['cat', source]:
|
||||||
picowatch.contents(source)
|
picowatch.contents(source)
|
||||||
case ['del' | 'rm' | 'delete' | 'remove', source]:
|
case ['rm', source]:
|
||||||
picowatch.delete(source)
|
picowatch.delete(source)
|
||||||
case ['format']:
|
case ['put', source]:
|
||||||
picowatch.delete('/')
|
|
||||||
case ['upl' | 'upload' | 'update', source]:
|
|
||||||
picowatch.upload(source)
|
picowatch.upload(source)
|
||||||
case ['restore']:
|
case ['get', source]:
|
||||||
picowatch.upload('/')
|
|
||||||
case ['download' | 'transfer', source]:
|
|
||||||
picowatch.download(source)
|
picowatch.download(source)
|
||||||
case ['backup']:
|
case ['diff', filename]:
|
||||||
picowatch.download('/')
|
picowatch.compare(filename)
|
||||||
# case ['' | 'save' | 'commit']:
|
case ['status']:
|
||||||
# watchdog_callback()
|
picowatch.status()
|
||||||
# case ['status' | 'staged']:
|
case ['push']:
|
||||||
# for filename in sessions['deleted']:
|
pass
|
||||||
# print('-', filename)
|
case ['test', filename]:
|
||||||
# for filename in sessions['modified']:
|
|
||||||
# print('+', filename)
|
|
||||||
# case ['cancel' | 'unstaged']:
|
|
||||||
# sessions['deleted'] = set()
|
|
||||||
# sessions['modified'] = set()
|
|
||||||
case ['!', 'watch' | 'test', filename]:
|
|
||||||
picowatch.watch(filename)
|
picowatch.watch(filename)
|
||||||
case ['!']:
|
case ['!']:
|
||||||
picowatch.watch('main.py')
|
picowatch.watch('main.py')
|
||||||
@@ -751,7 +714,34 @@ while True:
|
|||||||
print(f'"{message}" is not recognized.')
|
print(f'"{message}" is not recognized.')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(str(e))
|
print(str(e))
|
||||||
# except KeyboardInterrupt:
|
|
||||||
# watchdog.stop()
|
|
||||||
|
|
||||||
# watchdog.join()
|
|
||||||
|
# def git_status():
|
||||||
|
# '''Get the status of the local git repo'''
|
||||||
|
# global modified, deleted, added
|
||||||
|
# # A Dictionary with status-list pairs
|
||||||
|
# delta = {'M' : modified, 'D' : deleted, '?' : added, 'A' : added}
|
||||||
|
# # Get the output of the 'git status -s' CMD command as a string
|
||||||
|
# status_out = subprocess.check_output(['git', 'status', '-s'])
|
||||||
|
# # Split recived output to lines
|
||||||
|
# files = status_out.split('\n')
|
||||||
|
# # Sort the filenames to their appropriate list
|
||||||
|
# for filename in files:
|
||||||
|
# # Avoid errors (last line of output might be '')
|
||||||
|
# if len(filename) < 1:
|
||||||
|
# continue
|
||||||
|
# # Remove all spaces in filename
|
||||||
|
# filename = filename.replace(' ', '')
|
||||||
|
# # Get the status and remove it from file name
|
||||||
|
# file_status = filename[0]
|
||||||
|
# filename = filename[1:]
|
||||||
|
# # Untracked files are prefixed by '??' so we need to remove one '?'
|
||||||
|
# if file_status == '?':
|
||||||
|
# filename = filename[1:]
|
||||||
|
# # If status unfamilier, ignore the file
|
||||||
|
# # TODO: add 'other' list
|
||||||
|
# # TODO: Dispose of unwanted extansions here
|
||||||
|
# if file_status not in delta.keys():
|
||||||
|
# continue
|
||||||
|
# delta[file_status].append(filename)
|
||||||
|
# stage_file(filename)
|
||||||
Reference in New Issue
Block a user