-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
241 lines (196 loc) · 9.93 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
import sys
from PySide6 import QtWidgets
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QFileDialog, QMessageBox, QDoubleSpinBox, QTextEdit, QRadioButton
# Fungsi untuk menangani output terminal
def Terminal(terminal_output, message):
terminal_output.append(message)
terminal_output.ensureCursorVisible()
class SensorShm:
@staticmethod
def get_position():
# Kembalikan data posisi sebagai list atau tuple
return [0.5, 1.0, -1.5] # Ganti dengan data nyata
class ActuatorShm:
@staticmethod
def get_hardness():
# Kembalikan data kekerasan sebagai list atau tuple
return [0.9, 0.8, 1.0] # Ganti dengan data nyata
# Kelas untuk menangani data Servo
class Servo:
def __init__(self):
self.angles = []
self.stiffnesses = []
self.time_exec = []
def update_angle(self, index, value):
if index < len(self.angles):
self.angles[index] = value
else:
self.angles.append(value)
def update_stiffness(self, index, value):
if index < len(self.stiffnesses):
self.stiffnesses[index] = value
else:
self.stiffnesses.append(value)
def update_time_exec(self, value):
self.time_exec = [value] # Karena hanya ada satu nilai untuk waktu eksekusi
def get_angles(self):
return self.angles
def get_stiffnesses(self):
return self.stiffnesses
def get_time_exec(self):
return self.time_exec
# Kelas untuk menangani Radio Button
class RadioButtonHandler:
def __init__(self, window):
self.window = window
self.free_move_radio_button = self.window.findChild(QRadioButton, "freeMoveRadioButton")
self.motion_radio_button = self.window.findChild(QRadioButton, "motionRadioButton")
# Set 'freeMoveRadioButton' sebagai pilihan default
self.free_move_radio_button.setChecked(True)
# Hubungkan sinyal toggled ke fungsi handler, menggunakan lambda
self.free_move_radio_button.toggled.connect(
lambda: self.radio_button_toggled(self.free_move_radio_button))
self.motion_radio_button.toggled.connect(
lambda: self.radio_button_toggled(self.motion_radio_button))
def radio_button_toggled(self, button):
if button.isChecked(): # Mengakses langsung radio button
if button == self.free_move_radio_button:
print("Free Move Mode selected")
Terminal(self.terminal_output, "Free Move Mode selected")
elif button == self.motion_radio_button:
print("Motion Mode selected")
Terminal(self.terminal_output, "Motion Mode selected")
# Kelas untuk menangani Button
class ButtonHandler:
def __init__(self, window):
self.window = window
self.window.loadButton.clicked.connect(self.openFile)
self.window.saveButton.clicked.connect(self.saveFile)
def openFile(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(self.window, "Open Lua File", "", "Lua Files (*.lua)", options=options)
if file_name:
QMessageBox.information(self.window, "File Selected", f"You selected: {file_name}")
else:
QMessageBox.warning(self.window, "No File Selected", "No file was selected.")
def saveFile(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getSaveFileName(self.window, "Save Lua File", "", "Lua Files (*.lua)", options=options)
if file_name:
QMessageBox.information(self.window, "File Saved", f"File has been saved: {file_name}")
else:
QMessageBox.warning(self.window, "No File Saved", "The file was not saved.")
# Kelas untuk menangani SpinBox
class SpinBoxHandler:
def __init__(self, window, terminal_output, servo):
self.window = window
self.servo = servo # Menyimpan referensi ke instance Servo
self.terminal_output = terminal_output # Menyimpan referensi ke output terminal
self.angle_object_names = [
"RShoulderPitchAngle", "LShoulderPitchAngle", "RShoulderRollAngle", "LShoulderRollAngle",
"RElbowYawAngle", "LElbowYawAngle", "RHipYawAngle", "LHipYawAngle", "RHipRollAngle",
"LHipRollAngle", "RHipPitchAngle", "LHipPitchAngle", "RKneePitchAngle", "LKneePitchAngle",
"RAnklePitchAngle", "LAnklePitchAngle", "RAnkleRollAngle", "LAnkleRollAngle",
"HeadYawAngle", "HeadPitchAngle"
]
self.stiffness_object_names = [
"RShoulderPitchStiffness", "LShoulderPitchStiffness", "RShoulderRollStiffness", "LShoulderRollStiffness",
"RElbowYawStiffness", "LElbowYawStiffness", "RHipYawStiffness", "LHipYawStiffness",
"RHipRollStiffness", "LHipRollStiffness", "RHipPitchStiffness", "LHipPitchStiffness",
"RKneePitchStiffness", "LKneePitchStiffness", "RAnklePitchStiffness", "LAnklePitchStiffness",
"RAnkleRollStiffness", "LAnkleRollStiffness", "HeadYawStiffness", "HeadPitchStiffness"
]
self.exec_time_object_name = "ExecTime"
self.initialize_spinboxes()
def initialize_spinboxes(self):
position_data = SensorShm.get_position()
hardness_data = ActuatorShm.get_hardness()
# Loop untuk menginisialisasi QDoubleSpinBox berdasarkan angle_object_names
for index, object_name in enumerate(self.angle_object_names):
angle_spinbox = self.window.findChild(QDoubleSpinBox, object_name)
if angle_spinbox:
angle_spinbox.setRange(-360.0, 360.0)
angle_spinbox.setSingleStep(1.0)
#angle_spinbox.setValue(100.0)
if index < len(position_data):
angle_value = position_data[index] * 180 / 3.14159 # Konversi dari radian ke derajat
angle_spinbox.setValue(angle_value)
self.servo.update_angle(index, angle_value)
angle_spinbox.valueChanged.connect(
lambda value, name=object_name, idx=index: (
self.servo.update_angle(idx, value),
print(f"{name} angle changed to {value}"),
Terminal(self.terminal_output, f"{name} angle changed to {value}")
)
)
else:
print(f"Angle spinbox {object_name} not found!")
# Loop untuk menginisialisasi QDoubleSpinBox berdasarkan stiffness_object_names
for index, object_name in enumerate(self.stiffness_object_names):
stiffness_spinbox = self.window.findChild(QDoubleSpinBox, object_name)
if stiffness_spinbox:
stiffness_spinbox.setRange(0.0, 1.0)
stiffness_spinbox.setSingleStep(0.1)
#stiffness_spinbox.setValue(1.0)
if index < len(hardness_data):
stiffness_value = hardness_data[index]
stiffness_spinbox.setValue(stiffness_value)
self.servo.update_stiffness(index, stiffness_value)
stiffness_spinbox.valueChanged.connect(
lambda value, name=object_name, idx=index: (
self.servo.update_stiffness(idx, value),
print(f"{name} stiffness changed to {value}"),
Terminal(self.terminal_output, f"{name} stiffness changed to {value}")
)
)
else:
print(f"Stiffness spinbox {object_name} not found!")
# Inisialisasi QDoubleSpinBox untuk ExecTime
exec_time_spinbox = self.window.findChild(QDoubleSpinBox, self.exec_time_object_name)
if exec_time_spinbox:
exec_time_spinbox.setRange(0.0, 20.0)
exec_time_spinbox.setSingleStep(0.1)
exec_time_spinbox.setValue(5.0)
self.servo.update_time_exec(exec_time_spinbox.value())
exec_time_spinbox.valueChanged.connect(
lambda value: (
self.servo.update_time_exec(value),
print(f"ExecTime changed to {value}"),
Terminal(self.terminal_output, f"ExecTime changed to {value}")
)
)
else:
print(f"ExecTime spinbox {self.exec_time_object_name} not found!")
# Cetak nilai servo saat inisialisasi
self.print_servo_values()
# Metode untuk mencetak nilai servo ke terminal
def print_servo_values(self):
print("Servo Angle Values :", self.servo.get_angles())
print("Servo Stiffness Values :", self.servo.get_stiffnesses())
print("Servo Execution Time :", self.servo.get_time_exec())
Terminal(self.terminal_output, f"Servo Angle Values : {self.servo.get_angles()}")
Terminal(self.terminal_output, f"Servo Stiffness Values : {self.servo.get_stiffnesses()}")
Terminal(self.terminal_output, f"Servo Execution Time : {self.servo.get_time_exec()}")
# Kelas utama untuk menginisialisasi aplikasi
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
# Memuat file .ui
loader = QUiLoader()
self.window = loader.load("tunning.ui", None)
self.window.setWindowTitle("All In One Barelang FC")
# Ambil TextEdit untuk terminal output
terminal_output = self.window.findChild(QTextEdit, "TerminalOutput")
# Buat instance dari Servo
self.servo = Servo()
# Buat instance dari handler class
self.radio_button_handler = RadioButtonHandler(self.window)
self.button_handler = ButtonHandler(self.window)
self.spinbox_handler = SpinBoxHandler(self.window, terminal_output, self.servo)
# Tampilkan jendela
self.window.show()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = MainWindow() # Membuat instance dari kelas MainWindow
sys.exit(app.exec())