bindings: Overhaul packet & payload classes.
This commit is contained in:
parent
7009a3921a
commit
2928f47d64
|
@ -600,7 +600,7 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi,
|
||||||
const struct sr_datafeed_packet *pkt)
|
const struct sr_datafeed_packet *pkt)
|
||||||
{
|
{
|
||||||
auto device = session->devices[sdi];
|
auto device = session->devices[sdi];
|
||||||
auto packet = shared_ptr<Packet>(new Packet(pkt), Packet::Deleter());
|
auto packet = shared_ptr<Packet>(new Packet(device, pkt), Packet::Deleter());
|
||||||
callback(device, packet);
|
callback(device, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -893,11 +893,23 @@ void Session::set_trigger(shared_ptr<Trigger> trigger)
|
||||||
this->trigger = trigger;
|
this->trigger = trigger;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet::Packet(const struct sr_datafeed_packet *structure) :
|
Packet::Packet(shared_ptr<Device> device,
|
||||||
structure(structure)
|
const struct sr_datafeed_packet *structure) :
|
||||||
|
structure(structure),
|
||||||
|
device(device)
|
||||||
{
|
{
|
||||||
switch (structure->type)
|
switch (structure->type)
|
||||||
{
|
{
|
||||||
|
case SR_DF_HEADER:
|
||||||
|
payload = new Header(
|
||||||
|
static_cast<const struct sr_datafeed_header *>(
|
||||||
|
structure->payload));
|
||||||
|
break;
|
||||||
|
case SR_DF_META:
|
||||||
|
payload = new Meta(
|
||||||
|
static_cast<const struct sr_datafeed_meta *>(
|
||||||
|
structure->payload));
|
||||||
|
break;
|
||||||
case SR_DF_LOGIC:
|
case SR_DF_LOGIC:
|
||||||
payload = new Logic(
|
payload = new Logic(
|
||||||
static_cast<const struct sr_datafeed_logic *>(
|
static_cast<const struct sr_datafeed_logic *>(
|
||||||
|
@ -908,9 +920,6 @@ Packet::Packet(const struct sr_datafeed_packet *structure) :
|
||||||
static_cast<const struct sr_datafeed_analog *>(
|
static_cast<const struct sr_datafeed_analog *>(
|
||||||
structure->payload));
|
structure->payload));
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
payload = NULL;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -925,9 +934,9 @@ const PacketType *Packet::get_type()
|
||||||
return PacketType::get(structure->type);
|
return PacketType::get(structure->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketPayload *Packet::get_payload()
|
shared_ptr<PacketPayload> Packet::get_payload()
|
||||||
{
|
{
|
||||||
return payload;
|
return payload->get_shared_pointer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
PacketPayload::PacketPayload()
|
PacketPayload::PacketPayload()
|
||||||
|
@ -938,28 +947,77 @@ PacketPayload::~PacketPayload()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Logic::Logic(const struct sr_datafeed_logic *structure) : PacketPayload(),
|
Header::Header(const struct sr_datafeed_header *structure) :
|
||||||
structure(structure),
|
PacketPayload(),
|
||||||
data(static_cast<uint8_t *>(structure->data),
|
StructureWrapper<Packet, const struct sr_datafeed_header>(structure)
|
||||||
static_cast<uint8_t *>(structure->data) + structure->length) {}
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Header::~Header()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int Header::get_feed_version()
|
||||||
|
{
|
||||||
|
return structure->feed_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
Glib::TimeVal Header::get_start_time()
|
||||||
|
{
|
||||||
|
return Glib::TimeVal(
|
||||||
|
structure->starttime.tv_sec,
|
||||||
|
structure->starttime.tv_usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
Meta::Meta(const struct sr_datafeed_meta *structure) :
|
||||||
|
PacketPayload(),
|
||||||
|
StructureWrapper<Packet, const struct sr_datafeed_meta>(structure)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Meta::~Meta()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
map<const ConfigKey *, Glib::VariantBase> Meta::get_config()
|
||||||
|
{
|
||||||
|
map<const ConfigKey *, Glib::VariantBase> result;
|
||||||
|
for (auto l = structure->config; l; l = l->next)
|
||||||
|
{
|
||||||
|
auto config = (struct sr_config *) l->data;
|
||||||
|
result[ConfigKey::get(config->key)] = Glib::VariantBase(config->data);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logic::Logic(const struct sr_datafeed_logic *structure) :
|
||||||
|
PacketPayload(),
|
||||||
|
StructureWrapper<Packet, const struct sr_datafeed_logic>(structure)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
Logic::~Logic()
|
Logic::~Logic()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void *Logic::get_data()
|
void *Logic::get_data_pointer()
|
||||||
{
|
{
|
||||||
return structure->data;
|
return structure->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Logic::get_data_size()
|
size_t Logic::get_data_length()
|
||||||
{
|
{
|
||||||
return structure->length;
|
return structure->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned int Logic::get_unit_size()
|
||||||
|
{
|
||||||
|
return structure->unitsize;
|
||||||
|
}
|
||||||
|
|
||||||
Analog::Analog(const struct sr_datafeed_analog *structure) :
|
Analog::Analog(const struct sr_datafeed_analog *structure) :
|
||||||
PacketPayload(),
|
PacketPayload(),
|
||||||
structure(structure)
|
StructureWrapper<Packet, const struct sr_datafeed_analog>(structure)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -967,21 +1025,25 @@ Analog::~Analog()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void *Analog::get_data()
|
float *Analog::get_data_pointer()
|
||||||
{
|
{
|
||||||
return structure->data;
|
return structure->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Analog::get_data_size()
|
|
||||||
{
|
|
||||||
return structure->num_samples * sizeof(float);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int Analog::get_num_samples()
|
unsigned int Analog::get_num_samples()
|
||||||
{
|
{
|
||||||
return structure->num_samples;
|
return structure->num_samples;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<shared_ptr<Channel>> Analog::get_channels()
|
||||||
|
{
|
||||||
|
vector<shared_ptr<Channel>> result;
|
||||||
|
for (auto l = structure->channels; l; l = l->next)
|
||||||
|
result.push_back(parent->device->get_channel(
|
||||||
|
(struct sr_channel *)l->data));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
const Quantity *Analog::get_mq()
|
const Quantity *Analog::get_mq()
|
||||||
{
|
{
|
||||||
return Quantity::get(structure->mq);
|
return Quantity::get(structure->mq);
|
||||||
|
|
|
@ -304,6 +304,7 @@ protected:
|
||||||
friend class Channel;
|
friend class Channel;
|
||||||
friend class ChannelGroup;
|
friend class ChannelGroup;
|
||||||
friend class Output;
|
friend class Output;
|
||||||
|
friend class Analog;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A real hardware device, connected via a driver */
|
/** A real hardware device, connected via a driver */
|
||||||
|
@ -546,17 +547,19 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A packet on the session datafeed */
|
/** A packet on the session datafeed */
|
||||||
class SR_API Packet
|
class SR_API Packet : public enable_shared_from_this<Packet>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Type of this packet. */
|
/** Type of this packet. */
|
||||||
const PacketType *get_type();
|
const PacketType *get_type();
|
||||||
/** Payload of this packet. */
|
/** Payload of this packet. */
|
||||||
PacketPayload *get_payload();
|
shared_ptr<PacketPayload> get_payload();
|
||||||
protected:
|
protected:
|
||||||
Packet(const struct sr_datafeed_packet *structure);
|
Packet(shared_ptr<Device> device,
|
||||||
|
const struct sr_datafeed_packet *structure);
|
||||||
~Packet();
|
~Packet();
|
||||||
const struct sr_datafeed_packet *structure;
|
const struct sr_datafeed_packet *structure;
|
||||||
|
shared_ptr<Device> device;
|
||||||
PacketPayload *payload;
|
PacketPayload *payload;
|
||||||
/** Deleter needed to allow shared_ptr use with protected destructor. */
|
/** Deleter needed to allow shared_ptr use with protected destructor. */
|
||||||
class Deleter
|
class Deleter
|
||||||
|
@ -568,6 +571,10 @@ protected:
|
||||||
friend class Session;
|
friend class Session;
|
||||||
friend class Output;
|
friend class Output;
|
||||||
friend class DatafeedCallbackData;
|
friend class DatafeedCallbackData;
|
||||||
|
friend class Header;
|
||||||
|
friend class Meta;
|
||||||
|
friend class Logic;
|
||||||
|
friend class Analog;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Abstract base class for datafeed packet payloads */
|
/** Abstract base class for datafeed packet payloads */
|
||||||
|
@ -576,31 +583,77 @@ class SR_API PacketPayload
|
||||||
protected:
|
protected:
|
||||||
PacketPayload();
|
PacketPayload();
|
||||||
virtual ~PacketPayload() = 0;
|
virtual ~PacketPayload() = 0;
|
||||||
virtual void *get_data() = 0;
|
shared_ptr<PacketPayload> get_shared_pointer(Packet *parent) {
|
||||||
virtual size_t get_data_size() = 0;
|
return static_pointer_cast<PacketPayload>(get_shared_pointer(parent));
|
||||||
|
}
|
||||||
|
/** Deleter needed to allow shared_ptr use with protected destructor. */
|
||||||
|
class Deleter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void operator()(PacketPayload *payload) { delete payload; }
|
||||||
|
};
|
||||||
|
friend class Deleter;
|
||||||
friend class Packet;
|
friend class Packet;
|
||||||
friend class Output;
|
friend class Output;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Payload of a datafeed packet with logic data */
|
/** Payload of a datafeed header packet */
|
||||||
class SR_API Logic : public PacketPayload
|
class SR_API Header : public PacketPayload,
|
||||||
|
public StructureWrapper<Packet, const struct sr_datafeed_header>
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
int get_feed_version();
|
||||||
|
Glib::TimeVal get_start_time();
|
||||||
|
protected:
|
||||||
|
Header(const struct sr_datafeed_header *structure);
|
||||||
|
~Header();
|
||||||
|
const struct sr_datafeed_header *structure;
|
||||||
|
friend class Packet;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Payload of a datafeed metadata packet */
|
||||||
|
class SR_API Meta : public PacketPayload,
|
||||||
|
public StructureWrapper<Packet, const struct sr_datafeed_meta>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
map<const ConfigKey *, Glib::VariantBase> get_config();
|
||||||
|
protected:
|
||||||
|
Meta(const struct sr_datafeed_meta *structure);
|
||||||
|
~Meta();
|
||||||
|
const struct sr_datafeed_meta *structure;
|
||||||
|
map<const ConfigKey *, Glib::VariantBase> config;
|
||||||
|
friend class Packet;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Payload of a datafeed packet with logic data */
|
||||||
|
class SR_API Logic : public PacketPayload,
|
||||||
|
public StructureWrapper<Packet, const struct sr_datafeed_logic>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/* Pointer to data. */
|
||||||
|
void *get_data_pointer();
|
||||||
|
/* Data length in bytes. */
|
||||||
|
size_t get_data_length();
|
||||||
|
/* Size of each sample in bytes. */
|
||||||
|
unsigned int get_unit_size();
|
||||||
protected:
|
protected:
|
||||||
Logic(const struct sr_datafeed_logic *structure);
|
Logic(const struct sr_datafeed_logic *structure);
|
||||||
~Logic();
|
~Logic();
|
||||||
const struct sr_datafeed_logic *structure;
|
const struct sr_datafeed_logic *structure;
|
||||||
vector<uint8_t> data;
|
|
||||||
void *get_data();
|
|
||||||
size_t get_data_size();
|
|
||||||
friend class Packet;
|
friend class Packet;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Payload of a datafeed packet with analog data */
|
/** Payload of a datafeed packet with analog data */
|
||||||
class SR_API Analog : public PacketPayload
|
class SR_API Analog : public PacketPayload,
|
||||||
|
public StructureWrapper<Packet, const struct sr_datafeed_analog>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/** Pointer to data. */
|
||||||
|
float *get_data_pointer();
|
||||||
/** Number of samples in this packet. */
|
/** Number of samples in this packet. */
|
||||||
unsigned int get_num_samples();
|
unsigned int get_num_samples();
|
||||||
|
/** Channels for which this packet contains data. */
|
||||||
|
vector<shared_ptr<Channel> > get_channels();
|
||||||
/** Measured quantity of the samples in this packet. */
|
/** Measured quantity of the samples in this packet. */
|
||||||
const Quantity *get_mq();
|
const Quantity *get_mq();
|
||||||
/** Unit of the samples in this packet. */
|
/** Unit of the samples in this packet. */
|
||||||
|
@ -611,8 +664,6 @@ protected:
|
||||||
Analog(const struct sr_datafeed_analog *structure);
|
Analog(const struct sr_datafeed_analog *structure);
|
||||||
~Analog();
|
~Analog();
|
||||||
const struct sr_datafeed_analog *structure;
|
const struct sr_datafeed_analog *structure;
|
||||||
void *get_data();
|
|
||||||
size_t get_data_size();
|
|
||||||
friend class Packet;
|
friend class Packet;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,10 @@ STRING_TO_SHARED_PTR_MAP(OutputFormat)
|
||||||
|
|
||||||
MAP_COMMON(const sigrok::ConfigKey *, Glib::VariantBase, ConfigKey, Variant)
|
MAP_COMMON(const sigrok::ConfigKey *, Glib::VariantBase, ConfigKey, Variant)
|
||||||
|
|
||||||
|
%typemap(jni) std::map<const sigrok::ConfigKey, Glib::VariantBase> "jobject"
|
||||||
|
%typemap(jtype) std::map<const sigrok::ConfigKey, Glib::VariantBase>
|
||||||
|
"java.util.Map<ConfigKey,Variant>"
|
||||||
|
|
||||||
%typemap(out) std::map<const sigrok::ConfigKey *, Glib::VariantBase> {
|
%typemap(out) std::map<const sigrok::ConfigKey *, Glib::VariantBase> {
|
||||||
jclass HashMap = jenv->FindClass("java/util/HashMap");
|
jclass HashMap = jenv->FindClass("java/util/HashMap");
|
||||||
jmethodID HashMap_init = jenv->GetMethodID(HashMap, "<init>", "()V");
|
jmethodID HashMap_init = jenv->GetMethodID(HashMap, "<init>", "()V");
|
||||||
|
|
|
@ -70,6 +70,8 @@ template< class T > class enable_shared_from_this;
|
||||||
%shared_ptr(sigrok::Session);
|
%shared_ptr(sigrok::Session);
|
||||||
%shared_ptr(sigrok::Packet);
|
%shared_ptr(sigrok::Packet);
|
||||||
%shared_ptr(sigrok::PacketPayload);
|
%shared_ptr(sigrok::PacketPayload);
|
||||||
|
%shared_ptr(sigrok::Header);
|
||||||
|
%shared_ptr(sigrok::Meta);
|
||||||
%shared_ptr(sigrok::Analog);
|
%shared_ptr(sigrok::Analog);
|
||||||
%shared_ptr(sigrok::Logic);
|
%shared_ptr(sigrok::Logic);
|
||||||
%shared_ptr(sigrok::InputFormat);
|
%shared_ptr(sigrok::InputFormat);
|
||||||
|
@ -143,6 +145,8 @@ typedef std::map<std::string, std::shared_ptr<sigrok::OutputFormat> >
|
||||||
map_string_OutputFormat;
|
map_string_OutputFormat;
|
||||||
typedef std::map<std::string, std::shared_ptr<sigrok::ChannelGroup> >
|
typedef std::map<std::string, std::shared_ptr<sigrok::ChannelGroup> >
|
||||||
map_string_ChannelGroup;
|
map_string_ChannelGroup;
|
||||||
|
typedef std::map<const sigrok::ConfigKey *, Glib::VariantBase>
|
||||||
|
map_ConfigKey_Variant;
|
||||||
}
|
}
|
||||||
|
|
||||||
%attributeval(sigrok::Context,
|
%attributeval(sigrok::Context,
|
||||||
|
@ -221,9 +225,12 @@ typedef std::map<std::string, std::shared_ptr<sigrok::ChannelGroup> >
|
||||||
devices, get_devices);
|
devices, get_devices);
|
||||||
|
|
||||||
%attributestring(sigrok::Session,
|
%attributestring(sigrok::Session,
|
||||||
std::shared_ptr<sigrok::Trigger>, trigger, get_trigger, set_trigger)
|
std::shared_ptr<sigrok::Trigger>, trigger, get_trigger, set_trigger);
|
||||||
|
|
||||||
%attribute(sigrok::Packet, sigrok::PacketPayload *, payload, get_payload);
|
%attributestring(sigrok::Packet,
|
||||||
|
std::shared_ptr<sigrok::PacketPayload>, payload, get_payload);
|
||||||
|
|
||||||
|
%attributeval(sigrok::Meta, map_ConfigKey_Variant, config, get_config);
|
||||||
|
|
||||||
%attribute(sigrok::Analog, int, num_samples, get_num_samples);
|
%attribute(sigrok::Analog, int, num_samples, get_num_samples);
|
||||||
%attribute(sigrok::Analog, const sigrok::Quantity *, mq, get_mq);
|
%attribute(sigrok::Analog, const sigrok::Quantity *, mq, get_mq);
|
||||||
|
|
Loading…
Reference in New Issue