aboutsummaryrefslogtreecommitdiffstats
path: root/examples/serialbus/can/receivedframesmodel.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/serialbus/can/receivedframesmodel.py')
-rw-r--r--examples/serialbus/can/receivedframesmodel.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/examples/serialbus/can/receivedframesmodel.py b/examples/serialbus/can/receivedframesmodel.py
new file mode 100644
index 000000000..7953f3750
--- /dev/null
+++ b/examples/serialbus/can/receivedframesmodel.py
@@ -0,0 +1,142 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from enum import IntEnum
+
+from PySide6.QtCore import QAbstractTableModel, QModelIndex, QSize, Qt
+
+
+class ReceivedFramesModelColumns(IntEnum):
+ number = 0
+ timestamp = 1
+ flags = 2
+ can_id = 3
+ DLC = 4
+ data = 5
+ count = 6
+
+
+clipboard_text_role = Qt.UserRole + 1
+
+
+column_alignment = [Qt.AlignRight | Qt.AlignVCenter, Qt.AlignRight | Qt.AlignVCenter,
+ Qt.AlignCenter, Qt.AlignRight | Qt.AlignVCenter,
+ Qt.AlignRight | Qt.AlignVCenter, Qt.AlignLeft | Qt.AlignVCenter]
+
+
+class ReceivedFramesModel(QAbstractTableModel):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_framesQueue = [] # QQueue()
+ self.m_framesAccumulator = []
+ self.m_queueLimit = 0
+
+ def remove_rows(self, row, count, parent):
+ self.beginRemoveRows(parent, row, row + count - 1)
+ self.m_framesQueue = self.m_framesQueue[0:row] + self.m_framesQueue[row + count:]
+ self.endRemoveRows()
+ return True
+
+ def headerData(self, section, orientation, role):
+ if role == Qt.DisplayRole and orientation == Qt.Horizontal:
+ if section == ReceivedFramesModelColumns.number:
+ return "#"
+ if section == ReceivedFramesModelColumns.timestamp:
+ return "Timestamp"
+ if section == ReceivedFramesModelColumns.flags:
+ return "Flags"
+ if section == ReceivedFramesModelColumns.can_id:
+ return "CAN-ID"
+ if section == ReceivedFramesModelColumns.DLC:
+ return "DLC"
+ if section == ReceivedFramesModelColumns.data:
+ return "Data"
+
+ if role == Qt.SizeHintRole and orientation == Qt.Horizontal:
+ if section == ReceivedFramesModelColumns.number:
+ return QSize(80, 25)
+ if section == ReceivedFramesModelColumns.timestamp:
+ return QSize(130, 25)
+ if section == ReceivedFramesModelColumns.flags:
+ return QSize(25, 25)
+ if section == ReceivedFramesModelColumns.can_id:
+ return QSize(50, 25)
+ if section == ReceivedFramesModelColumns.DLC:
+ return QSize(25, 25)
+ if section == ReceivedFramesModelColumns.data:
+ return QSize(200, 25)
+ return None
+
+ def data(self, index, role):
+ if not self.m_framesQueue:
+ return None
+ row = index.row()
+ column = index.column()
+ if role == Qt.TextAlignmentRole:
+ return column_alignment[index.column()]
+ if role == Qt.DisplayRole:
+ return self.m_framesQueue[row][column]
+ if role == clipboard_text_role:
+ f = self.m_framesQueue[row][column]
+ return f"[{f}]" if column == ReceivedFramesModelColumns.DLC else f
+ return None
+
+ def rowCount(self, parent=QModelIndex()):
+ return 0 if parent.isValid() else len(self.m_framesQueue)
+
+ def columnCount(self, parent=QModelIndex()):
+ return 0 if parent.isValid() else ReceivedFramesModelColumns.count
+
+ def append_frames(self, slvector):
+ self.m_framesAccumulator.extend(slvector)
+
+ def need_update(self):
+ return self.m_framesAccumulator
+
+ def update(self):
+ if not self.m_framesAccumulator:
+ return
+
+ if self.m_queueLimit:
+ self.append_frames_ring_buffer(self.m_framesAccumulator)
+ else:
+ self.append_frames_unlimited(self.m_framesAccumulator)
+ self.m_framesAccumulator.clear()
+
+ def append_frames_ring_buffer(self, slvector):
+ slvector_len = len(slvector)
+ row_count = self.rowCount()
+ if self.m_queueLimit <= row_count + slvector_len:
+ if slvector_len < self.m_queueLimit:
+ self.remove_rows(0, row_count + slvector_len - self.m_queueLimit + 1)
+ else:
+ self.clear()
+
+ self.beginInsertRows(QModelIndex(), row_count, row_count + slvector_len - 1)
+ if slvector_len < self.m_queueLimit:
+ self.m_framesQueue.extend(slvector)
+ else:
+ self.m_framesQueue.extend(slvector[slvector_len - self.m_queueLimit:])
+ self.endInsertRows()
+
+ def append_frame(self, slist):
+ self.append_frames([slist])
+
+ def append_frames_unlimited(self, slvector):
+ row_count = self.rowCount()
+ self.beginInsertRows(QModelIndex(), row_count, row_count + len(slvector) - 1)
+ self.m_framesQueue.extend(slvector)
+ self.endInsertRows()
+
+ def clear(self):
+ if self.m_framesQueue:
+ self.beginResetModel()
+ self.m_framesQueue.clear()
+ self.endResetModel()
+
+ def set_queue_limit(self, limit):
+ self.m_queueLimit = limit
+ frame_queue_len = len(self.m_framesQueue)
+ if limit and frame_queue_len > limit:
+ self.remove_rows(0, frame_queue_len - limit)