Features
Sample Protocol completed - can be used as a template while implementing a new protocol
This commit is contained in:
parent
3602d24767
commit
c9563b50eb
@ -88,7 +88,7 @@ public:
|
|||||||
quint32 payloadProtocolId(ProtocolIdType type) const;
|
quint32 payloadProtocolId(ProtocolIdType type) const;
|
||||||
|
|
||||||
virtual int fieldCount() const;
|
virtual int fieldCount() const;
|
||||||
virtual int metaFieldCount() const;
|
int metaFieldCount() const;
|
||||||
int frameFieldCount() const;
|
int frameFieldCount() const;
|
||||||
|
|
||||||
virtual FieldFlags fieldFlags(int index) const;
|
virtual FieldFlags fieldFlags(int index) const;
|
||||||
|
@ -13,7 +13,8 @@ FORMS += \
|
|||||||
vlan.ui \
|
vlan.ui \
|
||||||
ip4.ui \
|
ip4.ui \
|
||||||
tcp.ui \
|
tcp.ui \
|
||||||
udp.ui
|
udp.ui \
|
||||||
|
sample.ui
|
||||||
PROTOS += \
|
PROTOS += \
|
||||||
protocol.proto \
|
protocol.proto \
|
||||||
mac.proto \
|
mac.proto \
|
||||||
@ -29,7 +30,8 @@ PROTOS += \
|
|||||||
vlanstack.proto \
|
vlanstack.proto \
|
||||||
ip4.proto \
|
ip4.proto \
|
||||||
tcp.proto \
|
tcp.proto \
|
||||||
udp.proto
|
udp.proto \
|
||||||
|
sample.proto
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
abstractprotocol.h \
|
abstractprotocol.h \
|
||||||
comboprotocol.h \
|
comboprotocol.h \
|
||||||
@ -50,7 +52,8 @@ HEADERS += \
|
|||||||
vlanstack.h \
|
vlanstack.h \
|
||||||
ip4.h \
|
ip4.h \
|
||||||
tcp.h \
|
tcp.h \
|
||||||
udp.h
|
udp.h \
|
||||||
|
sample.h
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
abstractprotocol.cpp \
|
abstractprotocol.cpp \
|
||||||
protocolmanager.cpp \
|
protocolmanager.cpp \
|
||||||
@ -67,7 +70,8 @@ SOURCES += \
|
|||||||
svlan.cpp \
|
svlan.cpp \
|
||||||
ip4.cpp \
|
ip4.cpp \
|
||||||
tcp.cpp \
|
tcp.cpp \
|
||||||
udp.cpp
|
udp.cpp \
|
||||||
|
sample.cpp
|
||||||
|
|
||||||
protobuf_decl.name = protobuf header
|
protobuf_decl.name = protobuf header
|
||||||
protobuf_decl.input = PROTOS
|
protobuf_decl.input = PROTOS
|
||||||
|
@ -70,6 +70,7 @@ message Protocol {
|
|||||||
enum k {
|
enum k {
|
||||||
kMacFieldNumber = 51;
|
kMacFieldNumber = 51;
|
||||||
kPayloadFieldNumber = 52;
|
kPayloadFieldNumber = 52;
|
||||||
|
kSampleFieldNumber = 53;
|
||||||
|
|
||||||
kEth2FieldNumber = 121;
|
kEth2FieldNumber = 121;
|
||||||
kDot3FieldNumber = 122;
|
kDot3FieldNumber = 122;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include "abstractprotocol.h"
|
#include "abstractprotocol.h"
|
||||||
|
|
||||||
#include "protocol.pb.h"
|
#include "protocol.pb.h"
|
||||||
|
#include "sample.h"
|
||||||
#include "mac.h"
|
#include "mac.h"
|
||||||
#include "payload.h"
|
#include "payload.h"
|
||||||
#include "eth2.h"
|
#include "eth2.h"
|
||||||
@ -52,6 +53,9 @@ ProtocolManager::ProtocolManager()
|
|||||||
registerProtocol(OstProto::Protocol::kUdpFieldNumber,
|
registerProtocol(OstProto::Protocol::kUdpFieldNumber,
|
||||||
(void*) UdpProtocol::createInstance);
|
(void*) UdpProtocol::createInstance);
|
||||||
|
|
||||||
|
registerProtocol(OstProto::Protocol::kSampleFieldNumber,
|
||||||
|
(void*) SampleProtocol::createInstance);
|
||||||
|
|
||||||
populateNeighbourProtocols();
|
populateNeighbourProtocols();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,19 +1,14 @@
|
|||||||
#include <qendian.h>
|
#include <qendian.h>
|
||||||
#include <QHostAddress>
|
|
||||||
|
|
||||||
#include "sample.h"
|
#include "sample.h"
|
||||||
|
|
||||||
/*! \todo (MED) Complete the "sample" protocol and make it compilable so that
|
|
||||||
it can be used as an example for new protocols
|
|
||||||
*/
|
|
||||||
|
|
||||||
SampleConfigForm::SampleConfigForm(QWidget *parent)
|
SampleConfigForm::SampleConfigForm(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
{
|
{
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleProtocol::SampleProtocol(StreamBase *stream, AbstractProtocol *parent);
|
SampleProtocol::SampleProtocol(StreamBase *stream, AbstractProtocol *parent)
|
||||||
: AbstractProtocol(stream, parent)
|
: AbstractProtocol(stream, parent)
|
||||||
{
|
{
|
||||||
configForm = NULL;
|
configForm = NULL;
|
||||||
@ -38,24 +33,55 @@ quint32 SampleProtocol::protocolNumber() const
|
|||||||
void SampleProtocol::protoDataCopyInto(OstProto::Protocol &protocol) const
|
void SampleProtocol::protoDataCopyInto(OstProto::Protocol &protocol) const
|
||||||
{
|
{
|
||||||
protocol.MutableExtension(OstProto::sample)->CopyFrom(data);
|
protocol.MutableExtension(OstProto::sample)->CopyFrom(data);
|
||||||
protocol.mutable_protocol_id()->set_id(protocolNumber())
|
protocol.mutable_protocol_id()->set_id(protocolNumber());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SampleProtocol::protoDataCopyFrom(const OstProto::Protocol &protocol)
|
void SampleProtocol::protoDataCopyFrom(const OstProto::Protocol &protocol)
|
||||||
{
|
{
|
||||||
if (protocol.protocol_id()->id() == protocolNumber() &&
|
if (protocol.protocol_id().id() == protocolNumber() &&
|
||||||
protocol.HasExtension(OstProto::sample))
|
protocol.HasExtension(OstProto::sample))
|
||||||
data.MergeFrom(protocol.GetExtension(OstProto::sample));
|
data.MergeFrom(protocol.GetExtension(OstProto::sample));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SampleProtocol::name() const
|
QString SampleProtocol::name() const
|
||||||
{
|
{
|
||||||
return QString("Sample");
|
return QString("Sample Protocol");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SampleProtocol::shortName() const
|
QString SampleProtocol::shortName() const
|
||||||
{
|
{
|
||||||
return QString("Sample");
|
return QString("SAMPLE");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return the ProtocolIdType for your protocol \n
|
||||||
|
|
||||||
|
If your protocol doesn't have a protocolId field, you don't need to
|
||||||
|
reimplement this method - the base class implementation will do the
|
||||||
|
right thing
|
||||||
|
*/
|
||||||
|
AbstractProtocol::ProtocolIdType SampleProtocol::protocolIdType() const
|
||||||
|
{
|
||||||
|
return ProtocolIdIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return the protocolId for your protoocol based on the 'type' requested \n
|
||||||
|
|
||||||
|
If not all types are valid for your protocol, handle the valid type(s)
|
||||||
|
and for the remaining fallback to the base class implementation; if your
|
||||||
|
protocol doesn't have a protocolId at all, you don't need to reimplement
|
||||||
|
this method - the base class will do the right thing
|
||||||
|
*/
|
||||||
|
quint32 SampleProtocol::protocolId(ProtocolIdType type) const
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case ProtocolIdIp: return 1234;
|
||||||
|
default:break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AbstractProtocol::protocolId(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SampleProtocol::fieldCount() const
|
int SampleProtocol::fieldCount() const
|
||||||
@ -71,18 +97,26 @@ AbstractProtocol::FieldFlags SampleProtocol::fieldFlags(int index) const
|
|||||||
|
|
||||||
switch (index)
|
switch (index)
|
||||||
{
|
{
|
||||||
case sample_normal:
|
case sample_a:
|
||||||
|
case sample_b:
|
||||||
|
case sample_payloadLength:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case sample_cksum:
|
case sample_checksum:
|
||||||
flags |= FieldIsCksum;
|
flags |= FieldIsCksum;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case sample_meta:
|
case sample_x:
|
||||||
|
case sample_y:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case sample_is_override_checksum:
|
||||||
flags |= FieldIsMeta;
|
flags |= FieldIsMeta;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
|
||||||
|
index);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,57 +128,190 @@ QVariant SampleProtocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
{
|
{
|
||||||
switch (index)
|
switch (index)
|
||||||
{
|
{
|
||||||
case sample_one:
|
case sample_a:
|
||||||
{
|
{
|
||||||
|
int a = data.ab() >> 13;
|
||||||
|
|
||||||
switch(attrib)
|
switch(attrib)
|
||||||
{
|
{
|
||||||
case FieldName:
|
case FieldName:
|
||||||
return QString("ONE");
|
return QString("A");
|
||||||
case FieldValue:
|
case FieldValue:
|
||||||
return data.one();
|
return a;
|
||||||
case FieldTextValue:
|
case FieldTextValue:
|
||||||
return QString("%1").arg(data.one());
|
return QString("%1").arg(a);
|
||||||
case FieldFrameValue:
|
case FieldFrameValue:
|
||||||
return QByteArray(1, (char)(data.one() & 0xF0));
|
return QByteArray(1, (char) a);
|
||||||
case FieldBitSize:
|
case FieldBitSize:
|
||||||
return 4;
|
return 3;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
case sample_two:
|
case sample_b:
|
||||||
{
|
{
|
||||||
|
int b = data.ab() & 0x1FFF;
|
||||||
|
|
||||||
switch(attrib)
|
switch(attrib)
|
||||||
{
|
{
|
||||||
case FieldName:
|
case FieldName:
|
||||||
return QString("TWO");
|
return QString("B");
|
||||||
case FieldValue:
|
case FieldValue:
|
||||||
return data.two();
|
return b;
|
||||||
case FieldTextValue:
|
case FieldTextValue:
|
||||||
return QString("%1").arg(data.two());
|
return QString("%1").arg(b, 4, BASE_HEX, QChar('0'));
|
||||||
case FieldFrameValue:
|
case FieldFrameValue:
|
||||||
{
|
{
|
||||||
QByteArray fv;
|
QByteArray fv;
|
||||||
fv.resize(0);
|
fv.resize(2);
|
||||||
qToBigEndian(FIXME, (uchar*) fv.data());
|
qToBigEndian((quint16) b, (uchar*) fv.data());
|
||||||
return fv;
|
return fv;
|
||||||
}
|
}
|
||||||
return QByteArray(1, (char)(FIXME() & 0xF0));
|
|
||||||
case FieldBitSize:
|
case FieldBitSize:
|
||||||
return 4;
|
return 13;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Meta fields
|
|
||||||
|
|
||||||
case sample_FIXME:
|
case sample_payloadLength:
|
||||||
|
{
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldName:
|
||||||
|
return QString("Payload Length");
|
||||||
|
case FieldValue:
|
||||||
|
return protocolFramePayloadSize(streamIndex);
|
||||||
|
case FieldFrameValue:
|
||||||
|
{
|
||||||
|
QByteArray fv;
|
||||||
|
int totlen;
|
||||||
|
totlen = protocolFramePayloadSize(streamIndex);
|
||||||
|
fv.resize(2);
|
||||||
|
qToBigEndian((quint16) totlen, (uchar*) fv.data());
|
||||||
|
return fv;
|
||||||
|
}
|
||||||
|
case FieldTextValue:
|
||||||
|
return QString("%1").arg(
|
||||||
|
protocolFramePayloadSize(streamIndex));
|
||||||
|
case FieldBitSize:
|
||||||
|
return 16;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_checksum:
|
||||||
|
{
|
||||||
|
quint16 cksum;
|
||||||
|
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldValue:
|
||||||
|
case FieldFrameValue:
|
||||||
|
case FieldTextValue:
|
||||||
|
{
|
||||||
|
if (data.is_override_checksum())
|
||||||
|
cksum = data.checksum();
|
||||||
|
else
|
||||||
|
cksum = protocolFrameCksum(streamIndex, CksumIp);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldName:
|
||||||
|
return QString("Checksum");
|
||||||
|
case FieldValue:
|
||||||
|
return cksum;
|
||||||
|
case FieldFrameValue:
|
||||||
|
{
|
||||||
|
QByteArray fv;
|
||||||
|
|
||||||
|
fv.resize(2);
|
||||||
|
qToBigEndian(cksum, (uchar*) fv.data());
|
||||||
|
return fv;
|
||||||
|
}
|
||||||
|
case FieldTextValue:
|
||||||
|
return QString("0x%1").arg(
|
||||||
|
cksum, 4, BASE_HEX, QChar('0'));;
|
||||||
|
case FieldBitSize:
|
||||||
|
return 16;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_x:
|
||||||
|
{
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldName:
|
||||||
|
return QString("X");
|
||||||
|
case FieldValue:
|
||||||
|
return data.x();
|
||||||
|
case FieldTextValue:
|
||||||
|
return QString("%1").arg(data.x());
|
||||||
|
//return QString("%1").arg(data.x(), 8, BASE_HEX, QChar('0'));
|
||||||
|
case FieldFrameValue:
|
||||||
|
{
|
||||||
|
QByteArray fv;
|
||||||
|
fv.resize(4);
|
||||||
|
qToBigEndian((quint32) data.x(), (uchar*) fv.data());
|
||||||
|
return fv;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_y:
|
||||||
|
{
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldName:
|
||||||
|
return QString("Y");
|
||||||
|
case FieldValue:
|
||||||
|
return data.y();
|
||||||
|
case FieldTextValue:
|
||||||
|
//return QString("%1").arg(data.y());
|
||||||
|
return QString("%1").arg(data.y(), 8, BASE_HEX, QChar('0'));
|
||||||
|
case FieldFrameValue:
|
||||||
|
{
|
||||||
|
QByteArray fv;
|
||||||
|
fv.resize(4);
|
||||||
|
qToBigEndian((quint32) data.y(), (uchar*) fv.data());
|
||||||
|
return fv;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Meta fields
|
||||||
|
case sample_is_override_checksum:
|
||||||
|
{
|
||||||
|
switch(attrib)
|
||||||
|
{
|
||||||
|
case FieldValue:
|
||||||
|
return data.is_override_checksum();
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
|
||||||
|
index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return AbstractProtocol::fieldData(index, attrib, streamIndex);
|
return AbstractProtocol::fieldData(index, attrib, streamIndex);
|
||||||
}
|
}
|
||||||
@ -152,10 +319,105 @@ QVariant SampleProtocol::fieldData(int index, FieldAttrib attrib,
|
|||||||
bool SampleProtocol::setFieldData(int index, const QVariant &value,
|
bool SampleProtocol::setFieldData(int index, const QVariant &value,
|
||||||
FieldAttrib attrib)
|
FieldAttrib attrib)
|
||||||
{
|
{
|
||||||
// FIXME
|
bool isOk = false;
|
||||||
|
|
||||||
|
if (attrib != FieldValue)
|
||||||
|
goto _exit;
|
||||||
|
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case sample_a:
|
||||||
|
{
|
||||||
|
uint a = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_ab((data.ab() & 0xe000) | (a << 13));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_b:
|
||||||
|
{
|
||||||
|
uint b = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_ab((data.ab() & 0x1FFF) | b);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_payloadLength:
|
||||||
|
{
|
||||||
|
uint len = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_payload_length(len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_checksum:
|
||||||
|
{
|
||||||
|
uint csum = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_checksum(csum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_x:
|
||||||
|
{
|
||||||
|
uint x = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_x(x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_y:
|
||||||
|
{
|
||||||
|
uint y = value.toUInt(&isOk);
|
||||||
|
if (isOk)
|
||||||
|
data.set_y(y);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case sample_is_override_checksum:
|
||||||
|
{
|
||||||
|
bool ovr = value.toBool();
|
||||||
|
data.set_is_override_checksum(ovr);
|
||||||
|
isOk = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
qFatal("%s: unimplemented case %d in switch", __PRETTY_FUNCTION__,
|
||||||
|
index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return isOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return the protocol frame size in bytes\n
|
||||||
|
|
||||||
|
If your protocol has a fixed size - you don't need to reimplement this; the
|
||||||
|
base class implementation is good enough
|
||||||
|
*/
|
||||||
|
int SampleProtocol::protocolFrameSize(int streamIndex) const
|
||||||
|
{
|
||||||
|
return AbstractProtocol::protocolFrameSize(streamIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
If your protocol has any variable fields, return true \n
|
||||||
|
|
||||||
|
Otherwise you don't need to reimplement this method - the base class always
|
||||||
|
returns false
|
||||||
|
*/
|
||||||
|
bool SampleProtocol::isProtocolFrameValueVariable() const
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
If your protocol frame size can vary across pkts of the same stream,
|
||||||
|
return true \n
|
||||||
|
|
||||||
|
Otherwise you don't need to reimplement this method - the base class always
|
||||||
|
returns false
|
||||||
|
*/
|
||||||
|
bool SampleProtocol::isProtocolFrameSizeVariable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
QWidget* SampleProtocol::configWidget()
|
QWidget* SampleProtocol::configWidget()
|
||||||
{
|
{
|
||||||
@ -171,6 +433,21 @@ QWidget* SampleProtocol::configWidget()
|
|||||||
void SampleProtocol::loadConfigWidget()
|
void SampleProtocol::loadConfigWidget()
|
||||||
{
|
{
|
||||||
configWidget();
|
configWidget();
|
||||||
|
|
||||||
|
configForm->sampleA->setText(fieldData(sample_a, FieldValue).toString());
|
||||||
|
configForm->sampleB->setText(fieldData(sample_b, FieldValue).toString());
|
||||||
|
|
||||||
|
configForm->samplePayloadLength->setText(
|
||||||
|
fieldData(sample_payloadLength, FieldValue).toString());
|
||||||
|
|
||||||
|
configForm->isChecksumOverride->setChecked(
|
||||||
|
fieldData(sample_is_override_checksum, FieldValue).toBool());
|
||||||
|
configForm->sampleChecksum->setText(uintToHexStr(
|
||||||
|
fieldData(sample_checksum, FieldValue).toUInt(), 2));
|
||||||
|
|
||||||
|
configForm->sampleX->setText(fieldData(sample_x, FieldValue).toString());
|
||||||
|
configForm->sampleY->setText(fieldData(sample_y, FieldValue).toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SampleProtocol::storeConfigWidget()
|
void SampleProtocol::storeConfigWidget()
|
||||||
@ -178,5 +455,15 @@ void SampleProtocol::storeConfigWidget()
|
|||||||
bool isOk;
|
bool isOk;
|
||||||
|
|
||||||
configWidget();
|
configWidget();
|
||||||
|
setFieldData(sample_a, configForm->sampleA->text());
|
||||||
|
setFieldData(sample_b, configForm->sampleB->text());
|
||||||
|
|
||||||
|
setFieldData(sample_payloadLength, configForm->samplePayloadLength->text());
|
||||||
|
setFieldData(sample_is_override_checksum,
|
||||||
|
configForm->isChecksumOverride->isChecked());
|
||||||
|
setFieldData(sample_checksum, configForm->sampleChecksum->text().toUInt(&isOk, BASE_HEX));
|
||||||
|
|
||||||
|
setFieldData(sample_x, configForm->sampleX->text());
|
||||||
|
setFieldData(sample_y, configForm->sampleY->text());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,15 @@
|
|||||||
#include "sample.pb.h"
|
#include "sample.pb.h"
|
||||||
#include "ui_sample.h"
|
#include "ui_sample.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sample Protocol Frame Format -
|
||||||
|
+-----+------+------+------+------+------+
|
||||||
|
| A | B | LEN | CSUM | X | Y |
|
||||||
|
| (3) | (13) | (16) | (16) | (32) | (32) |
|
||||||
|
+-----+------+------+------+------+------+
|
||||||
|
Figures in brackets represent field width in bits
|
||||||
|
*/
|
||||||
|
|
||||||
class SampleConfigForm : public QWidget, public Ui::Sample
|
class SampleConfigForm : public QWidget, public Ui::Sample
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -21,6 +30,16 @@ private:
|
|||||||
SampleConfigForm *configForm;
|
SampleConfigForm *configForm;
|
||||||
enum samplefield
|
enum samplefield
|
||||||
{
|
{
|
||||||
|
// Frame Fields
|
||||||
|
sample_a = 0,
|
||||||
|
sample_b,
|
||||||
|
sample_payloadLength,
|
||||||
|
sample_checksum,
|
||||||
|
sample_x,
|
||||||
|
sample_y,
|
||||||
|
|
||||||
|
// Meta Fields
|
||||||
|
sample_is_override_checksum,
|
||||||
|
|
||||||
sample_fieldCount
|
sample_fieldCount
|
||||||
};
|
};
|
||||||
@ -36,6 +55,9 @@ public:
|
|||||||
virtual void protoDataCopyInto(OstProto::Protocol &protocol) const;
|
virtual void protoDataCopyInto(OstProto::Protocol &protocol) const;
|
||||||
virtual void protoDataCopyFrom(const OstProto::Protocol &protocol);
|
virtual void protoDataCopyFrom(const OstProto::Protocol &protocol);
|
||||||
|
|
||||||
|
virtual ProtocolIdType protocolIdType() const;
|
||||||
|
virtual quint32 protocolId(ProtocolIdType type) const;
|
||||||
|
|
||||||
virtual QString name() const;
|
virtual QString name() const;
|
||||||
virtual QString shortName() const;
|
virtual QString shortName() const;
|
||||||
|
|
||||||
@ -47,6 +69,11 @@ public:
|
|||||||
virtual bool setFieldData(int index, const QVariant &value,
|
virtual bool setFieldData(int index, const QVariant &value,
|
||||||
FieldAttrib attrib = FieldValue);
|
FieldAttrib attrib = FieldValue);
|
||||||
|
|
||||||
|
virtual int protocolFrameSize(int streamIndex = 0) const;
|
||||||
|
|
||||||
|
virtual bool isProtocolFrameValueVariable() const;
|
||||||
|
virtual bool isProtocolFrameSizeVariable() const;
|
||||||
|
|
||||||
virtual QWidget* configWidget();
|
virtual QWidget* configWidget();
|
||||||
virtual void loadConfigWidget();
|
virtual void loadConfigWidget();
|
||||||
virtual void storeConfigWidget();
|
virtual void storeConfigWidget();
|
||||||
|
19
common/sample.proto
Normal file
19
common/sample.proto
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import "protocol.proto";
|
||||||
|
|
||||||
|
package OstProto;
|
||||||
|
|
||||||
|
// Sample Protocol
|
||||||
|
message Sample {
|
||||||
|
|
||||||
|
optional bool is_override_checksum = 1;
|
||||||
|
|
||||||
|
optional uint32 ab = 2;
|
||||||
|
optional uint32 payload_length = 3;
|
||||||
|
optional uint32 checksum = 4;
|
||||||
|
optional uint32 x = 5 [default = 1234];
|
||||||
|
optional uint32 y = 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
extend Protocol {
|
||||||
|
optional Sample sample = 53;
|
||||||
|
}
|
191
common/sample.ui
Normal file
191
common/sample.ui
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
<ui version="4.0" >
|
||||||
|
<class>Sample</class>
|
||||||
|
<widget class="QWidget" name="Sample" >
|
||||||
|
<property name="geometry" >
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>263</width>
|
||||||
|
<height>116</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle" >
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" >
|
||||||
|
<item row="0" column="0" >
|
||||||
|
<widget class="QLabel" name="label_22" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Field A</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>sampleA</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1" >
|
||||||
|
<widget class="QLineEdit" name="sampleA" >
|
||||||
|
<property name="inputMask" >
|
||||||
|
<string>>HH; </string>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2" >
|
||||||
|
<widget class="QCheckBox" name="isChecksumOverride" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Checksum</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="3" >
|
||||||
|
<widget class="QLineEdit" name="sampleChecksum" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask" >
|
||||||
|
<string>>HH HH; </string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" >
|
||||||
|
<widget class="QLabel" name="label_24" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Field B</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>sampleB</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1" >
|
||||||
|
<widget class="QLineEdit" name="sampleB" >
|
||||||
|
<property name="inputMask" >
|
||||||
|
<string>>HH HH; </string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2" >
|
||||||
|
<widget class="QLabel" name="label_25" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Field X</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>sampleX</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3" >
|
||||||
|
<widget class="QLineEdit" name="sampleX" />
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" >
|
||||||
|
<widget class="QLabel" name="label_27" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Length</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>samplePayloadLength</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1" >
|
||||||
|
<widget class="QLineEdit" name="samplePayloadLength" >
|
||||||
|
<property name="enabled" >
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2" >
|
||||||
|
<widget class="QLabel" name="label_26" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Field Y</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment" >
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="buddy" >
|
||||||
|
<cstring>sampleY</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="3" >
|
||||||
|
<widget class="QLineEdit" name="sampleY" >
|
||||||
|
<property name="text" >
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2" >
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" >
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>sampleA</tabstop>
|
||||||
|
<tabstop>sampleB</tabstop>
|
||||||
|
<tabstop>samplePayloadLength</tabstop>
|
||||||
|
<tabstop>isChecksumOverride</tabstop>
|
||||||
|
<tabstop>sampleChecksum</tabstop>
|
||||||
|
<tabstop>sampleX</tabstop>
|
||||||
|
<tabstop>sampleY</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>isChecksumOverride</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>sampleChecksum</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel" >
|
||||||
|
<x>345</x>
|
||||||
|
<y>122</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel" >
|
||||||
|
<x>406</x>
|
||||||
|
<y>122</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue
Block a user