-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathEcuZoneComboBox.py
130 lines (108 loc) · 4.38 KB
/
EcuZoneComboBox.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
"""
EcuZoneComboBox.py
Copyright (C) 2024 - 2025 Marc Postema (mpostema09 -at- gmail.com)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Or, point your browser to http://www.gnu.org/copyleft/gpl.html
"""
from PySide6.QtGui import QKeyEvent
from PySide6.QtCore import Qt, QEvent
from PySide6.QtWidgets import QComboBox
class EcuZoneComboBox(QComboBox):
"""
"""
value = 0
zoneObject = {}
itemReadOnly = False
def __init__(self, parent, zoneObject: dict, readOnly: bool):
super(EcuZoneComboBox, self).__init__(parent)
self.setStyleSheet("combobox-popup: 3;")
self.setFocusPolicy(Qt.StrongFocus)
self.itemReadOnly = readOnly
self.zoneObject = zoneObject
# Fill Combo Box
for paramObject in self.zoneObject["params"]:
if "mask" in paramObject:
self.addItem(paramObject["name"], int(paramObject["mask"], 2))
else:
self.addItem(paramObject["name"], int(paramObject["value"], 16))
self.setCurrentIndex(0)
def event(self, event: QEvent):
if event.type() == QEvent.KeyPress:
keyEvent = QKeyEvent(event)
# When ESC -> Clear focus
if keyEvent.key() == Qt.Key_Escape:
# @TODO: Maybe give option to undo changes?
self.clearFocus()
return True
return super().event(event)
# Prevent scrolling without focus
def wheelEvent(self, e):
if self.hasFocus():
super().wheelEvent(e);
def getCorrespondingByte(self):
return self.zoneObject["byte"]
def getCorrespondingByteSize(self):
bits = int(self.zoneObject["mask"], 2).bit_count()
if bits > 8 and bits < 16:
return 2
elif bits > 16 and bits < 32:
return 4
return 1
def setCurrentIndex(self, val):
self.value = val;
super().setCurrentIndex(val)
def isComboBoxChanged(self, virginWrite: bool()):
return self.isEnabled() and not(self.itemReadOnly) and self.value != self.currentIndex()
def getValuesAsCSV(self):
value = "Disabled"
if self.isEnabled():
index = self.currentIndex()
value = "%0.2X" % self.itemData(index)
return value
def getZoneAndHex(self, virginWrite: bool()):
value = "None"
if self.isComboBoxChanged(virginWrite):
index = self.currentIndex()
value = "%0.2X" % self.itemData(index)
return value
def update(self, byte: str):
index = self.currentIndex()
mask = int(self.zoneObject["mask"], 2)
value = (int(byte, 16) & ~mask) | self.itemData(index)
size = self.getCorrespondingByteSize() * 2
byte = f"%0.{size}X" % value
return byte
def changeZoneOption(self, data: str, valueType: str):
byte = int(data, 16)
if "mask" in self.zoneObject:
byteData = []
for i in range(0, len(data), 2):
byteData.append(data[i:i + 2])
byteNr = self.zoneObject["byte"]
mask = int(self.zoneObject["mask"], 2)
size = self.getCorrespondingByteSize()
currByteData = byteData[byteNr : byteNr + size]
currData = ""
for i in range(len(currByteData)):
currData += currByteData[i]
if (byteNr + size) <= len(byteData):
byte = int(currData, 16) & mask
else:
# Integrity wrong, size does not match
return False
# Find the Option (byte) from the ComboBox
for i in range(self.count()):
if self.itemData(i) == byte:
self.setCurrentIndex(i)
break
return True