X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=2ae0f29839b9256c19572f8fbece25cdf23a8550;hb=2928f47d6404e51c2dda1842c43db578cb1d6cdd;hp=7b8d8531f899a74ca3fa30822933d5d3f3386adf;hpb=4178d9712f3e67f83aa1eb49a5f5299e9ce1515b;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 7b8d8531..2ae0f298 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -600,7 +600,7 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt) { auto device = session->devices[sdi]; - auto packet = shared_ptr(new Packet(pkt), Packet::Deleter()); + auto packet = shared_ptr(new Packet(device, pkt), Packet::Deleter()); callback(device, packet); } @@ -893,11 +893,23 @@ void Session::set_trigger(shared_ptr trigger) this->trigger = trigger; } -Packet::Packet(const struct sr_datafeed_packet *structure) : - structure(structure) +Packet::Packet(shared_ptr device, + const struct sr_datafeed_packet *structure) : + structure(structure), + device(device) { switch (structure->type) { + case SR_DF_HEADER: + payload = new Header( + static_cast( + structure->payload)); + break; + case SR_DF_META: + payload = new Meta( + static_cast( + structure->payload)); + break; case SR_DF_LOGIC: payload = new Logic( static_cast( @@ -908,15 +920,13 @@ Packet::Packet(const struct sr_datafeed_packet *structure) : static_cast( structure->payload)); break; - default: - payload = NULL; - break; } } Packet::~Packet() { - delete payload; + if (payload) + delete payload; } const PacketType *Packet::get_type() @@ -924,9 +934,9 @@ const PacketType *Packet::get_type() return PacketType::get(structure->type); } -PacketPayload *Packet::get_payload() +shared_ptr Packet::get_payload() { - return payload; + return payload->get_shared_pointer(this); } PacketPayload::PacketPayload() @@ -937,28 +947,77 @@ PacketPayload::~PacketPayload() { } -Logic::Logic(const struct sr_datafeed_logic *structure) : PacketPayload(), - structure(structure), - data(static_cast(structure->data), - static_cast(structure->data) + structure->length) {} +Header::Header(const struct sr_datafeed_header *structure) : + PacketPayload(), + StructureWrapper(structure) +{ +} + +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(structure) +{ +} + +Meta::~Meta() +{ +} + +map Meta::get_config() +{ + map 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(structure) +{ +} Logic::~Logic() { } -void *Logic::get_data() +void *Logic::get_data_pointer() { return structure->data; } -size_t Logic::get_data_size() +size_t Logic::get_data_length() { return structure->length; } +unsigned int Logic::get_unit_size() +{ + return structure->unitsize; +} + Analog::Analog(const struct sr_datafeed_analog *structure) : PacketPayload(), - structure(structure) + StructureWrapper(structure) { } @@ -966,19 +1025,23 @@ Analog::~Analog() { } -void *Analog::get_data() +float *Analog::get_data_pointer() { return structure->data; } -size_t Analog::get_data_size() +unsigned int Analog::get_num_samples() { - return structure->num_samples * sizeof(float); + return structure->num_samples; } -unsigned int Analog::get_num_samples() +vector> Analog::get_channels() { - return structure->num_samples; + vector> 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()