Skip to content

desktop app for engine #79

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 72 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
f87f95a
init commit
ola567 Feb 29, 2024
57877a7
draft of gui and simple simulation
ola567 Mar 7, 2024
b0a8c2d
gui improvements
ola567 Mar 9, 2024
a002802
remove unnecesary lines
ola567 Mar 10, 2024
1fe9be7
changes
ola567 Mar 14, 2024
e10b7cf
changes
ola567 Mar 14, 2024
8eee248
changes
ola567 Mar 17, 2024
393167e
changes
ola567 Mar 17, 2024
ba25227
changes
ola567 Mar 18, 2024
968ce39
changes
ola567 Mar 18, 2024
74f1889
changes
ola567 Mar 18, 2024
99f12da
changes
ola567 Mar 18, 2024
f52b3a3
changes
ola567 Mar 23, 2024
b8faba4
fix data type and delay
Mateusz-Krajewski Apr 17, 2024
8dedb99
kill threads with app+ set ip,port from config
Mateusz-Krajewski Apr 17, 2024
c9c36ad
Init tests
Mateusz-Krajewski Apr 17, 2024
e66d53b
fix
Mateusz-Krajewski Apr 17, 2024
a227c9d
finish tests
Mateusz-Krajewski Apr 17, 2024
2cb2718
disable stop saaving button
ola567 Apr 17, 2024
6a44509
change saving to file
ola567 Apr 17, 2024
32cb63a
changes
ola567 Apr 17, 2024
7bf008d
fix config
Mateusz-Krajewski Apr 18, 2024
f441bdf
test1
Mateusz-Krajewski May 7, 2024
43574db
SOMEIP_DATABASE: adding json parser
bartoszsnieg Jan 12, 2024
1727ce6
Update submodule
bartoszsnieg Mar 5, 2024
68d8b65
Makr fix gpio driver (#42)
Mateusz-Krajewski Mar 7, 2024
e92d7cf
init
Mateusz-Krajewski Mar 8, 2024
9394d2f
basic_change_value_with_res_toTest
Mateusz-Krajewski Mar 8, 2024
1bb1635
.
Mateusz-Krajewski Mar 8, 2024
edbc61b
fix
Mateusz-Krajewski Mar 8, 2024
374350a
Makr remove result fix core dep (#43)
Mateusz-Krajewski Mar 10, 2024
4b1c56b
Problem with socket hotfix
bartoszsnieg Mar 11, 2024
ab2a403
Fix
bartoszsnieg Mar 11, 2024
8884e63
i2c dodane (#26)
Michal-Mankowski Mar 11, 2024
6989977
I2C driver remove core::Result
Mateusz-Krajewski Mar 12, 2024
eb5f53a
some/ip v 1.0
bartoszsnieg Mar 5, 2024
9b239a3
subrepo update
bartoszsnieg Mar 24, 2024
4d5f7c9
Makr moc create exec manager (#49)
Mateusz-Krajewski Mar 24, 2024
adcc44c
submodule update
bartoszsnieg Apr 6, 2024
bd4fa24
added fake dtc
bartoszsnieg Apr 6, 2024
90ba1b9
Check
bartoszsnieg Mar 25, 2024
e16df1d
submodule update
bartoszsnieg Apr 10, 2024
470d6dc
temp_service_made_by_mmatuszewsky (#59)
Mateusz-Krajewski Apr 12, 2024
addf717
Create Devcontainer (#62)
Mateusz-Krajewski Apr 12, 2024
bbdcbcd
fix
Mateusz-Krajewski Apr 12, 2024
86adf18
force fix
Mateusz-Krajewski Apr 17, 2024
382a2ff
V1.5
bartoszsnieg Apr 27, 2024
b9d1412
sub repo update
bartoszsnieg Apr 27, 2024
a78a67d
Base version
bartoszsnieg Apr 10, 2024
47e9fb8
sub repo update
bartoszsnieg Apr 27, 2024
150d5fa
add caching
Mateusz-Krajewski Apr 28, 2024
492b3d7
Makr i2c +pca (#69)
Mateusz-Krajewski Apr 28, 2024
754fd60
MaKr SOME/IP Primer Service (#64)
Mateusz-Krajewski Apr 28, 2024
17af0bf
force fix cache
Mateusz-Krajewski Apr 28, 2024
dac3b3f
1
Mateusz-Krajewski Apr 28, 2024
ae65b5a
sub repo update
bartoszsnieg Apr 28, 2024
a80d802
force fix depl
Mateusz-Krajewski Apr 28, 2024
a00f041
init
Mateusz-Krajewski Apr 28, 2024
52d8b9f
fix
Mateusz-Krajewski Apr 28, 2024
52a53bf
fix
Mateusz-Krajewski Apr 28, 2024
54366ce
Bazel update from 5.4.1 to 7.1.1
bartoszsnieg Apr 30, 2024
f265feb
submodule update
bartoszsnieg May 6, 2024
1beb8bc
makr_fix_actions_for_bazel_7.4.1
Mateusz-Krajewski May 6, 2024
2a0a58b
fix devcontainer
Mateusz-Krajewski May 7, 2024
8afb29e
add pylint check
Mateusz-Krajewski May 7, 2024
383240e
Merge branch 'master' into alhe_desktop_app_for_engine
Mateusz-Krajewski May 7, 2024
2c49d53
add coverage actions
Mateusz-Krajewski May 7, 2024
6df2b2c
fix
Mateusz-Krajewski May 7, 2024
7f7578e
.
Mateusz-Krajewski May 7, 2024
5ce30ca
.
Mateusz-Krajewski May 7, 2024
c325929
add search by req_method
sgolebiewska May 17, 2024
8eff523
fix set_valve
sgolebiewska May 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .github/workflows/python_syntax.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Pylint Check

on:
push:
branches:
- master
pull_request:
branches:
- master

jobs:
pylint_check:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11'

- name: Install dependencies
run: pip install pylint

- name: Run pylint
run: |
py_files=$(find tools -name "*.py")
total_errors=0

for file in $py_files; do
errors=$(pylint --max-line-length=120 $file | wc -l)
if [[ $errors -gt 1 ]]; then
total_errors=$((total_errors + errors - 1))
fi
done

if [[ $total_errors -gt 0 ]]; then
echo "Too many errors ($total_errors), failing the build."
exit 1
else
echo "Acceptable number of errors ($total_errors)."
fi
43 changes: 43 additions & 0 deletions .github/workflows/python_unittest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Python Unit Test

on:
push:
branches:
- master
pull_request:
branches:
- master

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v2

- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11'

- name: Install dependencies
run: |
pip install -r tools/sensors_data_display_api/requirements.txt
python3 -m pip install coverage

- name: Run unit tests
run: |
cd tools/sensors_data_display_api/tests/
coverage run -m unittest discover -s . -v
- name: Check Code Coverage
run: |
cd tools/sensors_data_display_api/tests/
coverage_report=$(coverage report -m)
total_coverage=$(echo "$coverage_report" | grep "TOTAL" | awk '{print $NF}' | tr -d '%') # Usuwanie procentu
echo "Całkowita procentowa pokrywalność kodu: $total_coverage%"
if [ $total_coverage -lt 75 ]; then
echo "Zbyt małe pokrycie kodu"
exit 1
fi
shell: bash
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
bazel-*
.vscode
.pyc
__pycache__
.coverage
MODULE.bazel.lock
18 changes: 18 additions & 0 deletions tools/pylint/pylint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash

py_files=$(find tools -name "*.py")
total_errors=0

for file in $py_files; do
errors=$(pylint --max-line-length=120 $file | wc -l)
if [[ $errors -gt 1 ]]; then
total_errors=$((total_errors + errors - 1))
fi
done

if [[ $total_errors -gt 0 ]]; then
echo "Too many errors ($total_errors), failing the build."
exit 1
else
echo "Acceptable number of errors ($total_errors)."
fi
230 changes: 230 additions & 0 deletions tools/sensors_data_display_api/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
import csv
import datetime
import threading
import time
import tkinter as tk
from tkinter import messagebox
import logging

from data import Data
from data_reader import DataReader
from data_sender import DataSender


class App(tk.Tk):
def __init__(self):
super().__init__()

# set properties of the window
self.title("Engine")
self.window_width = 600
self.window_height = 600
self.screen_width = self.winfo_screenwidth()
self.screen_height = self.winfo_screenheight()
self.padding = 5

center_x = int(self.screen_width / 2 - self.window_width / 2)
center_y = int(self.screen_height / 2 - self.window_height / 2)

self.geometry(f'{self.window_width}x{self.window_height}+{center_x}+{center_y}')
# self.configure(background='#B9B4C7')

# variables
label_width = 20
button_padding = 2
self.stop_reading = False
self.saving = False
self.data_reader_thread = None
self.saving_thread = None
self.data_to_save = Data()
self.collection_time = 10

# measurements
temperature_up_frame = tk.Frame(self)
temperature_up_label = tk.Label(temperature_up_frame, text='Temperature up:', width=label_width)
self.temperature_up = tk.Label(temperature_up_frame, text='0', width=label_width)
self.temperature_up.config(state=tk.DISABLED)

temperature_down_frame = tk.Frame(self)
temperature_down_label = tk.Label(temperature_down_frame, text='Temperature down:', width=label_width)
self.temperature_down = tk.Label(temperature_down_frame, text='0', width=label_width)
self.temperature_down.config(state=tk.DISABLED)

temperature_middle_frame = tk.Frame(self)
temperature_middle_label = tk.Label(temperature_middle_frame, text='Temperature middle:', width=label_width)
self.temperature_middle = tk.Label(temperature_middle_frame, width=label_width, text='0')
self.temperature_middle.config(state=tk.DISABLED)

tank_pressure_frame = tk.Frame(self)
tank_pressure_label = tk.Label(tank_pressure_frame, text='Tank pressure', width=label_width)
self.tank_pressure = tk.Label(tank_pressure_frame, width=label_width, text='0')
self.tank_pressure.config(state=tk.DISABLED)

jet_pressure_frame = tk.Frame(self)
jet_pressure_label = tk.Label(jet_pressure_frame, text='Jet pressure', width=label_width)
self.jet_pressure = tk.Label(jet_pressure_frame, width=label_width, text='0')
self.jet_pressure.config(state=tk.DISABLED)

pressure_difference_frame = tk.Frame(self)
pressure_difference_label = tk.Label(pressure_difference_frame, text='Pressure difference:', width=label_width)
self.pressure_difference = tk.Label(pressure_difference_frame, width=label_width, text='0')
self.pressure_difference.config(state=tk.DISABLED)

main_valve_frame = tk.Frame(self)
main_valve_label = tk.Label(main_valve_frame, text='Main valve:', width=label_width)
self.main_valve = tk.Label(main_valve_frame, width=label_width, text='not given')
self.main_valve.config(state=tk.DISABLED)

vent_frame = tk.Frame(self)
vent_label = tk.Label(vent_frame, text='Vent:', width=label_width)
self.vent = tk.Label(vent_frame, width=label_width, text='not given')
self.vent.config(state=tk.DISABLED)

# buttons
start_stop_saving_button_frame = tk.Frame(self)
self.start_saving_button = tk.Button(start_stop_saving_button_frame, text="Start saving data", command=lambda: self.start_save_to_file())
self.stop_saving_button = tk.Button(start_stop_saving_button_frame, text="Stop saving data", command=lambda: self.stop_save_to_file())

main_valve_button_frame = tk.Frame(self)
main_valve_set_1_button = tk.Button(main_valve_button_frame, text="Main valve: set 1", command=lambda: self.set_main_valve(value=1))
main_valve_set_0_button = tk.Button(main_valve_button_frame, text="Main valve: set 0", command=lambda: self.set_main_valve(value=0))

vent_button_frame = tk.Frame(self)
vent_set_1_button = tk.Button(vent_button_frame, text="Vent: set 1", command=lambda: self.set_vent(self, value=1))
vent_set_0_button = tk.Button(vent_button_frame, text="Vent: set 0", command=lambda: self.set_vent(self, value=0))

launch_rocket_button_frame = tk.Frame(self)
launch_rocket_button = tk.Button(launch_rocket_button_frame, text="Launch rocket", command=lambda: self.launch_rocket(value=1))
stop_launch_rocket_button = tk.Button(launch_rocket_button_frame, text="Stop launch rocket", command=lambda: self.launch_rocket(value=0))

exit_button = tk.Button(self, text="Exit", command=lambda: self.exit())

# pack on screen
# pack measurements
temperature_up_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
temperature_up_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.temperature_up.pack(side=tk.LEFT, pady=self.padding, fill='both')

temperature_middle_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
temperature_middle_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.temperature_middle.pack(side=tk.LEFT, pady=self.padding, fill='both')

temperature_down_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
temperature_down_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.temperature_down.pack(side=tk.LEFT, pady=self.padding, fill='both')

tank_pressure_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
tank_pressure_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.tank_pressure.pack(side=tk.LEFT, pady=self.padding, fill='both')

jet_pressure_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
jet_pressure_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.jet_pressure.pack(side=tk.LEFT, pady=self.padding, fill='both')

pressure_difference_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
pressure_difference_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.pressure_difference.pack(side=tk.LEFT, pady=self.padding, fill='both')

main_valve_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
main_valve_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.main_valve.pack(side=tk.LEFT, pady=self.padding, fill='both')

vent_frame.pack(side=tk.TOP, pady=self.padding, fill='both')
vent_label.pack(side=tk.LEFT, pady=self.padding, fill='both')
self.vent.pack(side=tk.LEFT, pady=self.padding, fill='both')

# pack buttons
main_valve_button_frame.pack(side=tk.TOP, pady=button_padding, fill='both')
main_valve_set_1_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)
main_valve_set_0_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)

vent_button_frame.pack(side=tk.TOP, pady=button_padding, fill='both')
vent_set_1_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)
vent_set_0_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)

start_stop_saving_button_frame.pack(side=tk.TOP, pady=button_padding, fill='both')
self.start_saving_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)
self.stop_saving_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)
self.stop_saving_button.config(state=tk.DISABLED)

launch_rocket_button_frame.pack(side=tk.TOP, pady=button_padding, fill='both')
launch_rocket_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)
stop_launch_rocket_button.pack(side=tk.LEFT, pady=button_padding, fill='both', expand=True)

exit_button.pack(side=tk.TOP, fill='both')

self.data_reader = DataReader(gui=self)
self.read_data()

# initiate variable sender
self.data_sender = DataSender(self.data_reader.ip, self.data_reader.port)

def read_data(self):
self.data_reader_thread = threading.Thread(target=self.data_reader.read_data, daemon=True)
self.data_reader_thread.start()

def start_save_to_file(self):
self.saving = True
self.start_saving_button.config(state=tk.DISABLED)
self.stop_saving_button.config(state=tk.NORMAL)
self.saving_thread = threading.Thread(target=self._save_to_file, daemon=True)
self.saving_thread.start()

def stop_save_to_file(self):
self.saving = False
self.start_saving_button.config(state=tk.NORMAL)
self.stop_saving_button.config(state=tk.DISABLED)
self.saving_thread.join()

def _save_to_file(self):
timestamp = datetime.datetime.now()
filename = f"data_{timestamp.hour}_{timestamp.minute}_{timestamp.second}.csv"
with open(file=filename, mode='w', encoding='UTF-8') as csvFile:
writer = csv.writer(csvFile, delimiter=",")
writer.writerow(['TIMESTAMP', 'TEMPERATURE_UP', 'TEMPERATURE_DOWN', 'TEMPERATURE_MIDDLE', 'TANK_PRESSURE', 'JET_PRESSURE', 'PRESSURE_DIFFERENCE', 'MAIN_VALVE', 'VENT'])
start = time.time()
while self.saving:
logging.info("SAVING....")
collection_time_difference = time.time() - start
logging.info(f"Collection time difference: {collection_time_difference}")
if (self.data_to_save.is_none() is False) or collection_time_difference > self.collection_time:
logging.info("SAVED")
timestamp = datetime.datetime.now()
start = time.time()
with open(filename, 'a', encoding='UTF-8', newline='') as csvFile:
writer = csv.writer(csvFile, delimiter=",")
writer.writerow([timestamp, self.data_to_save.temperature_up, self.data_to_save.temperature_down, self.data_to_save.temperature_middle,
self.data_to_save.tank_pressure, self.data_to_save.jet_pressure, self.data_to_save.pressure_difference,
self.data_to_save.main_valve, self.data_to_save.vent])
self.data_to_save.temperature_up = None
self.data_to_save.temperature_down = None
self.data_to_save.temperature_middle = None
self.data_to_save.tank_pressure = None
self.data_to_save.jet_pressure = None
self.data_to_save.pressure_difference = None
self.data_to_save.main_valve = None
self.data_to_save.vent = None
else:
logging.info("NOT SAVED")

def launch_rocket(self, value):
req_method="PC_APP/EngineStart"
if value == 1:
result = messagebox.askyesno('Launch rocket', 'Are you sure you want to launch rocket?')
if result:
self.data_sender.send_data(value=value, method_id=self.get_method_id(req_method), service_id=self.get_service_id(req_method))
else:
self.data_sender.send_data(value=value, method_id=self.get_method_id(req_method), service_id=self.get_service_id(req_method))

def set_main_valve(self, value):
req_method="PC_APP/setServoValue"
self.data_sender.send_data(value=value, method_id=self.get_method_id(req_method), service_id=self.get_service_id(req_method))

def set_vent(self, value):
req_method="PC_APP/setVentValue"
self.data_sender.send_data(value=value, method_id=self.get_method_id(req_method), service_id=self.get_service_id(req_method))

def exit(self):
self.stop_reading = True
self.saving = False
self.destroy()
16 changes: 16 additions & 0 deletions tools/sensors_data_display_api/data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class Data:
def __init__(self):
self.temperature_up: float = None
self.temperature_middle: float = None
self.temperature_down: float = None
self.tank_pressure: float = None
self.pressure_difference: float = None
self.main_valve: int = None
# not given as for now
self.jet_pressure: float = None
self.vent: int = None

def is_none(self):
if self.temperature_up is None or self.temperature_middle is None or self.temperature_down is None or self.tank_pressure is None or self.main_valve is None or self.pressure_difference is None:
return True
return False
Loading
Loading