Initial Commit
This commit is contained in:
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
8
.idea/micro_bit_interface.iml
generated
Normal file
8
.idea/micro_bit_interface.iml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/micro_bit_interface.iml" filepath="$PROJECT_DIR$/.idea/micro_bit_interface.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
5
bin/com/communication.py
Normal file
5
bin/com/communication.py
Normal file
@@ -0,0 +1,5 @@
|
||||
class Communication:
|
||||
def __init__(self):
|
||||
self.__x = 0
|
||||
self.__data_recieve = 0
|
||||
self.__output = ""
|
||||
24
bin/com/comport_search.py
Normal file
24
bin/com/comport_search.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import serial.tools.list_ports
|
||||
|
||||
|
||||
class ComportService:
|
||||
def __init__(self):
|
||||
self.__comport = []
|
||||
self.__import = []
|
||||
self.__working = []
|
||||
self.__pos = 0
|
||||
self.__com_name = ""
|
||||
|
||||
def get_comport(self, special_port=""):
|
||||
self.__comport = [comport.device for comport in serial.tools.list_ports.comports()]
|
||||
self.__pos = 0
|
||||
if special_port != "":
|
||||
self.__working = special_port
|
||||
else:
|
||||
while self.__working == []:
|
||||
self.__com_name = serial.tools.list_ports.comports()[self.__pos]
|
||||
if "USB-Serial Controller" or "Prolific USB-Serial Controller" in self.__com_name:
|
||||
self.__working = self.__comport.pop(self.__pos)
|
||||
else:
|
||||
self.__pos += 1
|
||||
return self.__working
|
||||
122
bin/com/csv_parsers.py
Normal file
122
bin/com/csv_parsers.py
Normal file
@@ -0,0 +1,122 @@
|
||||
"""@package docstring
|
||||
This is a simplification of the csv module"""
|
||||
|
||||
import csv
|
||||
|
||||
|
||||
class CsvRead:
|
||||
"""This is a class that reads csv files and depending on the module selected does do different things with it"""
|
||||
def __init__(self):
|
||||
self.__imp = ""
|
||||
self.__raw = ""
|
||||
self.__raw_list = ""
|
||||
|
||||
def importing(self, path):
|
||||
"""Returns a list of the imported csv-file, requires path, either direct system path or relative path"""
|
||||
self.__imp = open(path)
|
||||
self.__raw = csv.reader(self.__imp, delimiter=',')
|
||||
self.__raw_list = list(self.__raw)
|
||||
self.__imp.close()
|
||||
return self.__raw_list
|
||||
|
||||
|
||||
class CsvWrite:
|
||||
"""This is a class that modifies csv files"""
|
||||
def __init__(self):
|
||||
self.__impl = []
|
||||
self.__strpop = []
|
||||
self.__removed = []
|
||||
self.__removing = 0
|
||||
self.__change = 0
|
||||
self.__appending = 0
|
||||
self.__imp = []
|
||||
self.__raw = []
|
||||
|
||||
def rem_str(self, path, row):
|
||||
"""Opens the csv-file in write mode which is specified as an argument either as direct or relative path"""
|
||||
self.__imp = open(path)
|
||||
self.__raw = csv.reader(self.__imp, delimiter=',')
|
||||
self.__impl = list(self.__raw)
|
||||
self.__removed = self.__impl.pop(row + 1)
|
||||
with open(path, "w") as removedata:
|
||||
self.__removing = csv.writer(removedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__removing.writerow(self.__impl.pop(0))
|
||||
while len(self.__impl) > 0:
|
||||
with open(path, "a") as removedata:
|
||||
self.__removing = csv.writer(removedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__removing.writerow(self.__impl.pop(0))
|
||||
self.__imp.close()
|
||||
removedata.close()
|
||||
|
||||
|
||||
def chg_str(self, path, row, pos, new_value):
|
||||
"""Opens the csv-file in write mode to change a value, e.g. if a recipes is changed."""
|
||||
self.__imp = open(path)
|
||||
self.__raw = csv.reader(self.__imp, delimiter=',')
|
||||
self.__impl = list(self.__raw)
|
||||
self.__strpop = self.__impl.pop(row)
|
||||
self.__strpop.pop(pos)
|
||||
self.__strpop.insert(pos, new_value)
|
||||
self.__impl.insert(row, self.__strpop)
|
||||
with open(path, "w") as changedata:
|
||||
self.__change = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__change.writerow(self.__impl.pop(0))
|
||||
while len(self.__impl) > 0:
|
||||
with open(path, "a") as changedata:
|
||||
self.__removing = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__removing.writerow(self.__impl.pop(0))
|
||||
self.__imp.close()
|
||||
changedata.close()
|
||||
|
||||
def chg_str_rem(self, path, row, pos):
|
||||
"""Opens the csv-file in write mode to change a value, e.g. if a recipes is changed."""
|
||||
self.__imp = open(path)
|
||||
self.__raw = csv.reader(self.__imp, delimiter=',')
|
||||
self.__impl = list(self.__raw)
|
||||
self.__strpop = self.__impl.pop(row)
|
||||
self.__strpop.pop(pos)
|
||||
self.__strpop.pop(pos)
|
||||
self.__impl.insert(row, self.__strpop)
|
||||
with open(path, "w") as changedata:
|
||||
self.__change = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__change.writerow(self.__impl.pop(0))
|
||||
while len(self.__impl) > 0:
|
||||
with open(path, "a") as changedata:
|
||||
self.__removing = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__removing.writerow(self.__impl.pop(0))
|
||||
self.__imp.close()
|
||||
changedata.close()
|
||||
|
||||
def chg_str_add(self, path, row, new_value1, new_value2):
|
||||
"""Opens the csv-file in write mode to change a value, e.g. if a recipes is changed."""
|
||||
self.__imp = open(path)
|
||||
self.__raw = csv.reader(self.__imp, delimiter=',')
|
||||
self.__impl = list(self.__raw)
|
||||
self.__strpop = self.__impl.pop(row)
|
||||
self.__strpop.append(new_value1)
|
||||
self.__strpop.append(new_value2)
|
||||
self.__impl.insert(row, self.__strpop)
|
||||
with open(path, "w") as changedata:
|
||||
self.__change = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__change.writerow(self.__impl.pop(0))
|
||||
while len(self.__impl) > 0:
|
||||
with open(path, "a") as changedata:
|
||||
self.__removing = csv.writer(changedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__removing.writerow(self.__impl.pop(0))
|
||||
self.__imp.close()
|
||||
changedata.close()
|
||||
|
||||
def app_str(self, path, value):
|
||||
"""Opens the csv-file in append mode and writes given input. CsvWrite.app_str(path, value).
|
||||
Path can be specified both as direct or relative. value is a list. Will return an error if type of value is
|
||||
not a list."""
|
||||
with open(path, "a") as appenddata:
|
||||
self.__appending = csv.writer(appenddata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__appending.writerow(value)
|
||||
appenddata.close()
|
||||
|
||||
def write_str(self, path, value):
|
||||
with open(path, "w") as writedata:
|
||||
self.__change = csv.writer(writedata, delimiter=',', quoting=csv.QUOTE_MINIMAL)
|
||||
self.__change.writerow(value)
|
||||
writedata.close()
|
||||
73
bin/com/lib.py
Normal file
73
bin/com/lib.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import serial
|
||||
import struct
|
||||
import bin.com.comport_search
|
||||
"""@package docstring
|
||||
This package can communicate with a microcontroller"""
|
||||
|
||||
coms = bin.com.comport_search.ComportService()
|
||||
|
||||
|
||||
class Com:
|
||||
def __init__(self):
|
||||
self.xr = ""
|
||||
self.output = ""
|
||||
self.str_input = ""
|
||||
self.str_get_input = ""
|
||||
self.xs = ""
|
||||
self.__comport = '/dev/ttyUSB0'
|
||||
|
||||
def connect(self, baudrate, special_port):
|
||||
try:
|
||||
self.__comport = coms.get_comport(special_port)
|
||||
except:
|
||||
pass
|
||||
self.ser = serial.Serial(self.__comport, baudrate=baudrate, timeout=5)
|
||||
|
||||
def quitcom(self):
|
||||
try:
|
||||
self.ser.close()
|
||||
except:
|
||||
pass
|
||||
|
||||
def receive(self, amount_bytes):
|
||||
self.xr = self.ser.read(amount_bytes)
|
||||
return self.xr
|
||||
|
||||
def decode_ascii(self, value):
|
||||
try:
|
||||
self.output = value.decode()
|
||||
except:
|
||||
self.output = "Error"
|
||||
return self.output
|
||||
|
||||
def check_value(self, value_check, checked_value):
|
||||
if value_check == checked_value:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def decode_int(self, value):
|
||||
self.i = int(value, base = 16)
|
||||
return self.i
|
||||
|
||||
def decode_float(self, value):
|
||||
self.fs = str(value, 'ascii') + '00'
|
||||
self.f = struct.unpack('>f', bytes.fromhex(self.fs))
|
||||
return str(self.f[0])
|
||||
|
||||
def decode_float_2(self, value):
|
||||
self.fs = str(value, 'ascii') + '0000'
|
||||
self.f = struct.unpack('>f', bytes.fromhex(self.fs))
|
||||
return str(self.f[0])
|
||||
|
||||
def get_input(self):
|
||||
self.str_get_input = input("please enter a character to send: ")
|
||||
return self.str_get_input
|
||||
|
||||
def send(self, str_input):
|
||||
self.xs = str_input.encode()
|
||||
self.ser.write(self.xs)
|
||||
|
||||
def send_float(self, float_input):
|
||||
ba = bytearray(struct.pack('>f', float_input))
|
||||
self.ser.write(ba[0:3])
|
||||
1
bin/data/full_command_list.csv
Normal file
1
bin/data/full_command_list.csv
Normal file
@@ -0,0 +1 @@
|
||||
test1,test2,stop,start,transmit,test,arch
|
||||
|
27
bin/gui/command_screen.kv
Normal file
27
bin/gui/command_screen.kv
Normal file
@@ -0,0 +1,27 @@
|
||||
Command:
|
||||
name: "CommandScreen"
|
||||
md_bg_color: 0, 0, 0, 1
|
||||
FloatLayout:
|
||||
Label:
|
||||
id: cmd_out
|
||||
size_hint: 0.96, 0.6
|
||||
pos_hint: {"x": 0.03, "y": 0.35}
|
||||
text_size: self.size
|
||||
color: 1, 1, 1, 1
|
||||
text: ""
|
||||
valign: "bottom"
|
||||
TextInput:
|
||||
color: 1, 1, 1, 1
|
||||
foreground_color: 1, 1, 1, 1
|
||||
background_color: 0, 0, 0, 1
|
||||
size_hint: 0.96, 0.1
|
||||
pos_hint: {"x": 0.02, "y": 0.2}
|
||||
id: tin
|
||||
hint_text: "Enter command..."
|
||||
multiline: False
|
||||
on_text: root.autocomplete()
|
||||
on_text_validate: root.runcommand()
|
||||
Button:
|
||||
text: "back"
|
||||
size_hint: 0.1, 0.1
|
||||
pos_hint: {"x": 0.02, "y": 0.02}
|
||||
23
bin/gui/load_screen.kv
Normal file
23
bin/gui/load_screen.kv
Normal file
@@ -0,0 +1,23 @@
|
||||
Load:
|
||||
name: "LoadScreen"
|
||||
on_enter: root.start_pb()
|
||||
radius: [25, 25, 25, 25]
|
||||
md_bg_color: app.theme_cls.accent_light
|
||||
GridLayout:
|
||||
cols: 1
|
||||
Label:
|
||||
text: "micro:bit interface"
|
||||
font_size: 60
|
||||
color: app.theme_cls.primary_dark
|
||||
FloatLayout:
|
||||
MDProgressBar:
|
||||
id: progress
|
||||
size_hint: .6, .6
|
||||
pos_hint: {"x": 0.2, "y": 0.3}
|
||||
color: app.theme_cls.primary_dark
|
||||
type: "determinate"
|
||||
running_duration: 0.75
|
||||
catching_duration: 0.5
|
||||
Label:
|
||||
color: "black"
|
||||
text: "starting app ..."
|
||||
17
bin/gui/main_screen.kv
Normal file
17
bin/gui/main_screen.kv
Normal file
@@ -0,0 +1,17 @@
|
||||
Main:
|
||||
name: "HomeScreen"
|
||||
md_bg_color: app.theme_cls.accent_light
|
||||
GridLayout:
|
||||
cols: 1
|
||||
Label:
|
||||
text: "micro:bit interface"
|
||||
font_size: 60
|
||||
color: app.theme_cls.primary_dark
|
||||
GridLayout:
|
||||
cols: 2
|
||||
Button:
|
||||
text: "Start"
|
||||
on_release:
|
||||
app.root.current = "CommandScreen"
|
||||
Button:
|
||||
text: "Settings"
|
||||
0
bin/micro_bit/command_list.py
Normal file
0
bin/micro_bit/command_list.py
Normal file
3
bin/micro_bit/micro_bit_soft.py
Normal file
3
bin/micro_bit/micro_bit_soft.py
Normal file
@@ -0,0 +1,3 @@
|
||||
import microbit
|
||||
|
||||
microbit.uart.write()
|
||||
48
bin/others/autocomplete.py
Normal file
48
bin/others/autocomplete.py
Normal file
@@ -0,0 +1,48 @@
|
||||
import bin.com.csv_parsers
|
||||
|
||||
cvr = bin.com.csv_parsers.CsvRead()
|
||||
|
||||
|
||||
class AutoComplete:
|
||||
def __init__(self):
|
||||
self.__length_command_completion = 0
|
||||
self.__command_list = []
|
||||
self.__possible_completion = []
|
||||
self.item = ""
|
||||
self.items = ""
|
||||
self.__return_value = []
|
||||
self.__return_value_assembly = ""
|
||||
self.__command_count = 0
|
||||
self.text = ""
|
||||
|
||||
def autocomplete(self, text, command_list_path):
|
||||
self.text = str(text).lower()
|
||||
if self.text[len(self.text) - 2:] == "\t\n":
|
||||
self.text = self.text[:len(self.text) - 2]
|
||||
elif self.text[len(self.text) - 1:] == "\t":
|
||||
self.text = self.text[:len(self.text) - 1]
|
||||
self.__command_list = cvr.importing(command_list_path).pop(0)
|
||||
self.__return_value = []
|
||||
self.__return_value_assembly = ""
|
||||
self.__possible_completion = []
|
||||
self.__command_count = 0
|
||||
for self.item in self.__command_list:
|
||||
if self.text == self.item[:len(self.text)]:
|
||||
self.__possible_completion.append(self.item)
|
||||
else:
|
||||
pass
|
||||
if len(self.__possible_completion) < 1:
|
||||
self.__return_value = [f"{self.text}\n-micro:bit - No such command", self.text[:len(self.text)]]
|
||||
elif len(self.__possible_completion) == 1:
|
||||
self.__return_value = ["", str(self.__possible_completion.pop(0))]
|
||||
else:
|
||||
for self.items in self.__possible_completion:
|
||||
self.__return_value_assembly += f"{str(self.items)} "
|
||||
if self.__command_count > 2:
|
||||
self.__return_value_assembly += "\n"
|
||||
self.__command_count = 0
|
||||
else:
|
||||
self.__command_count += 1
|
||||
self.__return_value.append(self.__return_value_assembly)
|
||||
self.__return_value.append(self.text[:len(self.text)])
|
||||
return self.__return_value
|
||||
26
bin/others/run_command.py
Normal file
26
bin/others/run_command.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import serial
|
||||
import bin.com.csv_parsers
|
||||
import bin.com.lib
|
||||
|
||||
|
||||
cvr = bin.com.csv_parsers.CsvRead()
|
||||
com = bin.com.lib.Com()
|
||||
|
||||
|
||||
class RunCommand:
|
||||
def __init__(self):
|
||||
self.__all_commands = []
|
||||
self.__return = ""
|
||||
|
||||
def runcommand(self, command, command_list_path):
|
||||
self.__all_commands = cvr.importing(command_list_path).pop(0)
|
||||
if command in self.__all_commands:
|
||||
try:
|
||||
com.connect(19200, "")
|
||||
com.send(command)
|
||||
self.__return = "The command executed successfully"
|
||||
except serial.SerialException:
|
||||
self.__return = f"[micro:bit - {command}]: An error occurred running the command. (Maybe disconnected or no permission?)"
|
||||
else:
|
||||
self.__return = "-micro:bit - No such command"
|
||||
return self.__return
|
||||
7
config/settings.ini
Normal file
7
config/settings.ini
Normal file
@@ -0,0 +1,7 @@
|
||||
[Info]
|
||||
version = V0.1
|
||||
subVersion = -dev1
|
||||
|
||||
[Dev Settings]
|
||||
log_level = DEBUG
|
||||
|
||||
176
main.py
Normal file
176
main.py
Normal file
@@ -0,0 +1,176 @@
|
||||
#########################################################
|
||||
"""@package docstring
|
||||
Micro:bit Bluetooth Interface, developed by simplePCBuilding, alpha 1.0
|
||||
|
||||
This App allows you to connect to a micro:bit via the USB cable and as such transmit to
|
||||
and recieve Data from it. This file here is the control file for the UI and as such
|
||||
should not be interfaced with. All the api files are located in the bin directory."""
|
||||
#########################################################
|
||||
|
||||
# IMPORTS
|
||||
import logging
|
||||
import os
|
||||
import configparser
|
||||
import datetime
|
||||
from kivymd.uix.screen import MDScreen
|
||||
from kivymd.app import MDApp
|
||||
from kivy.uix.screenmanager import ScreenManager
|
||||
from kivy.base import Builder
|
||||
from kivy.uix.popup import Popup
|
||||
from kivy.clock import Clock
|
||||
from kivy.core.window import Window
|
||||
import bin.others.autocomplete
|
||||
import bin.others.run_command
|
||||
|
||||
|
||||
################################
|
||||
# VARIABLE SETUP
|
||||
################
|
||||
config = configparser.ConfigParser()
|
||||
config.read('./config/settings.ini')
|
||||
version_app = f"{config['Info']['version']}{config['Info']['subVersion']}"
|
||||
ac = bin.others.autocomplete.AutoComplete()
|
||||
rc = bin.others.run_command.RunCommand()
|
||||
|
||||
################################
|
||||
|
||||
|
||||
################################
|
||||
# LOGGER SETUP
|
||||
##############
|
||||
|
||||
# BASIC SETUP
|
||||
logging.basicConfig(level=logging.DEBUG, filename="./log/main_log.log", filemode="w")
|
||||
logs = f"./log/{datetime.datetime.now()}-log-main.log"
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# SETUP OF HANDLER & FORMATTER
|
||||
handler = logging.FileHandler(logs)
|
||||
formatter = logging.Formatter("%(levelname)s - %(asctime)s - %(name)s: %(message)s -- %(lineno)d")
|
||||
handler.setFormatter(formatter)
|
||||
logger.addHandler(handler)
|
||||
|
||||
# FINAL CONFIG & FIRST LOG ENTRY
|
||||
logger.setLevel(config['Dev Settings']['log_level'])
|
||||
logger.info(f"Logger initialized, app is running Version: {version_app}")
|
||||
################################
|
||||
|
||||
|
||||
################################
|
||||
# SETTINGS HANDLER
|
||||
##################
|
||||
|
||||
class SettingsHandler:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def settings_handler(self):
|
||||
pass
|
||||
|
||||
################################
|
||||
|
||||
|
||||
##############################################################
|
||||
# SCREENS
|
||||
##############################################################
|
||||
|
||||
|
||||
################################
|
||||
# LOAD SCREEN
|
||||
#############
|
||||
|
||||
class Load(MDScreen):
|
||||
def start_pb(self):
|
||||
self.ids.progress.start()
|
||||
|
||||
|
||||
################################
|
||||
|
||||
|
||||
################################
|
||||
# MAIN SCREEN
|
||||
#############
|
||||
|
||||
class Main(MDScreen):
|
||||
pass
|
||||
|
||||
|
||||
################################
|
||||
|
||||
|
||||
################################
|
||||
# COMMAND SCREEN
|
||||
################
|
||||
|
||||
class Command(MDScreen):
|
||||
def autocomplete(self):
|
||||
self.text = self.ids.tin.text
|
||||
self.input = self.text[len(self.text) - 1:]
|
||||
if self.input == "\t":
|
||||
self.__ac = ac.autocomplete(self.text, "./bin/data/full_command_list.csv")
|
||||
self.__history = self.ids.cmd_out.text
|
||||
self.__output_text = self.__history + "\n\n" + str(self.__ac.pop(0))
|
||||
self.ids.cmd_out.text = self.__output_text
|
||||
self.ids.tin.text = self.__ac.pop(0)
|
||||
else:
|
||||
pass
|
||||
|
||||
def runcommand(self):
|
||||
self.__info = rc.runcommand(self.ids.tin.text, "./bin/data/full_command_list.csv")
|
||||
if self.__info == "The command executed successfully":
|
||||
logger.debug(f"The following command has been run successfully: {self.ids.tin.text}")
|
||||
else:
|
||||
logger.debug(f"The following command has failed to run: {self.ids.tin.text}")
|
||||
self.ids.tin.text = ""
|
||||
self.__history = self.ids.cmd_out.text
|
||||
self.__output_text = self.__history + "\n\n" + str(self.__info)
|
||||
self.ids.cmd_out.text = self.__output_text
|
||||
|
||||
|
||||
################################
|
||||
|
||||
|
||||
####################################################
|
||||
|
||||
|
||||
################################
|
||||
# SCREEN MANAGER
|
||||
################
|
||||
|
||||
class RootScreen(ScreenManager):
|
||||
pass
|
||||
|
||||
|
||||
################################
|
||||
# UI MANAGER
|
||||
################################
|
||||
|
||||
class MicrobitInterface(MDApp):
|
||||
global screen_manager
|
||||
screen_manager = ScreenManager()
|
||||
logger.info("building app...")
|
||||
|
||||
def build(self):
|
||||
self.title = f"Microbit Bluetooth Interface {version_app}"
|
||||
self.theme_cls.primary_palette = "Blue"
|
||||
self.theme_cls.accent_palette = "BlueGray"
|
||||
# self.icon =
|
||||
screen_manager.add_widget(Builder.load_file("./bin/gui/load_screen.kv"))
|
||||
screen_manager.add_widget(Builder.load_file("./bin/gui/main_screen.kv"))
|
||||
screen_manager.add_widget(Builder.load_file("./bin/gui/command_screen.kv"))
|
||||
return screen_manager
|
||||
|
||||
# Redirect start instructions to switch screen
|
||||
def on_start(self):
|
||||
logger.info("App is starting")
|
||||
Clock.schedule_once(self.launch_app, 0.5)
|
||||
|
||||
# Switching screens after init
|
||||
def launch_app(self, dt):
|
||||
screen_manager.current = "HomeScreen"
|
||||
screen_manager.transition.duration = 0.2
|
||||
screen_manager.transition.direction = "left"
|
||||
|
||||
|
||||
logger.info("App start successful")
|
||||
MicrobitInterface().run()
|
||||
3
testfile.py
Normal file
3
testfile.py
Normal file
@@ -0,0 +1,3 @@
|
||||
import bin.others.autocomplete
|
||||
|
||||
print(bin.others.autocomplete.AutoComplete().autocomplete("Sta\t\n", "./bin/data/full_command_list.csv"))
|
||||
Reference in New Issue
Block a user