1 #include "utility.h"
2 #include "filterutility.h"
3 #include "dbc/dbchandler.h"
4 #include <QSettings>
5 
getIdAsInt(QListWidgetItem * item)6 uint32_t FilterUtility::getIdAsInt( QListWidgetItem * item )
7 {
8     return Utility::ParseStringToNum(getId(item));
9 }
10 
getId(QString itemText)11 QString FilterUtility::getId( QString itemText )
12 {
13     if (itemText.contains(" "))
14         // Strip away the filter label
15         return itemText.left(itemText.indexOf(" "));
16     else
17         return itemText;
18 }
19 
getId(QListWidgetItem * item)20 QString FilterUtility::getId( QListWidgetItem * item )
21 {
22     return getId(item->text());
23 }
24 
getGMLanArbitrationId(int32_t id)25 uint32_t FilterUtility::getGMLanArbitrationId(int32_t id)
26 {
27     return (id  >> 13) & 0x1FFF;
28 }
29 
getGMLanPriorityBits(int32_t id)30 uint32_t FilterUtility::getGMLanPriorityBits(int32_t id)
31 {
32     return (id  >> 26) & 0x7;
33 }
34 
getGMLanSenderId(int32_t id)35 uint32_t FilterUtility::getGMLanSenderId(int32_t id)
36 {
37     return id & 0x1FFF;
38 }
39 
createCheckableFilterItem(uint32_t id,bool checked,QListWidget * parent)40 QListWidgetItem * FilterUtility::createCheckableFilterItem(uint32_t id, bool checked, QListWidget* parent)
41 {
42     QListWidgetItem * thisItem = createFilterItem(id,parent);
43     thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable);
44     if (checked)
45         thisItem->setCheckState(Qt::Checked);
46     else
47         thisItem->setCheckState(Qt::Unchecked);
48     return thisItem;
49 }
50 
createCheckableBusFilterItem(uint32_t id,bool checked,QListWidget * parent)51 QListWidgetItem * FilterUtility::createCheckableBusFilterItem(uint32_t id, bool checked, QListWidget* parent)
52 {
53     QListWidgetItem * thisItem = createBusFilterItem(id,parent);
54     thisItem->setFlags(thisItem->flags() | Qt::ItemIsUserCheckable);
55     if (checked)
56         thisItem->setCheckState(Qt::Checked);
57     else
58         thisItem->setCheckState(Qt::Unchecked);
59     return thisItem;
60 }
61 
62 
createFilterItem(uint32_t id,QListWidget * parent)63 QListWidgetItem * FilterUtility::createFilterItem(uint32_t id, QListWidget* parent)
64 {
65     QSettings settings;
66     DBCHandler * dbcHandler = DBCHandler::getReference();
67     QListWidgetItem *thisItem = new QListWidgetItem(parent);
68     QString filterItemName = Utility::formatCANID(id);
69 
70     //Note, there are multiple filter labeling preferences. There is one in main settings to globally
71     //enable or disable them all. Then each loaded DBC file also can be selected on/off
72     //Both must be enabled for you to see labeling.
73     if (settings.value("Main/FilterLabeling", false).toBool())
74     {
75         // Filter labeling (show interpreted frame names next to the CAN addr ID)
76         MatchingCriteria_t matchingCriteria;
77         DBC_MESSAGE *msg = dbcHandler->findMessageForFilter(id,&matchingCriteria);
78         if (msg != nullptr)
79         {
80             filterItemName.append(" ");
81             filterItemName.append(msg->name);
82 
83             // Create tooltip to show the whole name just in case it's too long to fit in the filter window.
84             // Also if the matching criteria is set to GMLAN, show the Arbitration ID as well
85             QString tooltip;
86             if (matchingCriteria == GMLAN)
87                 tooltip.append("0x" + QString::number(FilterUtility::getGMLanArbitrationId(id), 16).toUpper().rightJustified(4,'0') + ": ");
88             tooltip.append(msg->name);
89             thisItem->setToolTip(tooltip);
90         }
91     }
92 
93     thisItem->setText(filterItemName);
94     return thisItem;
95 }
96 
createBusFilterItem(uint32_t id,QListWidget * parent)97 QListWidgetItem * FilterUtility::createBusFilterItem(uint32_t id, QListWidget* parent)
98 {
99     QSettings settings;
100     DBCHandler * dbcHandler = DBCHandler::getReference();
101     QListWidgetItem *thisItem = new QListWidgetItem(parent);
102     QString filterItemName = QStringLiteral("%1").arg(id);
103 
104     if (settings.value("Main/FilterLabeling", false).toBool())
105     {
106         // Filter labeling (show interpreted frame names next to the CAN addr ID)
107         MatchingCriteria_t matchingCriteria;
108         DBC_MESSAGE *msg = dbcHandler->findMessageForFilter(id,&matchingCriteria);
109         if (msg != NULL)
110         {
111             filterItemName.append(" ");
112             filterItemName.append(msg->name);
113         }
114     }
115 
116     thisItem->setText(filterItemName);
117     return thisItem;
118 }
119