From 29d4002dc07cf9d51edcd7af312578c7d3dcde25 Mon Sep 17 00:00:00 2001 From: AGawde05 Date: Thu, 1 Apr 2021 02:21:01 -0500 Subject: [PATCH] feat: gui layout + basic func --- config.json | 123 +++++++++++++++++++++++++++++++++++-------------- design.kv | 22 +++++++-- main.py | 38 ++++++++++++++- superscript.py | 108 +++++++++++++++++++++---------------------- 4 files changed, 199 insertions(+), 92 deletions(-) diff --git a/config.json b/config.json index f143132..68d73d1 100644 --- a/config.json +++ b/config.json @@ -1,46 +1,101 @@ { "max-threads": 0.5, "team": "", - "competition": "", - "key":{ - "database":"", - "tba":"" + "competition": "2020ilch", + "key": { + "database": "mongodb+srv://analysis:MU2gPeEjEurRt2n@2022-scouting-4vfuu.mongodb.net/?retryWrites=true&w=majority", + "tba": "UDvKmPjPRfwwUdDX1JxbmkyecYBJhCtXeyVk9vmO2i7K0Zn4wqQPMfzuEINXJ7e5" }, - "statistics":{ - "match":{ - "balls-blocked":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-collected":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-lower-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-lower-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-started":["basic_stats","historical_analyss","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-upper-teleop":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"], - "balls-upper-auto":["basic_stats","historical_analysis","regression_linear","regression_logarithmic","regression_exponential","regression_polynomial","regression_sigmoidal"] - + "statistics": { + "match": { + "balls-blocked": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-collected": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-lower-teleop": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-lower-auto": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-started": [ + "basic_stats", + "historical_analyss", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-upper-teleop": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ], + "balls-upper-auto": [ + "basic_stats", + "historical_analysis", + "regression_linear", + "regression_logarithmic", + "regression_exponential", + "regression_polynomial", + "regression_sigmoidal" + ] }, - "metric":{ - "elo":{ - "score":1500, - "N":400, - "K":24 + "metric": { + "elo": { + "score": 1500, + "N": 400, + "K": 24 }, - "gl2":{ - "score":1500, - "rd":250, - "vol":0.06 + "gl2": { + "score": 1500, + "rd": 250, + "vol": 0.06 }, - "ts":{ - "mu":25, - "sigma":8.33 + "ts": { + "mu": 25, + "sigma": 8.33 } }, - "pit":{ - "wheel-mechanism":true, - "low-balls":true, - "high-balls":true, - "wheel-success":true, - "strategic-focus":true, - "climb-mechanism":true, - "attitude":true + "pit": { + "wheel-mechanism": true, + "low-balls": true, + "high-balls": true, + "wheel-success": true, + "strategic-focus": true, + "climb-mechanism": true, + "attitude": true } } } \ No newline at end of file diff --git a/design.kv b/design.kv index 92ee291..177a926 100644 --- a/design.kv +++ b/design.kv @@ -1,4 +1,4 @@ -BoxLayout: +: orientation: "vertical" NavigationLayout: @@ -51,6 +51,7 @@ BoxLayout: MDTextField: hint_text: "placeholder" pos_hint: {"center_y": .5} + BoxLayout: orientation: "horizontal" MDLabel: @@ -84,9 +85,15 @@ BoxLayout: MDProgressBar: id: progress value: 50 - + StatsScreen: + name: "Stats" + MDCheckbox: + size_hint: None, None + size: "48dp", "48dp" + pos_hint: {'center_x': .5, 'center_y': .5} + on_active: Screen.test() - +#Navigation Drawer ------------------------- MDNavigationDrawer: id: nav_drawer BoxLayout: @@ -131,5 +138,14 @@ BoxLayout: # screen_manager.transition.direction = "right" # screen_manager.fade screen_manager.current = "Info" + IconLeftWidget: + icon: "cog" + OneLineAvatarListItem: + text: "Stats" + on_press: + # nav_drawer.set_state("close") + # screen_manager.transition.direction = "right" + # screen_manager.fade + screen_manager.current = "Stats" IconLeftWidget: icon: "cog" \ No newline at end of file diff --git a/main.py b/main.py index 3e506cc..a57421e 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,40 @@ from kivy.lang import Builder + +from kivymd.uix.screen import Screen +from kivymd.uix.list import OneLineListItem, MDList, TwoLineListItem, ThreeLineListItem +from kivymd.uix.list import OneLineIconListItem, IconLeftWidget +from kivy.uix.scrollview import ScrollView + + from kivy.uix.boxlayout import BoxLayout from kivy.uix.screenmanager import ScreenManager, Screen +from kivy.uix.dropdown import DropDown +from kivy.uix.button import Button +from kivy.base import runTouchApp +from kivymd.uix.menu import MDDropdownMenu, MDMenuItem + from kivymd.app import MDApp # import superscript as ss +# from tra_analysis import analysis as an +import data as d +from collections import defaultdict +import json +import math +import numpy as np +import os +from os import system, name +from pathlib import Path +from multiprocessing import Pool +import matplotlib.pyplot as plt +from concurrent.futures import ThreadPoolExecutor +import time +import warnings + +# global exec_threads + + +# Screens class HomeScreen(Screen): pass class SettingsScreen(Screen): @@ -11,11 +42,16 @@ class SettingsScreen(Screen): class InfoScreen(Screen): pass +class StatsScreen(Screen): + pass + + class MyApp(MDApp): def build(self): self.theme_cls.primary_palette = "Red" return Builder.load_file("design.kv") - + def test(): + print("test") if __name__ == "__main__": diff --git a/superscript.py b/superscript.py index 7236e67..4c147de 100644 --- a/superscript.py +++ b/superscript.py @@ -135,75 +135,75 @@ from concurrent.futures import ThreadPoolExecutor import time import warnings -global exec_threads +# global exec_threads def main(): - global exec_threads + # global exec_threads warnings.filterwarnings("ignore") - while (True): +# while (True): - current_time = time.time() - print("[OK] time: " + str(current_time)) + current_time = time.time() + print("[OK] time: " + str(current_time)) - config = load_config("data-analysis/config.json") - competition = config["competition"] - match_tests = config["statistics"]["match"] - pit_tests = config["statistics"]["pit"] - metrics_tests = config["statistics"]["metric"] - print("[OK] configs loaded") + config = load_config("red-alliance-analysis\data-analysis\config.json") + competition = config["competition"] + match_tests = config["statistics"]["match"] + pit_tests = config["statistics"]["pit"] + metrics_tests = config["statistics"]["metric"] + print("[OK] configs loaded") - print("[OK] starting threads") - cfg_max_threads = config["max-threads"] - sys_max_threads = os.cpu_count() - if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : - alloc_processes = sys_max_threads + cfg_max_threads - elif cfg_max_threads > 0 and cfg_max_threads < 1: - alloc_processes = math.floor(cfg_max_threads * sys_max_threads) - elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: - alloc_processes = cfg_max_threads - elif cfg_max_threads == 0: - alloc_processes = sys_max_threads - else: - print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) - exit() - exec_threads = Pool(processes = alloc_processes) - print("[OK] " + str(alloc_processes) + " threads started") + print("[OK] starting threads") + cfg_max_threads = config["max-threads"] + sys_max_threads = os.cpu_count() + if cfg_max_threads > -sys_max_threads and cfg_max_threads < 0 : + alloc_processes = sys_max_threads + cfg_max_threads + elif cfg_max_threads > 0 and cfg_max_threads < 1: + alloc_processes = math.floor(cfg_max_threads * sys_max_threads) + elif cfg_max_threads > 1 and cfg_max_threads <= sys_max_threads: + alloc_processes = cfg_max_threads + elif cfg_max_threads == 0: + alloc_processes = sys_max_threads + else: + print("[Err] Invalid number of processes, must be between -" + str(sys_max_threads) + " and " + str(sys_max_threads)) + exit() + # exec_threads = Pool(processes = alloc_processes) + # print("[OK] " + str(alloc_processes) + " threads started") - apikey = config["key"]["database"] - tbakey = config["key"]["tba"] - print("[OK] loaded keys") + apikey = config["key"]["database"] + tbakey = config["key"]["tba"] + print("[OK] loaded keys") - previous_time = get_previous_time(apikey) - print("[OK] analysis backtimed to: " + str(previous_time)) + previous_time = get_previous_time(apikey) + print("[OK] analysis backtimed to: " + str(previous_time)) - print("[OK] loading data") - start = time.time() - match_data = load_match(apikey, competition) - pit_data = load_pit(apikey, competition) - print("[OK] loaded data in " + str(time.time() - start) + " seconds") + print("[OK] loading data") + start = time.time() + match_data = load_match(apikey, competition) + pit_data = load_pit(apikey, competition) + print("[OK] loaded data in " + str(time.time() - start) + " seconds") - print("[OK] running match stats") - start = time.time() - matchloop(apikey, competition, match_data, match_tests) - print("[OK] finished match stats in " + str(time.time() - start) + " seconds") + print("[OK] running match stats") + start = time.time() + matchloop(apikey, competition, match_data, match_tests) + print("[OK] finished match stats in " + str(time.time() - start) + " seconds") - print("[OK] running team metrics") - start = time.time() - metricloop(tbakey, apikey, competition, previous_time, metrics_tests) - print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") + print("[OK] running team metrics") + start = time.time() + metricloop(tbakey, apikey, competition, previous_time, metrics_tests) + print("[OK] finished team metrics in " + str(time.time() - start) + " seconds") - print("[OK] running pit analysis") - start = time.time() - pitloop(apikey, competition, pit_data, pit_tests) - print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") - - set_current_time(apikey, current_time) - print("[OK] finished all tests, looping") + print("[OK] running pit analysis") + start = time.time() + pitloop(apikey, competition, pit_data, pit_tests) + print("[OK] finished pit analysis in " + str(time.time() - start) + " seconds") + + set_current_time(apikey, current_time) + print("[OK] finished all tests, looping") - clear() + # clear() def clear(): @@ -314,7 +314,7 @@ def matchloop(apikey, competition, data, tests): # expects 3D array with [Team][ variable_data.append((data[team][variable], test)) test_filtered.append(test) - result_filtered = exec_threads.map(simplestats, variable_data) + result_filtered = map(simplestats, variable_data) i = 0 result_filtered = list(result_filtered)