PK{wHy؎]]ubit_kernel/__init__.py'''A Jupyter kernel for MicroPython on the BBC micro:bit''' from .kernel import __version__ PK8{wHrdubit_kernel/__main__.pyfrom ipykernel.kernelapp import IPKernelApp from .kernel import MicrobitKernel IPKernelApp.launch_instance(kernel_class=MicrobitKernel) PKG{wHTubit_kernel/install.pyimport json import os import sys from jupyter_client.kernelspec import install_kernel_spec from IPython.utils.tempdir import TemporaryDirectory kernel_json = {"argv": [sys.executable, "-m", "ubit_kernel", "-f", "{connection_file}"], "display_name":"micro:bit", "language":"python", } def install_my_kernel_spec(user=True): with TemporaryDirectory() as td: os.chmod(td, 0o755) # Starts off as 700, not user readable with open(os.path.join(td, 'kernel.json'), 'w') as f: json.dump(kernel_json, f, sort_keys=True) # TODO: Copy resources once they're specified print('Installing IPython kernel spec') install_kernel_spec(td, 'ubit', user=user, replace=True) def _is_root(): try: return os.geteuid() == 0 except AttributeError: return False # assume not an admin on non-Unix platforms def main(argv=[]): user = '--user' in argv or not _is_root() install_my_kernel_spec(user=user) if __name__ == '__main__': main(argv=sys.argv) PKn+J\ \ ubit_kernel/kernel.pyimport ast import re import sys import time from ipykernel.kernelbase import Kernel from .ubit import connect __version__ = '0.3' class MicrobitKernel(Kernel): implementation = 'ubit_kernel' implementation_version = __version__ language_info = {'name': 'python', 'version': '3', 'mimetype': 'text/x-python', 'file_extension': '.py', 'codemirror_mode': {'name': 'python', 'version': 3}, 'pygments_lexer': 'python3', } help_links = [ {'text': 'micro:bit MicroPython', 'url': 'http://microbit-micropython.readthedocs.org/en/latest/index.html' }, ] banner = "Welcome to MicroPython on the BBC micro:bit" def __init__(self, **kwargs): super().__init__(**kwargs) self.serial = connect() def run_code(self, code): '''Run a string of code, return strings for stdout and stderr''' self.serial.write(code.encode('utf-8') + b'\x04') result = bytearray() while not result.endswith(b'\x04>'): time.sleep(0.1) result.extend(self.serial.read_all()) #print('Read', repr(result), file=sys.__stderr__) assert result.startswith(b'OK') out, err = result[2:-2].split(b'\x04', 1) return out.decode('utf-8', 'replace'), err.decode('utf-8', 'replace') def do_execute(self, code, silent, store_history=True, user_expressions=None, allow_stdin=False): out, err = self.run_code(code) if out: self.send_response(self.iopub_socket, 'stream', { 'name': 'stdout', 'text': out }) if err: self.send_response(self.iopub_socket, 'stream', { 'name': 'stderr', 'text': err }) return {'status': 'ok', 'execution_count': self.execution_count, 'payload': [], 'user_expressions': {}} def _eval(self, expr): out, err = self.run_code('print({})'.format(expr)) return ast.literal_eval(out) def do_complete(self, code, cursor_pos): #print('completing on', repr(code), file=sys.__stderr__) code = code[:cursor_pos] m = re.search(r'(\w+\.)*(\w+)?$', code) if m: prefix = m.group() #print('prefix', repr(prefix), file=sys.__stderr__) if '.' in prefix: obj, prefix = prefix.rsplit('.') names = self._eval('dir({})'.format(obj)) else: names = self._eval('dir()') #print('names', names, file=sys.__stderr__) matches = [n for n in names if n.startswith(prefix)] return {'matches': matches, 'cursor_start': cursor_pos - len(prefix), 'cursor_end': cursor_pos, 'metadata': {}, 'status': 'ok'} else: return {'matches': [], 'cursor_start': cursor_pos, 'cursor_end': cursor_pos, 'metadata': {}, 'status': 'ok'} PK3n+J]'˶ubit_kernel/ubit.pyfrom serial import Serial from serial.tools.list_ports import comports MICROBIT_PID = 516 MICROBIT_VID = 3368 BAUDRATE = 115200 PARITY = 'N' def find_microbit(): """ Returns the port for the first micro:bit found connected to the computer. """ for port in comports(): if port.vid == MICROBIT_VID and port.pid == MICROBIT_PID: return port.device def connect(): """ Returns a pySerial Serial object to talk to the microbit """ s = Serial(find_microbit(), BAUDRATE, parity=PARITY) s.write(b'\x03\x01') # Ctrl-C: interrupt, Ctrl-A: switch to raw REPL s.read_until(b'raw REPL') s.read_until(b'\r\n>') # Wait for prompt return s PK!H;@QPubit_kernel-0.3.dist-info/WHEEL1 0 RZq+D-Dv;_[*7Fp ܦpv/fݞoL(*IPK!H19 "ubit_kernel-0.3.dist-info/METADATAVnF}W Pi cH:ֹF4ъI^,{fIʲдLΙ3gUP_켶YvZ.).uegO&r}I>v}`G5ZYGtu6†իٟSk؄r>_밉ˢ-q}濣vƒ^vnzc.*Kskytq;? yκ\]0M Xk6UBwݷuTGήfMYG*Gnmo*ĖMHak)[@CI]i]?2Z IG K\M@ER5{6ȵ"Rr}RʙL-m =PE]Rs1z B5 " kٯM&|((HqVΚP|R Q5AȔnɮPޤN?ӵ\?}gv1k FhQ& K[!Y1&jN/VBbӚefТ66v2-ˡd/Z,yKcU#om+_X7*sŻ/6m^.}7&s;y`'Xb=R'tNU[a;wRGfZYȪVUGk˲ykfiAM\zQB+<,B5L[&qkȡLDZ@ɓ|t]F%q1)qnWLasufaJ E!b%j#EcveoPS4A;QDUu0\f c;=6>4n!ސl#ޣ8]R+dl9+G9ŵ:xEc'5a|'B0>C0[D֔+6\ W/j,Z.0OVb)ҡG 5_8P^+NZ ,G|`#e:a81я9EDa2&hGSk?@3bȲBg7(cg_7YFNvBW1}wdF(0tf} Ad%ǿ조v)-PK!H4Y ubit_kernel-0.3.dist-info/RECORD}Ks@}~ y,f n(PP^ҍL&{SuǼiS h_Ӵ-]f\3~j%k^&1%ܖ5Rڒ!N$902zZUxQ)D:xeհH3Hq%vn[*LhֶOZ_n#Uhzz6ۑug'ol0n$<4*=`c\b'?Y_3սPJAUj&uvs?Lr+:W.[Id ޷ ߧ}j171m=͇1oPK{wHy؎]]ubit_kernel/__init__.pyPK8{wHrdubit_kernel/__main__.pyPKG{wHTPubit_kernel/install.pyPKn+J\ \ ubit_kernel/kernel.pyPK3n+J]'˶ubit_kernel/ubit.pyPK!H;@QPubit_kernel-0.3.dist-info/WHEELPK!H19 "ubit_kernel-0.3.dist-info/METADATAPK!H4Y ubit_kernel-0.3.dist-info/RECORDPK=u