mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-01-29 14:52:12 +01:00
Merge branch 'next' into revo
This commit is contained in:
commit
c9bf5f5d06
2
Makefile
2
Makefile
@ -490,7 +490,7 @@ uavobjgenerator:
|
||||
$(MAKE) --no-print-directory -w ; \
|
||||
)
|
||||
|
||||
UAVOBJ_TARGETS := gcs flight python matlab java
|
||||
UAVOBJ_TARGETS := gcs flight python matlab java wireshark
|
||||
.PHONY:uavobjects
|
||||
uavobjects: $(addprefix uavobjects_, $(UAVOBJ_TARGETS))
|
||||
|
||||
|
@ -64,7 +64,7 @@ int32_t PIOS_DELAY_WaituS(uint32_t uS)
|
||||
static struct timespec wait,rest;
|
||||
wait.tv_sec=0;
|
||||
wait.tv_nsec=1000*uS;
|
||||
while (!nanosleep(&wait,&rest)) {
|
||||
while (nanosleep(&wait,&rest)!=0) {
|
||||
wait=rest;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ int32_t PIOS_DELAY_WaitmS(uint32_t mS)
|
||||
static struct timespec wait,rest;
|
||||
wait.tv_sec=mS/1000;
|
||||
wait.tv_nsec=(mS%1000)*1000000;
|
||||
while (!nanosleep(&wait,&rest)) {
|
||||
while (nanosleep(&wait,&rest)!=0) {
|
||||
wait=rest;
|
||||
}
|
||||
//}
|
||||
|
@ -59,10 +59,10 @@ typedef void* UAVObjHandle;
|
||||
* Object update mode, used by multiple modules (e.g. telemetry and logger)
|
||||
*/
|
||||
typedef enum {
|
||||
UPDATEMODE_PERIODIC = 0, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE = 1, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED = 2, /** Object is updated on change, but not more often than the interval time */
|
||||
UPDATEMODE_MANUAL = 3 /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */
|
||||
} UAVObjUpdateMode;
|
||||
|
||||
/**
|
||||
|
@ -99,7 +99,7 @@ bool SequentialPlotData::append(UAVObject* obj)
|
||||
|
||||
double currentValue = valueAsDouble(obj, field) * pow(10, scalePower);
|
||||
|
||||
//Compute boxcar average
|
||||
//Perform scope math, if necessary
|
||||
if (mathFunction == "Boxcar average" || mathFunction == "Standard deviation"){
|
||||
//Put the new value at the front
|
||||
yDataHistory->append( currentValue );
|
||||
@ -163,8 +163,8 @@ bool ChronoPlotData::append(UAVObject* obj)
|
||||
QDateTime NOW = QDateTime::currentDateTime(); //THINK ABOUT REIMPLEMENTING THIS TO SHOW UAVO TIME, NOT SYSTEM TIME
|
||||
double currentValue = valueAsDouble(obj, field) * pow(10, scalePower);
|
||||
|
||||
//Compute boxcar average
|
||||
if (meanSamples > 1){
|
||||
//Perform scope math, if necessary
|
||||
if (mathFunction == "Boxcar average" || mathFunction == "Standard deviation"){
|
||||
//Put the new value at the front
|
||||
yDataHistory->append( currentValue );
|
||||
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include <QtGui/QVBoxLayout>
|
||||
#include <QtGui/QPushButton>
|
||||
#include <QMutexLocker>
|
||||
#include <QWheelEvent>
|
||||
|
||||
//using namespace Core;
|
||||
|
||||
@ -65,8 +66,8 @@ ScopeGadgetWidget::ScopeGadgetWidget(QWidget *parent) : QwtPlot(parent)
|
||||
replotTimer = new QTimer(this);
|
||||
connect(replotTimer, SIGNAL(timeout()), this, SLOT(replotNewData()));
|
||||
|
||||
// Listen to telemetry connection/disconnection events, no point
|
||||
// running the scopes if we are not connected and not replaying logs
|
||||
// Listen to telemetry connection/disconnection events, no point in
|
||||
// running the scopes if we are not connected and not replaying logs.
|
||||
// Also listen to disconnect actions from the user
|
||||
Core::ConnectionManager *cm = Core::ICore::instance()->connectionManager();
|
||||
connect(cm, SIGNAL(deviceAboutToDisconnect()), this, SLOT(stopPlotting()));
|
||||
@ -124,13 +125,18 @@ void ScopeGadgetWidget::mouseReleaseEvent(QMouseEvent *e)
|
||||
|
||||
void ScopeGadgetWidget::mouseDoubleClickEvent(QMouseEvent *e)
|
||||
{
|
||||
mutex.lock();
|
||||
if (legend())
|
||||
deleteLegend();
|
||||
else
|
||||
addLegend();
|
||||
mutex.unlock();
|
||||
update();
|
||||
//On double-click, toggle legend
|
||||
mutex.lock();
|
||||
if (legend())
|
||||
deleteLegend();
|
||||
else
|
||||
addLegend();
|
||||
mutex.unlock();
|
||||
|
||||
//On double-click, reset plot zoom
|
||||
setAxisAutoScale(QwtPlot::yLeft, true);
|
||||
|
||||
update();
|
||||
|
||||
QwtPlot::mouseDoubleClickEvent(e);
|
||||
}
|
||||
@ -142,6 +148,33 @@ void ScopeGadgetWidget::mouseMoveEvent(QMouseEvent *e)
|
||||
|
||||
void ScopeGadgetWidget::wheelEvent(QWheelEvent *e)
|
||||
{
|
||||
//Change zoom on scroll wheel event
|
||||
QwtInterval yInterval=axisInterval(QwtPlot::yLeft);
|
||||
if (yInterval.minValue() != yInterval.maxValue()) //Make sure that the two values are never the same. Sometimes axisInterval returns (0,0)
|
||||
{
|
||||
//Determine what y value to zoom about. NOTE, this approach has a bug that the in that
|
||||
//the value returned by Qt includes the legend, whereas the value transformed by Qwt
|
||||
//does *not*. Thus, when zooming with a legend, there will always be a small bias error.
|
||||
//In practice, this seems not to be a UI problem.
|
||||
QPoint mouse_pos=e->pos(); //Get the mouse coordinate in the frame
|
||||
double zoomLine=invTransform(QwtPlot::yLeft, mouse_pos.y()); //Transform the y mouse coordinate into a frame value.
|
||||
|
||||
double zoomScale=1.1; //THIS IS AN ARBITRARY CONSTANT, AND PERHAPS SHOULD BE IN A DEFINE INSTEAD OF BURIED HERE
|
||||
|
||||
mutex.lock(); //DOES THIS mutex.lock NEED TO BE HERE? I DON'T KNOW, I JUST COPIED IT FROM THE ABOVE CODE
|
||||
// Set the scale
|
||||
if (e->delta()<0){
|
||||
setAxisScale(QwtPlot::yLeft,
|
||||
(yInterval.minValue()-zoomLine)*zoomScale+zoomLine,
|
||||
(yInterval.maxValue()-zoomLine)*zoomScale+zoomLine );
|
||||
}
|
||||
else{
|
||||
setAxisScale(QwtPlot::yLeft,
|
||||
(yInterval.minValue()-zoomLine)/zoomScale+zoomLine,
|
||||
(yInterval.maxValue()-zoomLine)/zoomScale+zoomLine );
|
||||
}
|
||||
mutex.unlock();
|
||||
}
|
||||
QwtPlot::wheelEvent(e);
|
||||
}
|
||||
|
||||
@ -203,17 +236,17 @@ void ScopeGadgetWidget::addLegend()
|
||||
// legend->setFrameStyle(QFrame::Box | QFrame::Sunken);
|
||||
// insertLegend(legend, QwtPlot::BottomLegend);
|
||||
|
||||
// Update the checked/unchecked state of the legend items
|
||||
// -> this is necessary when hiding a legend where some plots are
|
||||
// not visible, and the un-hiding it.
|
||||
foreach (QwtPlotItem *item, this->itemList()) {
|
||||
bool on = item->isVisible();
|
||||
QWidget *w = legend->find(item);
|
||||
if ( w && w->inherits("QwtLegendItem") )
|
||||
((QwtLegendItem *)w)->setChecked(!on);
|
||||
}
|
||||
// Update the checked/unchecked state of the legend items
|
||||
// -> this is necessary when hiding a legend where some plots are
|
||||
// not visible, and the un-hiding it.
|
||||
foreach (QwtPlotItem *item, this->itemList()) {
|
||||
bool on = item->isVisible();
|
||||
QWidget *w = legend->find(item);
|
||||
if ( w && w->inherits("QwtLegendItem") )
|
||||
((QwtLegendItem *)w)->setChecked(!on);
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)), this, SLOT(showCurve(QwtPlotItem *, bool)));
|
||||
connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)), this, SLOT(showCurve(QwtPlotItem *, bool)));
|
||||
}
|
||||
|
||||
void ScopeGadgetWidget::preparePlot(PlotType plotType)
|
||||
@ -234,27 +267,27 @@ void ScopeGadgetWidget::preparePlot(PlotType plotType)
|
||||
// setPalette(pal);
|
||||
|
||||
// setCanvasBackground(Utils::StyleHelper::baseColor());
|
||||
setCanvasBackground(QColor(64, 64, 64));
|
||||
setCanvasBackground(QColor(64, 64, 64));
|
||||
|
||||
//Add grid lines
|
||||
QwtPlotGrid *grid = new QwtPlotGrid;
|
||||
grid->setMajPen(QPen(Qt::gray, 0, Qt::DashLine));
|
||||
grid->setMinPen(QPen(Qt::lightGray, 0, Qt::DotLine));
|
||||
grid->setPen(QPen(Qt::darkGray, 1, Qt::DotLine));
|
||||
grid->attach(this);
|
||||
grid->setMajPen(QPen(Qt::gray, 0, Qt::DashLine));
|
||||
grid->setMinPen(QPen(Qt::lightGray, 0, Qt::DotLine));
|
||||
grid->setPen(QPen(Qt::darkGray, 1, Qt::DotLine));
|
||||
grid->attach(this);
|
||||
|
||||
// Add the legend
|
||||
addLegend();
|
||||
// Add the legend
|
||||
addLegend();
|
||||
|
||||
// Only start the timer if we are already connected
|
||||
Core::ConnectionManager *cm = Core::ICore::instance()->connectionManager();
|
||||
if (cm->getCurrentConnection() && replotTimer)
|
||||
{
|
||||
if (!replotTimer->isActive())
|
||||
replotTimer->start(m_refreshInterval);
|
||||
else
|
||||
replotTimer->setInterval(m_refreshInterval);
|
||||
}
|
||||
if (cm->getCurrentConnection() && replotTimer)
|
||||
{
|
||||
if (!replotTimer->isActive())
|
||||
replotTimer->start(m_refreshInterval);
|
||||
else
|
||||
replotTimer->setInterval(m_refreshInterval);
|
||||
}
|
||||
}
|
||||
|
||||
void ScopeGadgetWidget::showCurve(QwtPlotItem *item, bool on)
|
||||
@ -412,7 +445,7 @@ void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavFieldSubField
|
||||
//Keep the curve details for later
|
||||
m_curvesData.insert(curveNameScaled, plotData);
|
||||
|
||||
//Link to the signal of new data only if this UAVObject has not been to connected yet
|
||||
//Link to the new signal data only if this UAVObject has not been connected yet
|
||||
if (!m_connectedUAVObjects.contains(obj->getName())) {
|
||||
m_connectedUAVObjects.append(obj->getName());
|
||||
connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(uavObjectReceived(UAVObject*)));
|
||||
@ -470,6 +503,7 @@ void ScopeGadgetWidget::replotNewData()
|
||||
replot();
|
||||
}
|
||||
|
||||
/*
|
||||
void ScopeGadgetWidget::setupExamplePlot()
|
||||
{
|
||||
preparePlot(SequentialPlot);
|
||||
@ -514,6 +548,7 @@ void ScopeGadgetWidget::setupExamplePlot()
|
||||
replot();
|
||||
mutex.unlock();
|
||||
}
|
||||
*/
|
||||
|
||||
void ScopeGadgetWidget::clearCurvePlots()
|
||||
{
|
||||
|
@ -176,6 +176,7 @@ void UAVObjectTreeModel::addSingleField(int index, UAVObjectField *field, TreeIt
|
||||
FieldTreeItem *item;
|
||||
UAVObjectField::FieldType type = field->getType();
|
||||
switch (type) {
|
||||
case UAVObjectField::BITFIELD:
|
||||
case UAVObjectField::ENUM: {
|
||||
QStringList options = field->getOptions();
|
||||
QVariant value = field->getValue();
|
||||
|
@ -38,17 +38,13 @@ UAVMetaObject::UAVMetaObject(quint32 objID, const QString& name, UAVObject* pare
|
||||
// Setup default metadata of metaobject (can not be changed)
|
||||
UAVObject::MetadataInitialize(ownMetadata);
|
||||
// Setup fields
|
||||
QStringList boolEnum;
|
||||
boolEnum << tr("False") << tr("True");
|
||||
QStringList updateModeEnum;
|
||||
updateModeEnum << tr("Periodic") << tr("On Change") << tr("Manual") << tr("Never");
|
||||
QStringList accessModeEnum;
|
||||
accessModeEnum << tr("Read/Write") << tr("Read Only");
|
||||
QStringList modesBitField;
|
||||
modesBitField << tr("FlightReadOnly") << tr("GCSReadOnly") << tr("FlightTelemetryAcked") << tr("GCSTelemetryAcked") << tr("FlightUpdatePeriodic") << tr("FlightUpdateOnChange") << tr("GCSUpdatePeriodic") << tr("GCSUpdateOnChange");
|
||||
QList<UAVObjectField*> fields;
|
||||
fields.append( new UAVObjectField(tr("Modes"), tr(""), UAVObjectField::UINT8, 1, accessModeEnum) );
|
||||
fields.append( new UAVObjectField(tr("Flight Telemetry Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("GCS Telemetry Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("Logging Update Period"), tr(""), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("Modes"), tr("boolean"), UAVObjectField::BITFIELD, modesBitField, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("Flight Telemetry Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("GCS Telemetry Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
fields.append( new UAVObjectField(tr("Logging Update Period"), tr("ms"), UAVObjectField::UINT16, 1, QStringList()) );
|
||||
// Initialize parent
|
||||
UAVObject::initialize(0);
|
||||
UAVObject::initializeFields(fields, (quint8*)&parentMetadata, sizeof(Metadata));
|
||||
|
@ -59,10 +59,10 @@ public:
|
||||
* Object update mode
|
||||
*/
|
||||
typedef enum {
|
||||
UPDATEMODE_PERIODIC = 0, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE = 1, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED = 2, /** Object is updated on change, but not more often than the interval time */
|
||||
UPDATEMODE_MANUAL = 3 /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */
|
||||
} UpdateMode;
|
||||
|
||||
/**
|
||||
|
@ -86,6 +86,10 @@ void UAVObjectField::constructorInitialize(const QString& name, const QString& u
|
||||
case ENUM:
|
||||
numBytesPerElement = sizeof(quint8);
|
||||
break;
|
||||
case BITFIELD:
|
||||
numBytesPerElement = sizeof(quint8);
|
||||
this->options = QStringList()<<tr("0")<<tr("1");
|
||||
break;
|
||||
case STRING:
|
||||
numBytesPerElement = sizeof(quint8);
|
||||
break;
|
||||
@ -133,14 +137,15 @@ void UAVObjectField::limitsInitialize(const QString &limits)
|
||||
QString value=_value.trimmed();
|
||||
switch (type)
|
||||
{
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
lstruc.values.append((quint32)value.toULong());
|
||||
break;
|
||||
case INT8:
|
||||
case INT16:
|
||||
case INT32:
|
||||
case UINT8:
|
||||
lstruc.values.append((quint32)value.toULong());
|
||||
break;
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
lstruc.values.append((qint32)value.toLong());
|
||||
break;
|
||||
case FLOAT32:
|
||||
@ -190,6 +195,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index)
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
foreach (QVariant vars, struc.values) {
|
||||
if(var.toUInt()==vars.toUInt())
|
||||
return true;
|
||||
@ -230,6 +236,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index)
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
foreach (QVariant vars, struc.values) {
|
||||
if(var.toUInt()==vars.toUInt())
|
||||
return false;
|
||||
@ -275,6 +282,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index)
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
if(!(var.toUInt()>=struc.values.at(0).toUInt() && var.toUInt()<=struc.values.at(1).toUInt()))
|
||||
return false;
|
||||
return true;
|
||||
@ -316,6 +324,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index)
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
if(!(var.toUInt()>=struc.values.at(0).toUInt()))
|
||||
return false;
|
||||
return true;
|
||||
@ -350,6 +359,7 @@ bool UAVObjectField::isWithinLimits(QVariant var,quint32 index)
|
||||
case UINT8:
|
||||
case UINT16:
|
||||
case UINT32:
|
||||
case BITFIELD:
|
||||
if(!(var.toUInt()<=struc.values.at(0).toUInt()))
|
||||
return false;
|
||||
return true;
|
||||
@ -457,6 +467,8 @@ QString UAVObjectField::getTypeAsString()
|
||||
return "float32";
|
||||
case UAVObjectField::ENUM:
|
||||
return "enum";
|
||||
case UAVObjectField::BITFIELD:
|
||||
return "bitfield";
|
||||
case UAVObjectField::STRING:
|
||||
return "string";
|
||||
default:
|
||||
@ -477,7 +489,15 @@ UAVObject* UAVObjectField::getObject()
|
||||
void UAVObjectField::clear()
|
||||
{
|
||||
QMutexLocker locker(obj->getMutex());
|
||||
memset(&data[offset], 0, numBytesPerElement*numElements);
|
||||
switch (type)
|
||||
{
|
||||
case BITFIELD:
|
||||
memset(&data[offset], 0, numBytesPerElement*((quint32)(1+(numElements-1)/8)));
|
||||
break;
|
||||
default:
|
||||
memset(&data[offset], 0, numBytesPerElement*numElements);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QString UAVObjectField::getName()
|
||||
@ -507,7 +527,15 @@ quint32 UAVObjectField::getDataOffset()
|
||||
|
||||
quint32 UAVObjectField::getNumBytes()
|
||||
{
|
||||
return numBytesPerElement * numElements;
|
||||
switch (type)
|
||||
{
|
||||
case BITFIELD:
|
||||
return numBytesPerElement * ((quint32) (1+(numElements-1)/8));
|
||||
break;
|
||||
default:
|
||||
return numBytesPerElement * numElements;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QString UAVObjectField::toString()
|
||||
@ -584,6 +612,12 @@ qint32 UAVObjectField::pack(quint8* dataOut)
|
||||
dataOut[numBytesPerElement*index] = data[offset + numBytesPerElement*index];
|
||||
}
|
||||
break;
|
||||
case BITFIELD:
|
||||
for (quint32 index = 0; index < (quint32)(1+(numElements-1)/8); ++index)
|
||||
{
|
||||
dataOut[numBytesPerElement*index] = data[offset + numBytesPerElement*index];
|
||||
}
|
||||
break;
|
||||
case STRING:
|
||||
memcpy(dataOut, &data[offset], numElements);
|
||||
break;
|
||||
@ -653,6 +687,12 @@ qint32 UAVObjectField::unpack(const quint8* dataIn)
|
||||
data[offset + numBytesPerElement*index] = dataIn[numBytesPerElement*index];
|
||||
}
|
||||
break;
|
||||
case BITFIELD:
|
||||
for (quint32 index = 0; index < (quint32)(1+(numElements-1)/8); ++index)
|
||||
{
|
||||
data[offset + numBytesPerElement*index] = dataIn[numBytesPerElement*index];
|
||||
}
|
||||
break;
|
||||
case STRING:
|
||||
memcpy(&data[offset], dataIn, numElements);
|
||||
break;
|
||||
@ -661,11 +701,6 @@ qint32 UAVObjectField::unpack(const quint8* dataIn)
|
||||
return getNumBytes();
|
||||
}
|
||||
|
||||
quint32 UAVObjectField::getNumBytesElement()
|
||||
{
|
||||
return numBytesPerElement;
|
||||
}
|
||||
|
||||
bool UAVObjectField::isNumeric()
|
||||
{
|
||||
switch (type)
|
||||
@ -694,6 +729,9 @@ bool UAVObjectField::isNumeric()
|
||||
case ENUM:
|
||||
return false;
|
||||
break;
|
||||
case BITFIELD:
|
||||
return true;
|
||||
break;
|
||||
case STRING:
|
||||
return false;
|
||||
break;
|
||||
@ -730,6 +768,9 @@ bool UAVObjectField::isText()
|
||||
case ENUM:
|
||||
return true;
|
||||
break;
|
||||
case BITFIELD:
|
||||
return false;
|
||||
break;
|
||||
case STRING:
|
||||
return true;
|
||||
break;
|
||||
@ -810,6 +851,14 @@ QVariant UAVObjectField::getValue(quint32 index)
|
||||
return QVariant( options[tmpenum] );
|
||||
break;
|
||||
}
|
||||
case BITFIELD:
|
||||
{
|
||||
quint8 tmpbitfield;
|
||||
memcpy(&tmpbitfield, &data[offset + numBytesPerElement*((quint32)(index/8))], numBytesPerElement);
|
||||
tmpbitfield = (tmpbitfield >> (index % 8)) & 1;
|
||||
return QVariant( tmpbitfield );
|
||||
break;
|
||||
}
|
||||
case STRING:
|
||||
{
|
||||
data[offset + numElements - 1] = '\0';
|
||||
@ -845,6 +894,7 @@ bool UAVObjectField::checkValue(const QVariant& value, quint32 index)
|
||||
case UINT32:
|
||||
case FLOAT32:
|
||||
case STRING:
|
||||
case BITFIELD:
|
||||
return true;
|
||||
break;
|
||||
case ENUM:
|
||||
@ -926,6 +976,14 @@ void UAVObjectField::setValue(const QVariant& value, quint32 index)
|
||||
memcpy(&data[offset + numBytesPerElement*index], &tmpenum, numBytesPerElement);
|
||||
break;
|
||||
}
|
||||
case BITFIELD:
|
||||
{
|
||||
quint8 tmpbitfield;
|
||||
memcpy(&tmpbitfield, &data[offset + numBytesPerElement*((quint32)(index/8))], numBytesPerElement);
|
||||
tmpbitfield = (tmpbitfield & ~(1 << (index % 8))) | ( (value.toUInt()!=0?1:0) << (index % 8) );
|
||||
memcpy(&data[offset + numBytesPerElement*((quint32)(index/8))], &tmpbitfield, numBytesPerElement);
|
||||
break;
|
||||
}
|
||||
case STRING:
|
||||
{
|
||||
QString str = value.toString();
|
||||
|
@ -42,7 +42,7 @@ class UAVOBJECTS_EXPORT UAVObjectField: public QObject
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
typedef enum { INT8 = 0, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, STRING } FieldType;
|
||||
typedef enum { INT8 = 0, INT16, INT32, UINT8, UINT16, UINT32, FLOAT32, ENUM, BITFIELD, STRING } FieldType;
|
||||
typedef enum { EQUAL,NOT_EQUAL,BETWEEN,BIGGER,SMALLER } LimitType;
|
||||
typedef struct
|
||||
{
|
||||
@ -70,7 +70,6 @@ public:
|
||||
void setDouble(double value, quint32 index = 0);
|
||||
quint32 getDataOffset();
|
||||
quint32 getNumBytes();
|
||||
quint32 getNumBytesElement();
|
||||
bool isNumeric();
|
||||
bool isText();
|
||||
QString toString();
|
||||
|
@ -0,0 +1 @@
|
||||
define(_CUSTOM_AC_OUTPUT_, plugins/op-uavtalk/Makefile plugins/op-uavobjects/Makefile)
|
@ -0,0 +1,3 @@
|
||||
_CUSTOM_SUBDIRS_ = \
|
||||
op-uavtalk \
|
||||
op-uavobjects
|
@ -0,0 +1,63 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
include ..\config.nmake
|
||||
|
||||
#
|
||||
# Custom plugin build template.
|
||||
#
|
||||
# If you need to develop a custom plugin (a plugin not yet released to the
|
||||
# public) this file is for you.
|
||||
#
|
||||
# To generate a custom plugin:
|
||||
#
|
||||
# 1. Create the new plugin directory and implement the plugin (at least to be
|
||||
# ready for a first build try). The easiest way to do this is to copy an
|
||||
# existing plugin and modify the contents.
|
||||
# 2. Rename this file to Custom.nmake
|
||||
# 3. Replace every appearance of foo in this file with your plugin dir name
|
||||
# 4. Build Wireshark as usual
|
||||
#
|
||||
|
||||
all: op-uavtalk op-uavobjects
|
||||
|
||||
op-uavtalk::
|
||||
cd op-uavtalk
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
|
||||
cd ..
|
||||
|
||||
op-uavobjects::
|
||||
cd op-uavobjects
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake
|
||||
cd ..
|
||||
|
||||
clean:
|
||||
cd op-uavtalk
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
|
||||
cd ..
|
||||
cd op-uavobjects
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake clean
|
||||
cd ..
|
||||
|
||||
distclean: clean
|
||||
cd op-uavtalk
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
|
||||
cd ..
|
||||
cd op-uavobjects
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake distclean
|
||||
cd ..
|
||||
|
||||
maintainer-clean: distclean
|
||||
cd op-uavtalk
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
|
||||
cd ..
|
||||
cd op-uavobjects
|
||||
$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake maintainer-clean
|
||||
cd ..
|
||||
|
||||
install-plugins:
|
||||
!IFDEF ENABLE_LIBWIRESHARK
|
||||
xcopy op-uavtalk\*.dll ..\$(INSTALL_DIR)\plugins\$(VERSION) /d
|
||||
xcopy op-uavobjects\*.dll ..\$(INSTALL_DIR)\plugins\$(VERSION) /d
|
||||
!ENDIF
|
@ -0,0 +1,3 @@
|
||||
Author:
|
||||
Stacey Sheldon <stac [AT] solidgoldbomb.org>
|
||||
|
@ -0,0 +1,65 @@
|
||||
# CMakeLists.txt
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
set(DISSECTOR_SRC
|
||||
packet-op-uavobjects.c
|
||||
)
|
||||
|
||||
set(PLUGIN_FILES
|
||||
plugin.c
|
||||
${DISSECTOR_SRC}
|
||||
)
|
||||
|
||||
set(CLEAN_FILES
|
||||
${PLUGIN_FILES}
|
||||
)
|
||||
|
||||
if (WERROR)
|
||||
set_source_files_properties(
|
||||
${CLEAN_FILES}
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS -Werror
|
||||
)
|
||||
endif()
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
register_dissector_files(plugin.c
|
||||
plugin
|
||||
${DISSECTOR_SRC}
|
||||
)
|
||||
|
||||
add_library(op_uavobjects ${LINK_MODE_MODULE}
|
||||
${PLUGIN_FILES}
|
||||
)
|
||||
set_target_properties(op_uavobjects PROPERTIES PREFIX "")
|
||||
set_target_properties(op_uavobjects PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
|
||||
target_link_libraries(op-uavobjects)
|
||||
|
||||
install(TARGETS op-uavobjects
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} NAMELINK_SKIP
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION}
|
||||
)
|
||||
|
@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
@ -0,0 +1,3 @@
|
||||
2012-06-16 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
|
||||
* initial version
|
@ -0,0 +1,131 @@
|
||||
# Makefile.am
|
||||
# Automake file for OpenPilot UAVObject Dissector
|
||||
# Copyright 2012, Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
INCLUDES = -I$(top_srcdir) -I$(includedir)
|
||||
|
||||
include Makefile.common
|
||||
|
||||
if HAVE_WARNINGS_AS_ERRORS
|
||||
AM_CFLAGS = -Werror
|
||||
endif
|
||||
|
||||
plugindir = @plugindir@
|
||||
|
||||
plugin_LTLIBRARIES = op_uavobjects.la
|
||||
op_uavobjects_la_SOURCES = \
|
||||
plugin.c \
|
||||
moduleinfo.h \
|
||||
$(DISSECTOR_SRC) \
|
||||
$(DISSECTOR_SUPPORT_SRC) \
|
||||
$(DISSECTOR_INCLUDES)
|
||||
op_uavobjects_la_LDFLAGS = -module -avoid-version
|
||||
op_uavobjects_la_LIBADD = @PLUGIN_LIBS@
|
||||
|
||||
# Libs must be cleared, or else libtool won't create a shared module.
|
||||
# If your module needs to be linked against any particular libraries,
|
||||
# add them here.
|
||||
LIBS =
|
||||
|
||||
#
|
||||
# Build plugin.c, which contains the plugin version[] string, a
|
||||
# function plugin_register() that calls the register routines for all
|
||||
# protocols, and a function plugin_reg_handoff() that calls the handoff
|
||||
# registration routines for all protocols.
|
||||
#
|
||||
# We do this by scanning sources. If that turns out to be too slow,
|
||||
# maybe we could just require every .o file to have an register routine
|
||||
# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
|
||||
#
|
||||
# Formatting conventions: The name of the proto_register_* routines an
|
||||
# proto_reg_handoff_* routines must start in column zero, or must be
|
||||
# preceded only by "void " starting in column zero, and must not be
|
||||
# inside #if.
|
||||
#
|
||||
# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
|
||||
#
|
||||
# For some unknown reason, having a big "for" loop in the Makefile
|
||||
# to scan all the files doesn't work with some "make"s; they seem to
|
||||
# pass only the first few names in the list to the shell, for some
|
||||
# reason.
|
||||
#
|
||||
# Therefore, we have a script to generate the plugin.c file.
|
||||
# The shell script runs slowly, as multiple greps and seds are run
|
||||
# for each input file; this is especially slow on Windows. Therefore,
|
||||
# if Python is present (as indicated by PYTHON being defined), we run
|
||||
# a faster Python script to do that work instead.
|
||||
#
|
||||
# The first argument is the directory in which the source files live.
|
||||
# The second argument is "plugin", to indicate that we should build
|
||||
# a plugin.c file for a plugin.
|
||||
# All subsequent arguments are the files to scan.
|
||||
#
|
||||
plugin.c: $(DISSECTOR_SRC) Makefile.common $(top_srcdir)/tools/make-dissector-reg \
|
||||
$(top_srcdir)/tools/make-dissector-reg.py
|
||||
@if test -n "$(PYTHON)"; then \
|
||||
echo Making plugin.c with python ; \
|
||||
$(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \
|
||||
plugin $(DISSECTOR_SRC) ; \
|
||||
else \
|
||||
echo Making plugin.c with shell script ; \
|
||||
$(top_srcdir)/tools/make-dissector-reg $(srcdir) \
|
||||
$(plugin_src) plugin $(DISSECTOR_SRC) ; \
|
||||
fi
|
||||
|
||||
#
|
||||
# Currently plugin.c can be included in the distribution because
|
||||
# we always build all protocol dissectors. We used to have to check
|
||||
# whether or not to build the snmp dissector. If we again need to
|
||||
# variably build something, making plugin.c non-portable, uncomment
|
||||
# the dist-hook line below.
|
||||
#
|
||||
# Oh, yuk. We don't want to include "plugin.c" in the distribution, as
|
||||
# its contents depend on the configuration, and therefore we want it
|
||||
# to be built when the first "make" is done; however, Automake insists
|
||||
# on putting *all* source into the distribution.
|
||||
#
|
||||
# We work around this by having a "dist-hook" rule that deletes
|
||||
# "plugin.c", so that "dist" won't pick it up.
|
||||
#
|
||||
#dist-hook:
|
||||
# @rm -f $(distdir)/plugin.c
|
||||
|
||||
CLEANFILES = \
|
||||
op-uavobjects \
|
||||
*~
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in \
|
||||
plugin.c
|
||||
|
||||
EXTRA_DIST = \
|
||||
Makefile.common \
|
||||
Makefile.nmake \
|
||||
moduleinfo.nmake \
|
||||
plugin.rc.in \
|
||||
CMakeLists.txt
|
||||
|
||||
|
||||
checkapi:
|
||||
$(PERL) $(top_srcdir)/tools/checkAPIs.pl -g abort -g termoutput -build $(DISSECTOR_SRC) $(DISSECTOR_INCLUDES)
|
@ -0,0 +1,33 @@
|
||||
# Makefile.common for OpenPilot UAVObject Dissector plugin
|
||||
# Contains the stuff from Makefile.am and Makefile.nmake that is
|
||||
# a) common to both files and
|
||||
# b) portable between both files
|
||||
# Copyright 2012 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
|
||||
# the name of the plugin
|
||||
PLUGIN_NAME = op-uavobjects
|
||||
|
||||
# the dissector sources (without any helpers)
|
||||
DISSECTOR_SRC = $(UAVOBJFILENAMES)
|
||||
|
||||
DISSECTOR_INCLUDES =
|
@ -0,0 +1,104 @@
|
||||
# Makefile.nmake
|
||||
# nmake file for Wireshark plugin
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
include ..\..\config.nmake
|
||||
include moduleinfo.nmake
|
||||
|
||||
include Makefile.common
|
||||
|
||||
CFLAGS=$(WARNINGS_ARE_ERRORS) $(STANDARD_CFLAGS) \
|
||||
/I../.. $(GLIB_CFLAGS) \
|
||||
/I$(PCAP_DIR)\include
|
||||
|
||||
.c.obj::
|
||||
$(CC) $(CFLAGS) -Fd.\ -c $<
|
||||
|
||||
LDFLAGS = $(PLUGIN_LDFLAGS)
|
||||
|
||||
!IFDEF ENABLE_LIBWIRESHARK
|
||||
LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib
|
||||
CFLAGS=/D_NEED_VAR_IMPORT_ $(CFLAGS)
|
||||
|
||||
DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)
|
||||
|
||||
DISSECTOR_SUPPORT_OBJECTS = $(DISSECTOR_SUPPORT_SRC:.c=.obj)
|
||||
|
||||
OBJECTS = $(DISSECTOR_OBJECTS) $(DISSECTOR_SUPPORT_OBJECTS) plugin.obj
|
||||
|
||||
RESOURCE=$(PLUGIN_NAME).res
|
||||
|
||||
all: $(PLUGIN_NAME).dll
|
||||
|
||||
$(PLUGIN_NAME).rc : moduleinfo.nmake
|
||||
sed -e s/@PLUGIN_NAME@/$(PLUGIN_NAME)/ \
|
||||
-e s/@RC_MODULE_VERSION@/$(RC_MODULE_VERSION)/ \
|
||||
-e s/@RC_VERSION@/$(RC_VERSION)/ \
|
||||
-e s/@MODULE_VERSION@/$(MODULE_VERSION)/ \
|
||||
-e s/@PACKAGE@/$(PACKAGE)/ \
|
||||
-e s/@VERSION@/$(VERSION)/ \
|
||||
-e s/@MSVC_VARIANT@/$(MSVC_VARIANT)/ \
|
||||
< plugin.rc.in > $@
|
||||
|
||||
$(PLUGIN_NAME).dll $(PLUGIN_NAME).exp $(PLUGIN_NAME).lib : $(OBJECTS) $(LINK_PLUGIN_WITH) $(RESOURCE)
|
||||
link -dll /out:$(PLUGIN_NAME).dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \
|
||||
$(GLIB_LIBS) $(RESOURCE)
|
||||
|
||||
#
|
||||
# Build plugin.c, which contains the plugin version[] string, a
|
||||
# function plugin_register() that calls the register routines for all
|
||||
# protocols, and a function plugin_reg_handoff() that calls the handoff
|
||||
# registration routines for all protocols.
|
||||
#
|
||||
# We do this by scanning sources. If that turns out to be too slow,
|
||||
# maybe we could just require every .o file to have an register routine
|
||||
# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
|
||||
#
|
||||
# Formatting conventions: The name of the proto_register_* routines an
|
||||
# proto_reg_handoff_* routines must start in column zero, or must be
|
||||
# preceded only by "void " starting in column zero, and must not be
|
||||
# inside #if.
|
||||
#
|
||||
# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
|
||||
#
|
||||
# For some unknown reason, having a big "for" loop in the Makefile
|
||||
# to scan all the files doesn't work with some "make"s; they seem to
|
||||
# pass only the first few names in the list to the shell, for some
|
||||
# reason.
|
||||
#
|
||||
# Therefore, we have a script to generate the plugin.c file.
|
||||
# The shell script runs slowly, as multiple greps and seds are run
|
||||
# for each input file; this is especially slow on Windows. Therefore,
|
||||
# if Python is present (as indicated by PYTHON being defined), we run
|
||||
# a faster Python script to do that work instead.
|
||||
#
|
||||
# The first argument is the directory in which the source files live.
|
||||
# The second argument is "plugin", to indicate that we should build
|
||||
# a plugin.c file for a plugin.
|
||||
# All subsequent arguments are the files to scan.
|
||||
#
|
||||
!IFDEF PYTHON
|
||||
plugin.c: $(DISSECTOR_SRC) moduleinfo.h Makefile.common ../../tools/make-dissector-reg.py
|
||||
@echo Making plugin.c (using python)
|
||||
@$(PYTHON) "../../tools/make-dissector-reg.py" . plugin $(DISSECTOR_SRC)
|
||||
!ELSE
|
||||
plugin.c: $(DISSECTOR_SRC) moduleinfo.h Makefile.common ../../tools/make-dissector-reg
|
||||
@echo Making plugin.c (using sh)
|
||||
@$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC)
|
||||
!ENDIF
|
||||
|
||||
!ENDIF
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) $(RESOURCE) plugin.c *.pdb *.sbr \
|
||||
$(PLUGIN_NAME).dll $(PLUGIN_NAME).dll.manifest $(PLUGIN_NAME).lib \
|
||||
$(PLUGIN_NAME).exp $(PLUGIN_NAME).rc
|
||||
|
||||
distclean: clean
|
||||
|
||||
maintainer-clean: distclean
|
||||
|
||||
checkapi:
|
||||
$(PERL) ../../tools/checkAPIs.pl -g abort -g termoutput -build $(DISSECTOR_SRC) $(DISSECTOR_INCLUDES)
|
@ -0,0 +1,16 @@
|
||||
/* Included *after* config.h, in order to re-define these macros */
|
||||
|
||||
#ifdef PACKAGE
|
||||
#undef PACKAGE
|
||||
#endif
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "op-uavobjects"
|
||||
|
||||
|
||||
#ifdef VERSION
|
||||
#undef VERSION
|
||||
#endif
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.0.1"
|
@ -0,0 +1,28 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
# The name
|
||||
PACKAGE=op-uavobjects
|
||||
|
||||
# The version
|
||||
MODULE_VERSION_MAJOR=0
|
||||
MODULE_VERSION_MINOR=0
|
||||
MODULE_VERSION_MICRO=1
|
||||
MODULE_VERSION_EXTRA=0
|
||||
|
||||
#
|
||||
# The RC_VERSION should be comma-separated, not dot-separated,
|
||||
# as per Graham Bloice's message in
|
||||
#
|
||||
# http://www.ethereal.com/lists/ethereal-dev/200303/msg00283.html
|
||||
#
|
||||
# "The RC_VERSION variable in config.nmake should be comma separated.
|
||||
# This allows the resources to be built correctly and the version
|
||||
# number to be correctly displayed in the explorer properties dialog
|
||||
# for the executables, and XP's tooltip, rather than 0.0.0.0."
|
||||
#
|
||||
|
||||
MODULE_VERSION=$(MODULE_VERSION_MAJOR).$(MODULE_VERSION_MINOR).$(MODULE_VERSION_MICRO).$(MODULE_VERSION_EXTRA)
|
||||
RC_MODULE_VERSION=$(MODULE_VERSION_MAJOR),$(MODULE_VERSION_MINOR),$(MODULE_VERSION_MICRO),$(MODULE_VERSION_EXTRA)
|
||||
|
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* !!! Autogenerated from $(XMLFILE) Do NOT Edit !!!
|
||||
*
|
||||
* Routines for OpenPilot UAVObject dissection
|
||||
* Copyright 2012 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Wireshark - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@wireshark.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <epan/packet.h>
|
||||
#include <epan/ptvcursor.h> /* ptvcursor_* */
|
||||
|
||||
#include <glib.h>
|
||||
#include <string.h>
|
||||
|
||||
static int proto_uavo = -1;
|
||||
|
||||
/* Subtree expansion tracking */
|
||||
$(SUBTREESTATICS)
|
||||
|
||||
/* Field handles */
|
||||
$(FIELDHANDLES)
|
||||
|
||||
/* Enum string mappings */
|
||||
$(ENUMFIELDNAMES)
|
||||
|
||||
void proto_reg_handoff_op_uavobjects_$(NAMELC)(void);
|
||||
|
||||
static int dissect_uavo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
int offset = 0;
|
||||
|
||||
col_append_str(pinfo->cinfo, COL_INFO, "($(NAME))");
|
||||
|
||||
if (tree) { /* we are being asked for details */
|
||||
proto_tree *uavo_tree = NULL;
|
||||
ptvcursor_t * cursor;
|
||||
proto_item *ti = NULL;
|
||||
|
||||
/* Add a top-level entry to the dissector tree for this protocol */
|
||||
ti = proto_tree_add_item(tree, proto_uavo, tvb, 0, -1, ENC_NA);
|
||||
|
||||
/* Create a subtree to contain the dissection of this protocol */
|
||||
uavo_tree = proto_item_add_subtree(ti, ett_uavo);
|
||||
|
||||
/* Dissect the packet and populate the subtree */
|
||||
cursor = ptvcursor_new(uavo_tree, tvb, 0);
|
||||
|
||||
/* Populate the fields in this protocol */
|
||||
$(POPULATETREE)
|
||||
|
||||
offset += ptvcursor_current_offset(cursor);
|
||||
|
||||
ptvcursor_free(cursor);
|
||||
} else {
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
void proto_register_op_objects_$(NAMELC)(void)
|
||||
{
|
||||
$(HEADERFIELDS)
|
||||
|
||||
/* Setup protocol subtree array */
|
||||
|
||||
static gint *ett[] = {
|
||||
$(SUBTREES)
|
||||
};
|
||||
|
||||
/* Register this protocol */
|
||||
proto_uavo = proto_register_protocol("UAVO $(NAME)",
|
||||
"UAVO $(NAME)",
|
||||
"uavo-$(NAMELC)");
|
||||
|
||||
/* Register the field definitions for this protocol */
|
||||
proto_register_subtree_array(ett, array_length(ett));
|
||||
proto_register_field_array(proto_uavo, hf, array_length(hf));
|
||||
}
|
||||
|
||||
void proto_reg_handoff_op_uavobjects_$(NAMELC)(void)
|
||||
{
|
||||
dissector_handle_t uavo_handle;
|
||||
uavo_handle = new_create_dissector_handle(dissect_uavo, proto_uavo);
|
||||
|
||||
/* Bind this protocol to its UAV ObjID in UAVTalk */
|
||||
dissector_add("uavtalk.objid", $(OBJIDHEX), uavo_handle);
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
#include "winver.h"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION @RC_MODULE_VERSION@
|
||||
PRODUCTVERSION @RC_VERSION@
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "The Wireshark developer community, http://www.wireshark.org/\0"
|
||||
VALUE "FileDescription", "@PACKAGE@ dissector\0"
|
||||
VALUE "FileVersion", "@MODULE_VERSION@\0"
|
||||
VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
|
||||
VALUE "LegalCopyright", "Copyright © 1998 Gerald Combs <gerald@wireshark.org>, Gilbert Ramirez <gram@alumni.rice.edu> and others\0"
|
||||
VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
|
||||
VALUE "ProductName", "Wireshark\0"
|
||||
VALUE "ProductVersion", "@VERSION@\0"
|
||||
VALUE "Comments", "Build with @MSVC_VARIANT@\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
@ -0,0 +1,3 @@
|
||||
Author:
|
||||
Stacey Sheldon <stac [AT] solidgoldbomb.org>
|
||||
|
@ -0,0 +1,65 @@
|
||||
# CMakeLists.txt
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
set(DISSECTOR_SRC
|
||||
packet-op-uavtalk.c
|
||||
)
|
||||
|
||||
set(PLUGIN_FILES
|
||||
plugin.c
|
||||
${DISSECTOR_SRC}
|
||||
)
|
||||
|
||||
set(CLEAN_FILES
|
||||
${PLUGIN_FILES}
|
||||
)
|
||||
|
||||
if (WERROR)
|
||||
set_source_files_properties(
|
||||
${CLEAN_FILES}
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS -Werror
|
||||
)
|
||||
endif()
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
register_dissector_files(plugin.c
|
||||
plugin
|
||||
${DISSECTOR_SRC}
|
||||
)
|
||||
|
||||
add_library(unistim ${LINK_MODE_MODULE}
|
||||
${PLUGIN_FILES}
|
||||
)
|
||||
set_target_properties(unistim PROPERTIES PREFIX "")
|
||||
set_target_properties(unistim PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
|
||||
|
||||
target_link_libraries(op-uavtalk)
|
||||
|
||||
install(TARGETS op-uavtalk
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION} NAMELINK_SKIP
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/@CPACK_PACKAGE_NAME@/plugins/${CPACK_PACKAGE_VERSION}
|
||||
)
|
||||
|
@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
@ -0,0 +1,3 @@
|
||||
2012-06-16 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
|
||||
* initial version
|
@ -0,0 +1,131 @@
|
||||
# Makefile.am
|
||||
# Automake file for OpenPilot UAVTalk protocol
|
||||
# Copyright 2012, Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
INCLUDES = -I$(top_srcdir) -I$(includedir)
|
||||
|
||||
include Makefile.common
|
||||
|
||||
if HAVE_WARNINGS_AS_ERRORS
|
||||
AM_CFLAGS = -Werror
|
||||
endif
|
||||
|
||||
plugindir = @plugindir@
|
||||
|
||||
plugin_LTLIBRARIES = op_uavtalk.la
|
||||
op_uavtalk_la_SOURCES = \
|
||||
plugin.c \
|
||||
moduleinfo.h \
|
||||
$(DISSECTOR_SRC) \
|
||||
$(DISSECTOR_SUPPORT_SRC) \
|
||||
$(DISSECTOR_INCLUDES)
|
||||
op_uavtalk_la_LDFLAGS = -module -avoid-version
|
||||
op_uavtalk_la_LIBADD = @PLUGIN_LIBS@
|
||||
|
||||
# Libs must be cleared, or else libtool won't create a shared module.
|
||||
# If your module needs to be linked against any particular libraries,
|
||||
# add them here.
|
||||
LIBS =
|
||||
|
||||
#
|
||||
# Build plugin.c, which contains the plugin version[] string, a
|
||||
# function plugin_register() that calls the register routines for all
|
||||
# protocols, and a function plugin_reg_handoff() that calls the handoff
|
||||
# registration routines for all protocols.
|
||||
#
|
||||
# We do this by scanning sources. If that turns out to be too slow,
|
||||
# maybe we could just require every .o file to have an register routine
|
||||
# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
|
||||
#
|
||||
# Formatting conventions: The name of the proto_register_* routines an
|
||||
# proto_reg_handoff_* routines must start in column zero, or must be
|
||||
# preceded only by "void " starting in column zero, and must not be
|
||||
# inside #if.
|
||||
#
|
||||
# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
|
||||
#
|
||||
# For some unknown reason, having a big "for" loop in the Makefile
|
||||
# to scan all the files doesn't work with some "make"s; they seem to
|
||||
# pass only the first few names in the list to the shell, for some
|
||||
# reason.
|
||||
#
|
||||
# Therefore, we have a script to generate the plugin.c file.
|
||||
# The shell script runs slowly, as multiple greps and seds are run
|
||||
# for each input file; this is especially slow on Windows. Therefore,
|
||||
# if Python is present (as indicated by PYTHON being defined), we run
|
||||
# a faster Python script to do that work instead.
|
||||
#
|
||||
# The first argument is the directory in which the source files live.
|
||||
# The second argument is "plugin", to indicate that we should build
|
||||
# a plugin.c file for a plugin.
|
||||
# All subsequent arguments are the files to scan.
|
||||
#
|
||||
plugin.c: $(DISSECTOR_SRC) Makefile.common $(top_srcdir)/tools/make-dissector-reg \
|
||||
$(top_srcdir)/tools/make-dissector-reg.py
|
||||
@if test -n "$(PYTHON)"; then \
|
||||
echo Making plugin.c with python ; \
|
||||
$(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \
|
||||
plugin $(DISSECTOR_SRC) ; \
|
||||
else \
|
||||
echo Making plugin.c with shell script ; \
|
||||
$(top_srcdir)/tools/make-dissector-reg $(srcdir) \
|
||||
$(plugin_src) plugin $(DISSECTOR_SRC) ; \
|
||||
fi
|
||||
|
||||
#
|
||||
# Currently plugin.c can be included in the distribution because
|
||||
# we always build all protocol dissectors. We used to have to check
|
||||
# whether or not to build the snmp dissector. If we again need to
|
||||
# variably build something, making plugin.c non-portable, uncomment
|
||||
# the dist-hook line below.
|
||||
#
|
||||
# Oh, yuk. We don't want to include "plugin.c" in the distribution, as
|
||||
# its contents depend on the configuration, and therefore we want it
|
||||
# to be built when the first "make" is done; however, Automake insists
|
||||
# on putting *all* source into the distribution.
|
||||
#
|
||||
# We work around this by having a "dist-hook" rule that deletes
|
||||
# "plugin.c", so that "dist" won't pick it up.
|
||||
#
|
||||
#dist-hook:
|
||||
# @rm -f $(distdir)/plugin.c
|
||||
|
||||
CLEANFILES = \
|
||||
op-uavtalk \
|
||||
*~
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in \
|
||||
plugin.c
|
||||
|
||||
EXTRA_DIST = \
|
||||
Makefile.common \
|
||||
Makefile.nmake \
|
||||
moduleinfo.nmake \
|
||||
plugin.rc.in \
|
||||
CMakeLists.txt
|
||||
|
||||
|
||||
checkapi:
|
||||
$(PERL) $(top_srcdir)/tools/checkAPIs.pl -g abort -g termoutput -build $(DISSECTOR_SRC) $(DISSECTOR_INCLUDES)
|
@ -0,0 +1,34 @@
|
||||
# Makefile.common for OpenPilot UAVTalk plugin
|
||||
# Contains the stuff from Makefile.am and Makefile.nmake that is
|
||||
# a) common to both files and
|
||||
# b) portable between both files
|
||||
# Copyright 2012 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Wireshark - Network traffic analyzer
|
||||
# By Gerald Combs <gerald@wireshark.org>
|
||||
# Copyright 1998 Gerald Combs
|
||||
#
|
||||
# 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.
|
||||
|
||||
# the name of the plugin
|
||||
PLUGIN_NAME = op-uavtalk
|
||||
|
||||
# the dissector sources (without any helpers)
|
||||
DISSECTOR_SRC = \
|
||||
packet-op-uavtalk.c
|
||||
|
||||
DISSECTOR_INCLUDES =
|
@ -0,0 +1,104 @@
|
||||
# Makefile.nmake
|
||||
# nmake file for Wireshark plugin
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
include ..\..\config.nmake
|
||||
include moduleinfo.nmake
|
||||
|
||||
include Makefile.common
|
||||
|
||||
CFLAGS=$(WARNINGS_ARE_ERRORS) $(STANDARD_CFLAGS) \
|
||||
/I../.. $(GLIB_CFLAGS) \
|
||||
/I$(PCAP_DIR)\include
|
||||
|
||||
.c.obj::
|
||||
$(CC) $(CFLAGS) -Fd.\ -c $<
|
||||
|
||||
LDFLAGS = $(PLUGIN_LDFLAGS)
|
||||
|
||||
!IFDEF ENABLE_LIBWIRESHARK
|
||||
LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib
|
||||
CFLAGS=/D_NEED_VAR_IMPORT_ $(CFLAGS)
|
||||
|
||||
DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)
|
||||
|
||||
DISSECTOR_SUPPORT_OBJECTS = $(DISSECTOR_SUPPORT_SRC:.c=.obj)
|
||||
|
||||
OBJECTS = $(DISSECTOR_OBJECTS) $(DISSECTOR_SUPPORT_OBJECTS) plugin.obj
|
||||
|
||||
RESOURCE=$(PLUGIN_NAME).res
|
||||
|
||||
all: $(PLUGIN_NAME).dll
|
||||
|
||||
$(PLUGIN_NAME).rc : moduleinfo.nmake
|
||||
sed -e s/@PLUGIN_NAME@/$(PLUGIN_NAME)/ \
|
||||
-e s/@RC_MODULE_VERSION@/$(RC_MODULE_VERSION)/ \
|
||||
-e s/@RC_VERSION@/$(RC_VERSION)/ \
|
||||
-e s/@MODULE_VERSION@/$(MODULE_VERSION)/ \
|
||||
-e s/@PACKAGE@/$(PACKAGE)/ \
|
||||
-e s/@VERSION@/$(VERSION)/ \
|
||||
-e s/@MSVC_VARIANT@/$(MSVC_VARIANT)/ \
|
||||
< plugin.rc.in > $@
|
||||
|
||||
$(PLUGIN_NAME).dll $(PLUGIN_NAME).exp $(PLUGIN_NAME).lib : $(OBJECTS) $(LINK_PLUGIN_WITH) $(RESOURCE)
|
||||
link -dll /out:$(PLUGIN_NAME).dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \
|
||||
$(GLIB_LIBS) $(RESOURCE)
|
||||
|
||||
#
|
||||
# Build plugin.c, which contains the plugin version[] string, a
|
||||
# function plugin_register() that calls the register routines for all
|
||||
# protocols, and a function plugin_reg_handoff() that calls the handoff
|
||||
# registration routines for all protocols.
|
||||
#
|
||||
# We do this by scanning sources. If that turns out to be too slow,
|
||||
# maybe we could just require every .o file to have an register routine
|
||||
# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
|
||||
#
|
||||
# Formatting conventions: The name of the proto_register_* routines an
|
||||
# proto_reg_handoff_* routines must start in column zero, or must be
|
||||
# preceded only by "void " starting in column zero, and must not be
|
||||
# inside #if.
|
||||
#
|
||||
# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
|
||||
#
|
||||
# For some unknown reason, having a big "for" loop in the Makefile
|
||||
# to scan all the files doesn't work with some "make"s; they seem to
|
||||
# pass only the first few names in the list to the shell, for some
|
||||
# reason.
|
||||
#
|
||||
# Therefore, we have a script to generate the plugin.c file.
|
||||
# The shell script runs slowly, as multiple greps and seds are run
|
||||
# for each input file; this is especially slow on Windows. Therefore,
|
||||
# if Python is present (as indicated by PYTHON being defined), we run
|
||||
# a faster Python script to do that work instead.
|
||||
#
|
||||
# The first argument is the directory in which the source files live.
|
||||
# The second argument is "plugin", to indicate that we should build
|
||||
# a plugin.c file for a plugin.
|
||||
# All subsequent arguments are the files to scan.
|
||||
#
|
||||
!IFDEF PYTHON
|
||||
plugin.c: $(DISSECTOR_SRC) moduleinfo.h Makefile.common ../../tools/make-dissector-reg.py
|
||||
@echo Making plugin.c (using python)
|
||||
@$(PYTHON) "../../tools/make-dissector-reg.py" . plugin $(DISSECTOR_SRC)
|
||||
!ELSE
|
||||
plugin.c: $(DISSECTOR_SRC) moduleinfo.h Makefile.common ../../tools/make-dissector-reg
|
||||
@echo Making plugin.c (using sh)
|
||||
@$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC)
|
||||
!ENDIF
|
||||
|
||||
!ENDIF
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) $(RESOURCE) plugin.c *.pdb *.sbr \
|
||||
$(PLUGIN_NAME).dll $(PLUGIN_NAME).dll.manifest $(PLUGIN_NAME).lib \
|
||||
$(PLUGIN_NAME).exp $(PLUGIN_NAME).rc
|
||||
|
||||
distclean: clean
|
||||
|
||||
maintainer-clean: distclean
|
||||
|
||||
checkapi:
|
||||
$(PERL) ../../tools/checkAPIs.pl -g abort -g termoutput -build $(DISSECTOR_SRC) $(DISSECTOR_INCLUDES)
|
@ -0,0 +1,16 @@
|
||||
/* Included *after* config.h, in order to re-define these macros */
|
||||
|
||||
#ifdef PACKAGE
|
||||
#undef PACKAGE
|
||||
#endif
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "op-uavtalk"
|
||||
|
||||
|
||||
#ifdef VERSION
|
||||
#undef VERSION
|
||||
#endif
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.0.1"
|
@ -0,0 +1,28 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
# The name
|
||||
PACKAGE=op-uavtalk
|
||||
|
||||
# The version
|
||||
MODULE_VERSION_MAJOR=0
|
||||
MODULE_VERSION_MINOR=0
|
||||
MODULE_VERSION_MICRO=1
|
||||
MODULE_VERSION_EXTRA=0
|
||||
|
||||
#
|
||||
# The RC_VERSION should be comma-separated, not dot-separated,
|
||||
# as per Graham Bloice's message in
|
||||
#
|
||||
# http://www.ethereal.com/lists/ethereal-dev/200303/msg00283.html
|
||||
#
|
||||
# "The RC_VERSION variable in config.nmake should be comma separated.
|
||||
# This allows the resources to be built correctly and the version
|
||||
# number to be correctly displayed in the explorer properties dialog
|
||||
# for the executables, and XP's tooltip, rather than 0.0.0.0."
|
||||
#
|
||||
|
||||
MODULE_VERSION=$(MODULE_VERSION_MAJOR).$(MODULE_VERSION_MINOR).$(MODULE_VERSION_MICRO).$(MODULE_VERSION_EXTRA)
|
||||
RC_MODULE_VERSION=$(MODULE_VERSION_MAJOR),$(MODULE_VERSION_MINOR),$(MODULE_VERSION_MICRO),$(MODULE_VERSION_EXTRA)
|
||||
|
@ -0,0 +1,205 @@
|
||||
/* packet-op-uavtalk.c
|
||||
* Routines for OpenPilot UAVTalk packet dissection
|
||||
* Copyright 2012 Stacey Sheldon <stac@solidgoldbomb.org>
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* Wireshark - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@wireshark.org>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <epan/packet.h>
|
||||
#include <epan/prefs.h>
|
||||
#include <epan/ptvcursor.h> /* ptvcursor_* */
|
||||
|
||||
#include <glib.h>
|
||||
#include <string.h>
|
||||
|
||||
static guint global_op_uavtalk_port = 9000;
|
||||
|
||||
static int proto_op_uavtalk = -1;
|
||||
|
||||
static gint ett_op_uavtalk = -1;
|
||||
|
||||
static dissector_handle_t data_handle;
|
||||
static dissector_table_t uavtalk_subdissector_table;
|
||||
|
||||
static int hf_op_uavtalk_sync = -1;
|
||||
static int hf_op_uavtalk_version = -1;
|
||||
static int hf_op_uavtalk_type = -1;
|
||||
static int hf_op_uavtalk_len = -1;
|
||||
static int hf_op_uavtalk_objid = -1;
|
||||
static int hf_op_uavtalk_crc8 = -1;
|
||||
|
||||
#define UAVTALK_SYNC_VAL 0x3C
|
||||
|
||||
static const value_string uavtalk_packet_types[]={
|
||||
{ 0, "TxObj" },
|
||||
{ 1, "GetObj" },
|
||||
{ 2, "SetObjAckd" },
|
||||
{ 3, "Ack" },
|
||||
{ 4, "Nack" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
void proto_reg_handoff_op_uavtalk(void);
|
||||
|
||||
#define UAVTALK_HEADER_SIZE 8
|
||||
#define UAVTALK_TRAILER_SIZE 1
|
||||
static int dissect_op_uavtalk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
gint offset = 0;
|
||||
|
||||
guint8 packet_type = tvb_get_guint8(tvb, 1) & 0x7;
|
||||
guint32 objid = tvb_get_letohl(tvb, 4);
|
||||
guint32 payload_length = tvb_get_letohs(tvb, 2) - UAVTALK_HEADER_SIZE - UAVTALK_TRAILER_SIZE;
|
||||
guint32 reported_length = tvb_reported_length(tvb);
|
||||
|
||||
col_set_str(pinfo->cinfo, COL_PROTOCOL, "UAVTALK");
|
||||
/* Clear out stuff in the info column */
|
||||
col_clear(pinfo->cinfo, COL_INFO);
|
||||
|
||||
col_append_fstr(pinfo->cinfo, COL_INFO, "%s: 0x%08x", val_to_str_const(packet_type, uavtalk_packet_types, ""), objid);
|
||||
if (objid & 0x1) {
|
||||
col_append_str(pinfo->cinfo, COL_INFO, "(META)");
|
||||
}
|
||||
|
||||
|
||||
if (tree) { /* we are being asked for details */
|
||||
proto_tree *op_uavtalk_tree = NULL;
|
||||
ptvcursor_t * cursor;
|
||||
proto_item *ti = NULL;
|
||||
|
||||
/* Add a top-level entry to the dissector tree for this protocol */
|
||||
ti = proto_tree_add_item(tree, proto_op_uavtalk, tvb, 0, -1, ENC_NA);
|
||||
|
||||
/* Create a subtree to contain the dissection of this protocol */
|
||||
op_uavtalk_tree = proto_item_add_subtree(ti, ett_op_uavtalk);
|
||||
|
||||
/* Dissect the packet and populate the subtree */
|
||||
cursor = ptvcursor_new(op_uavtalk_tree, tvb, 0);
|
||||
|
||||
/* Populate the fields in this protocol */
|
||||
ptvcursor_add(cursor, hf_op_uavtalk_sync, 1, ENC_LITTLE_ENDIAN);
|
||||
ptvcursor_add_no_advance(cursor, hf_op_uavtalk_version, 1, ENC_LITTLE_ENDIAN);
|
||||
ptvcursor_add(cursor, hf_op_uavtalk_type, 1, ENC_LITTLE_ENDIAN);
|
||||
ptvcursor_add(cursor, hf_op_uavtalk_len, 2, ENC_LITTLE_ENDIAN);
|
||||
ptvcursor_add(cursor, hf_op_uavtalk_objid, 4, ENC_LITTLE_ENDIAN);
|
||||
|
||||
offset = ptvcursor_current_offset(cursor);
|
||||
|
||||
ptvcursor_free(cursor);
|
||||
|
||||
proto_tree_add_item(op_uavtalk_tree, hf_op_uavtalk_crc8, tvb, reported_length - UAVTALK_TRAILER_SIZE, UAVTALK_TRAILER_SIZE, ENC_LITTLE_ENDIAN);
|
||||
} else {
|
||||
offset = UAVTALK_HEADER_SIZE;
|
||||
}
|
||||
|
||||
{
|
||||
tvbuff_t * next_tvb = tvb_new_subset(tvb, offset,
|
||||
reported_length - UAVTALK_HEADER_SIZE - UAVTALK_TRAILER_SIZE,
|
||||
payload_length);
|
||||
|
||||
/* Check if we have an embedded objid to decode */
|
||||
if ((packet_type == 0) || (packet_type == 2)) {
|
||||
/* Call any registered subdissector for this objid */
|
||||
if (!dissector_try_uint(uavtalk_subdissector_table, objid, next_tvb, pinfo, tree)) {
|
||||
/* No subdissector registered, use the default data dissector */
|
||||
call_dissector(data_handle, next_tvb, pinfo, tree);
|
||||
}
|
||||
} else {
|
||||
/* Render any remaining data as raw bytes */
|
||||
call_dissector(data_handle, next_tvb, pinfo, tree);
|
||||
}
|
||||
}
|
||||
|
||||
return UAVTALK_HEADER_SIZE + UAVTALK_TRAILER_SIZE;
|
||||
}
|
||||
|
||||
void proto_register_op_uavtalk(void)
|
||||
{
|
||||
module_t * op_uavtalk_module;
|
||||
|
||||
static hf_register_info hf[] = {
|
||||
{ &hf_op_uavtalk_sync,
|
||||
{ "Sync Byte", "uavtalk.sync", FT_UINT8,
|
||||
BASE_HEX, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_op_uavtalk_version,
|
||||
{ "Version", "uavtalk.ver", FT_UINT8,
|
||||
BASE_DEC, NULL, 0xf8, NULL, HFILL }
|
||||
},
|
||||
{ &hf_op_uavtalk_type,
|
||||
{ "Type", "uavtalk.type", FT_UINT8,
|
||||
BASE_HEX, VALS(uavtalk_packet_types), 0x07, NULL, HFILL }
|
||||
},
|
||||
{ &hf_op_uavtalk_len,
|
||||
{ "Length", "uavtalk.len", FT_UINT16,
|
||||
BASE_DEC, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_op_uavtalk_objid,
|
||||
{ "ObjID", "uavtalk.objid", FT_UINT32,
|
||||
BASE_HEX, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
{ &hf_op_uavtalk_crc8,
|
||||
{ "Crc8", "uavtalk.crc8", FT_UINT8,
|
||||
BASE_HEX, NULL, 0x0, NULL, HFILL }
|
||||
},
|
||||
};
|
||||
|
||||
/* Setup protocol subtree array */
|
||||
|
||||
static gint *ett[] = {
|
||||
&ett_op_uavtalk
|
||||
};
|
||||
|
||||
proto_op_uavtalk = proto_register_protocol("OpenPilot UAVTalk Protocol",
|
||||
"UAVTALK",
|
||||
"uavtalk");
|
||||
|
||||
/* Allow subdissectors for each objid to bind for decoding */
|
||||
uavtalk_subdissector_table = register_dissector_table("uavtalk.objid", "UAVObject ID", FT_UINT32, BASE_HEX);
|
||||
|
||||
proto_register_subtree_array(ett, array_length(ett));
|
||||
proto_register_field_array(proto_op_uavtalk, hf, array_length(hf));
|
||||
|
||||
op_uavtalk_module = prefs_register_protocol(proto_op_uavtalk, proto_reg_handoff_op_uavtalk);
|
||||
|
||||
prefs_register_uint_preference(op_uavtalk_module, "udp.port", "UAVTALK UDP port",
|
||||
"UAVTALK port (default 9000)", 10, &global_op_uavtalk_port);
|
||||
}
|
||||
|
||||
void proto_reg_handoff_op_uavtalk(void)
|
||||
{
|
||||
static dissector_handle_t op_uavtalk_handle;
|
||||
|
||||
op_uavtalk_handle = new_create_dissector_handle(dissect_op_uavtalk, proto_op_uavtalk);
|
||||
dissector_add_handle("udp.port", op_uavtalk_handle); /* for "decode as" */
|
||||
|
||||
if (global_op_uavtalk_port != 0) {
|
||||
dissector_add_uint("udp.port", global_op_uavtalk_port, op_uavtalk_handle);
|
||||
}
|
||||
|
||||
/* Lookup the default dissector for raw data */
|
||||
data_handle = find_dissector("data");
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
#include "winver.h"
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION @RC_MODULE_VERSION@
|
||||
PRODUCTVERSION @RC_VERSION@
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS VS_FF_DEBUG
|
||||
#else
|
||||
FILEFLAGS 0
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "The Wireshark developer community, http://www.wireshark.org/\0"
|
||||
VALUE "FileDescription", "@PACKAGE@ dissector\0"
|
||||
VALUE "FileVersion", "@MODULE_VERSION@\0"
|
||||
VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
|
||||
VALUE "LegalCopyright", "Copyright © 1998 Gerald Combs <gerald@wireshark.org>, Gilbert Ramirez <gram@alumni.rice.edu> and others\0"
|
||||
VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
|
||||
VALUE "ProductName", "Wireshark\0"
|
||||
VALUE "ProductVersion", "@VERSION@\0"
|
||||
VALUE "Comments", "Build with @MSVC_VARIANT@\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
@ -37,8 +37,9 @@ void replaceCommonTags(QString& out, ObjectInfo* info)
|
||||
{
|
||||
|
||||
QStringList updateModeStr,accessModeStr;
|
||||
updateModeStr << "UPDATEMODE_PERIODIC" << "UPDATEMODE_ONCHANGE"
|
||||
<< "UPDATEMODE_THROTTLED" << "UPDATEMODE_MANUAL";
|
||||
updateModeStr << "UPDATEMODE_MANUAL" << "UPDATEMODE_PERIODIC"
|
||||
<< "UPDATEMODE_ONCHANGE"
|
||||
<< "UPDATEMODE_THROTTLED";
|
||||
|
||||
accessModeStr << "ACCESS_READWRITE" << "ACCESS_READONLY";
|
||||
|
||||
|
@ -0,0 +1,290 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file uavobjectgeneratorflight.cpp
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @brief produce flight code for uavobjects
|
||||
*
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* 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 3 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
|
||||
*/
|
||||
|
||||
#include "uavobjectgeneratorwireshark.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool UAVObjectGeneratorWireshark::generate(UAVObjectParser* parser,QString templatepath,QString outputpath) {
|
||||
|
||||
fieldTypeStrHf << "FT_INT8" << "FT_INT16" << "FT_INT32" <<"FT_UINT8"
|
||||
<<"FT_UINT16" << "FT_UINT32" << "FT_FLOAT" << "FT_UINT8";
|
||||
fieldTypeStrGlib << "gint8" << "gint16" << "gint32" <<"guint8"
|
||||
<<"guint16" << "guint32" << "gfloat" << "guint8";
|
||||
|
||||
wiresharkCodePath = QDir( templatepath + QString("ground/openpilotgcs/src/plugins/uavobjects/wireshark"));
|
||||
|
||||
wiresharkOutputPath = QDir( outputpath + QString("wireshark") );
|
||||
wiresharkOutputPath.mkpath(wiresharkOutputPath.absolutePath());
|
||||
|
||||
wiresharkCodeTemplate = readFile( wiresharkCodePath.absoluteFilePath("op-uavobjects/packet-op-uavobjects-template.c") );
|
||||
wiresharkMakeTemplate = readFile( wiresharkCodePath.absoluteFilePath("op-uavobjects/Makefile.common-template") );
|
||||
|
||||
if ( wiresharkCodeTemplate.isNull() || wiresharkMakeTemplate.isNull()) {
|
||||
cerr << "Error: Could not open wireshark template files." << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Copy static files for wireshark plugins root directory into output directory */
|
||||
QStringList topstaticfiles;
|
||||
topstaticfiles << "Custom.m4" << "Custom.make" << "Custom.nmake";
|
||||
for (int i = 0; i < topstaticfiles.length(); ++i) {
|
||||
QFile::copy(wiresharkCodePath.absoluteFilePath(topstaticfiles[i]),
|
||||
wiresharkOutputPath.absoluteFilePath(topstaticfiles[i]));
|
||||
}
|
||||
|
||||
/* Copy static files for op-uavtalk dissector into output directory */
|
||||
QDir uavtalkOutputPath = QDir( outputpath + QString("wireshark/op-uavtalk") );
|
||||
uavtalkOutputPath.mkpath(uavtalkOutputPath.absolutePath());
|
||||
QStringList uavtalkstaticfiles;
|
||||
uavtalkstaticfiles << "AUTHORS" << "COPYING" << "ChangeLog";
|
||||
uavtalkstaticfiles << "CMakeLists.txt" << "Makefile.nmake";
|
||||
uavtalkstaticfiles << "Makefile.am" << "moduleinfo.h" << "moduleinfo.nmake";
|
||||
uavtalkstaticfiles << "plugin.rc.in";
|
||||
uavtalkstaticfiles << "Makefile.common" << "packet-op-uavtalk.c";
|
||||
for (int i = 0; i < uavtalkstaticfiles.length(); ++i) {
|
||||
QFile::copy(wiresharkCodePath.absoluteFilePath("op-uavtalk/" + uavtalkstaticfiles[i]),
|
||||
uavtalkOutputPath.absoluteFilePath(uavtalkstaticfiles[i]));
|
||||
}
|
||||
|
||||
/* Copy static files for op-uavobjects dissector into output directory */
|
||||
QDir uavobjectsOutputPath = QDir( outputpath + QString("wireshark/op-uavobjects") );
|
||||
uavobjectsOutputPath.mkpath(uavobjectsOutputPath.absolutePath());
|
||||
QStringList uavostaticfiles;
|
||||
uavostaticfiles << "AUTHORS" << "COPYING" << "ChangeLog";
|
||||
uavostaticfiles << "CMakeLists.txt" << "Makefile.nmake";
|
||||
uavostaticfiles << "Makefile.am" << "moduleinfo.h" << "moduleinfo.nmake";
|
||||
uavostaticfiles << "plugin.rc.in";
|
||||
for (int i = 0; i < uavostaticfiles.length(); ++i) {
|
||||
QFile::copy(wiresharkCodePath.absoluteFilePath("op-uavobjects/" + uavostaticfiles[i]),
|
||||
uavobjectsOutputPath.absoluteFilePath(uavostaticfiles[i]));
|
||||
}
|
||||
|
||||
/* Generate the per-object files from the templates, and keep track of the list of generated filenames */
|
||||
QString objFileNames;
|
||||
for (int objidx = 0; objidx < parser->getNumObjects(); ++objidx) {
|
||||
ObjectInfo* info = parser->getObjectByIndex(objidx);
|
||||
process_object(info, uavobjectsOutputPath);
|
||||
objFileNames.append(" packet-op-uavobjects-" + info->namelc + ".c");
|
||||
}
|
||||
|
||||
/* Write the uavobject dissector's Makefile.common */
|
||||
wiresharkMakeTemplate.replace( QString("$(UAVOBJFILENAMES)"), objFileNames);
|
||||
bool res = writeFileIfDiffrent( uavobjectsOutputPath.absolutePath() + "/Makefile.common",
|
||||
wiresharkMakeTemplate );
|
||||
if (!res) {
|
||||
cout << "Error: Could not write wireshark Makefile" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate the Flight object files
|
||||
**/
|
||||
bool UAVObjectGeneratorWireshark::process_object(ObjectInfo* info, QDir outputpath)
|
||||
{
|
||||
if (info == NULL)
|
||||
return false;
|
||||
|
||||
// Prepare output strings
|
||||
QString outCode = wiresharkCodeTemplate;
|
||||
|
||||
// Replace common tags
|
||||
replaceCommonTags(outCode, info);
|
||||
|
||||
// Replace the $(SUBTREES) and $(SUBTREESTATICS) tags
|
||||
QString subtrees;
|
||||
QString subtreestatics;
|
||||
subtreestatics.append( QString("static gint ett_uavo = -1;\r\n") );
|
||||
subtrees.append( QString("&ett_uavo,\r\n") );
|
||||
for (int n = 0; n < info->fields.length(); ++n) {
|
||||
if (info->fields[n]->numElements > 1) {
|
||||
/* Reserve a subtree for each array */
|
||||
subtreestatics.append( QString("static gint ett_%1_%2 = -1;\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name) );
|
||||
subtrees.append( QString("&ett_%1_%2,\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name) );
|
||||
}
|
||||
}
|
||||
outCode.replace(QString("$(SUBTREES)"), subtrees);
|
||||
outCode.replace(QString("$(SUBTREESTATICS)"), subtreestatics);
|
||||
|
||||
// Replace the $(FIELDHANDLES) tag
|
||||
QString type;
|
||||
QString fields;
|
||||
for (int n = 0; n < info->fields.length(); ++n) {
|
||||
fields.append( QString("static int hf_op_uavobjects_%1_%2 = -1;\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name));
|
||||
if (info->fields[n]->numElements > 1) {
|
||||
QStringList elemNames = info->fields[n]->elementNames;
|
||||
for (int m = 0; m < elemNames.length(); ++m) {
|
||||
fields.append( QString("static int hf_op_uavobjects_%1_%2_%3 = -1;\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name)
|
||||
.arg(elemNames[m]) );
|
||||
}
|
||||
}
|
||||
}
|
||||
outCode.replace(QString("$(FIELDHANDLES)"), fields);
|
||||
|
||||
// Replace the $(ENUMFIELDNAMES) tag
|
||||
QString enums;
|
||||
for (int n = 0; n < info->fields.length(); ++n) {
|
||||
// Only for enum types
|
||||
if (info->fields[n]->type == FIELDTYPE_ENUM) {
|
||||
enums.append(QString("/* Field %1 information */\r\n").arg(info->fields[n]->name) );
|
||||
enums.append(QString("/* Enumeration options for field %1 */\r\n").arg(info->fields[n]->name));
|
||||
enums.append( QString("static const value_string uavobjects_%1_%2[]= {\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name) );
|
||||
// Go through each option
|
||||
QStringList options = info->fields[n]->options;
|
||||
for (int m = 0; m < options.length(); ++m) {
|
||||
enums.append ( QString("\t{ %1, \"%2\" },\r\n")
|
||||
.arg(m)
|
||||
.arg(options[m].replace(QRegExp(ENUM_SPECIAL_CHARS), "") ) );
|
||||
}
|
||||
enums.append( QString("\t{ 0, NULL }\r\n") );
|
||||
enums.append( QString("};\r\n") );
|
||||
}
|
||||
}
|
||||
outCode.replace(QString("$(ENUMFIELDNAMES)"), enums);
|
||||
|
||||
// Replace the $(POPULATETREE) tag
|
||||
QString treefields;
|
||||
for (int n = 0; n < info->fields.length(); ++n) {
|
||||
if ( info->fields[n]->numElements == 1 ) {
|
||||
treefields.append( QString(" ptvcursor_add(cursor, hf_op_uavobjects_%1_%2, sizeof(%3), ENC_LITTLE_ENDIAN);\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name)
|
||||
.arg(fieldTypeStrGlib[info->fields[n]->type]) );
|
||||
} else {
|
||||
treefields.append( QString(" {\r\n") );
|
||||
treefields.append( QString(" proto_item * it = NULL;\r\n") );
|
||||
treefields.append( QString(" it = ptvcursor_add_no_advance(cursor, hf_op_uavobjects_%1_%2, 1, ENC_NA);\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name) );
|
||||
treefields.append( QString(" ptvcursor_push_subtree(cursor, it, ett_%1_%2);\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name) );
|
||||
/* Populate each array element into the table */
|
||||
QStringList elemNames = info->fields[n]->elementNames;
|
||||
for (int m = 0; m < elemNames.length(); ++m) {
|
||||
treefields.append( QString(" ptvcursor_add(cursor, hf_op_uavobjects_%1_%2_%3, sizeof(%4), ENC_LITTLE_ENDIAN);\r\n")
|
||||
.arg(info->namelc)
|
||||
.arg(info->fields[n]->name)
|
||||
.arg(elemNames[m])
|
||||
.arg(fieldTypeStrGlib[info->fields[n]->type]) );
|
||||
}
|
||||
treefields.append( QString(" ptvcursor_pop_subtree(cursor);\r\n") );
|
||||
treefields.append( QString(" }\r\n") );
|
||||
}
|
||||
}
|
||||
outCode.replace(QString("$(POPULATETREE)"), treefields);
|
||||
|
||||
// Replace the $(HEADERFIELDS) tag
|
||||
QString headerfields;
|
||||
headerfields.append( QString(" static hf_register_info hf[] = {\r\n") );
|
||||
for (int n = 0; n < info->fields.length(); ++n) {
|
||||
// For non-array fields
|
||||
if ( info->fields[n]->numElements == 1) {
|
||||
headerfields.append( QString("\t { &hf_op_uavobjects_%1_%2,\r\n")
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name ) );
|
||||
headerfields.append( QString("\t { \"%1\", \"%2.%3\", %4,\r\n")
|
||||
.arg( info->fields[n]->name )
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name )
|
||||
.arg( fieldTypeStrHf[info->fields[n]->type] ) );
|
||||
if ( info->fields[n]->type == FIELDTYPE_ENUM ) {
|
||||
headerfields.append( QString("\t BASE_DEC, VALS(uavobjects_%1_%2), 0x0, NULL, HFILL \r\n")
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name ) );
|
||||
} else if ( info->fields[n]->type == FIELDTYPE_FLOAT32 ) {
|
||||
headerfields.append( QString("\t BASE_NONE, NULL, 0x0, NULL, HFILL \r\n") );
|
||||
} else {
|
||||
headerfields.append( QString("\t BASE_DEC_HEX, NULL, 0x0, NULL, HFILL\r\n") );
|
||||
}
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
} else {
|
||||
headerfields.append( QString("\t { &hf_op_uavobjects_%1_%2,\r\n")
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name ) );
|
||||
headerfields.append( QString("\t { \"%1\", \"%2.%3\", FT_NONE,\r\n")
|
||||
.arg( info->fields[n]->name )
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name ) );
|
||||
headerfields.append( QString("\t BASE_NONE, NULL, 0x0, NULL, HFILL\r\n") );
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
|
||||
QStringList elemNames = info->fields[n]->elementNames;
|
||||
for (int m = 0; m < elemNames.length(); ++m) {
|
||||
headerfields.append( QString("\t { &hf_op_uavobjects_%1_%2_%3,\r\n")
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name )
|
||||
.arg( elemNames[m]) );
|
||||
headerfields.append( QString("\t { \"%1\", \"%2.%3.%4\", %5,\r\n")
|
||||
.arg( elemNames[m] )
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name )
|
||||
.arg( elemNames[m] )
|
||||
.arg( fieldTypeStrHf[info->fields[n]->type] ) );
|
||||
if ( info->fields[n]->type == FIELDTYPE_ENUM ) {
|
||||
headerfields.append( QString("\t BASE_DEC, VALS(uavobjects_%1_%2), 0x0, NULL, HFILL \r\n")
|
||||
.arg( info->namelc )
|
||||
.arg( info->fields[n]->name ) );
|
||||
} else if ( info->fields[n]->type == FIELDTYPE_FLOAT32 ) {
|
||||
headerfields.append( QString("\t BASE_NONE, NULL, 0x0, NULL, HFILL \r\n") );
|
||||
} else {
|
||||
headerfields.append( QString("\t BASE_DEC_HEX, NULL, 0x0, NULL, HFILL\r\n") );
|
||||
}
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
headerfields.append( QString("\t },\r\n") );
|
||||
}
|
||||
}
|
||||
}
|
||||
headerfields.append( QString(" };\r\n") );
|
||||
outCode.replace(QString("$(HEADERFIELDS)"), headerfields);
|
||||
|
||||
// Write the flight code
|
||||
bool res = writeFileIfDiffrent( outputpath.absolutePath() + "/packet-op-uavobjects-" + info->namelc + ".c", outCode );
|
||||
if (!res) {
|
||||
cout << "Error: Could not write wireshark code files" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file uavobjectgeneratorflight.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @brief produce flight code for uavobjects
|
||||
*
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* 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 3 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
|
||||
*/
|
||||
|
||||
#ifndef UAVOBJECTGENERATORWIRESHARK_H
|
||||
#define UAVOBJECTGENERATORWIRESHARK_H
|
||||
|
||||
#include "../generator_common.h"
|
||||
|
||||
class UAVObjectGeneratorWireshark
|
||||
{
|
||||
public:
|
||||
bool generate(UAVObjectParser* gen,QString templatepath,QString outputpath);
|
||||
QStringList fieldTypeStrHf;
|
||||
QStringList fieldTypeStrGlib;
|
||||
QString wiresharkCodeTemplate, wiresharkMakeTemplate;
|
||||
QDir wiresharkCodePath;
|
||||
QDir wiresharkOutputPath;
|
||||
|
||||
private:
|
||||
bool process_object(ObjectInfo* info, QDir outputpath);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "generators/gcs/uavobjectgeneratorgcs.h"
|
||||
#include "generators/matlab/uavobjectgeneratormatlab.h"
|
||||
#include "generators/python/uavobjectgeneratorpython.h"
|
||||
#include "generators/wireshark/uavobjectgeneratorwireshark.h"
|
||||
|
||||
#define RETURN_ERR_USAGE 1
|
||||
#define RETURN_ERR_XML 2
|
||||
@ -45,13 +46,14 @@ using namespace std;
|
||||
* print usage info
|
||||
*/
|
||||
void usage() {
|
||||
cout << "Usage: uavobjectgenerator [-gcs] [-flight] [-java] [-python] [-matlab] [-none] [-v] xml_path template_base [UAVObj1] ... [UAVObjN]" << endl;
|
||||
cout << "Usage: uavobjectgenerator [-gcs] [-flight] [-java] [-python] [-matlab] [-wireshark] [-none] [-v] xml_path template_base [UAVObj1] ... [UAVObjN]" << endl;
|
||||
cout << "Languages: "<< endl;
|
||||
cout << "\t-gcs build groundstation code" << endl;
|
||||
cout << "\t-flight build flight code" << endl;
|
||||
cout << "\t-java build java code" << endl;
|
||||
cout << "\t-python build python code" << endl;
|
||||
cout << "\t-matlab build matlab code" << endl;
|
||||
cout << "\t-wireshark build wireshark plugin" << endl;
|
||||
cout << "\tIf no language is specified ( and not -none ) -> all are built." << endl;
|
||||
cout << "Misc: "<< endl;
|
||||
cout << "\t-none build no language - just parse xml's" << endl;
|
||||
@ -103,6 +105,7 @@ int main(int argc, char *argv[])
|
||||
bool do_java=(arguments_stringlist.removeAll("-java")>0);
|
||||
bool do_python=(arguments_stringlist.removeAll("-python")>0);
|
||||
bool do_matlab=(arguments_stringlist.removeAll("-matlab")>0);
|
||||
bool do_wireshark=(arguments_stringlist.removeAll("-wireshark")>0);
|
||||
bool do_none=(arguments_stringlist.removeAll("-none")>0); //
|
||||
|
||||
bool do_all=((do_gcs||do_flight||do_java||do_python||do_matlab)==false);
|
||||
@ -230,6 +233,13 @@ int main(int argc, char *argv[])
|
||||
matlabgen.generate(parser,templatepath,outputpath);
|
||||
}
|
||||
|
||||
// generate wireshark plugin if wanted
|
||||
if (do_wireshark|do_all) {
|
||||
cout << "generating wireshark code" << endl ;
|
||||
UAVObjectGeneratorWireshark wiresharkgen;
|
||||
wiresharkgen.generate(parser,templatepath,outputpath);
|
||||
}
|
||||
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
|
@ -34,7 +34,7 @@ UAVObjectParser::UAVObjectParser()
|
||||
fieldTypeStrXML << "int8" << "int16" << "int32" << "uint8"
|
||||
<< "uint16" << "uint32" <<"float" << "enum";
|
||||
|
||||
updateModeStrXML << "periodic" << "onchange" << "throttled" << "manual";
|
||||
updateModeStrXML << "manual" << "periodic" << "onchange" << "throttled";
|
||||
|
||||
accessModeStr << "ACCESS_READWRITE" << "ACCESS_READONLY";
|
||||
|
||||
|
@ -64,10 +64,10 @@ typedef struct {
|
||||
* Object update mode
|
||||
*/
|
||||
typedef enum {
|
||||
UPDATEMODE_PERIODIC = 0, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED, /** Object is updated on change, but not more often than the interval time */
|
||||
UPDATEMODE_MANUAL /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_MANUAL = 0, /** Manually update object, by calling the updated() function */
|
||||
UPDATEMODE_PERIODIC = 1, /** Automatically update object at periodic intervals */
|
||||
UPDATEMODE_ONCHANGE = 2, /** Only update object when its data changes */
|
||||
UPDATEMODE_THROTTLED = 3 /** Object is updated on change, but not more often than the interval time */
|
||||
} UpdateMode;
|
||||
|
||||
|
||||
|
@ -15,6 +15,7 @@ SOURCES += main.cpp \
|
||||
generators/gcs/uavobjectgeneratorgcs.cpp \
|
||||
generators/matlab/uavobjectgeneratormatlab.cpp \
|
||||
generators/python/uavobjectgeneratorpython.cpp \
|
||||
generators/wireshark/uavobjectgeneratorwireshark.cpp \
|
||||
generators/generator_common.cpp
|
||||
HEADERS += uavobjectparser.h \
|
||||
generators/generator_io.h \
|
||||
@ -22,4 +23,5 @@ HEADERS += uavobjectparser.h \
|
||||
generators/gcs/uavobjectgeneratorgcs.h \
|
||||
generators/matlab/uavobjectgeneratormatlab.h \
|
||||
generators/python/uavobjectgeneratorpython.h \
|
||||
generators/wireshark/uavobjectgeneratorwireshark.h \
|
||||
generators/generator_common.h
|
||||
|
Loading…
x
Reference in New Issue
Block a user