X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=a944faa21b879aaa191ddf7acf4e224e27c2a195;hb=7f4d69305b1d86cbe3785b5d041dcac1351f0731;hp=850225fdd467840630442442ab2159e3f852022d;hpb=c879dca3d71f321c2a972594a2186f01f398dce8;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 850225fd..a944faa2 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -17,7 +17,13 @@ * along with this program. If not, see . */ -#include "libsigrokcxx/libsigrokcxx.hpp" +/* Needed for isascii(), as used in the GNU libstdc++ headers */ +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 +#endif + +#include +#include #include #include @@ -66,6 +72,50 @@ Error::~Error() throw() { } +ResourceReader::~ResourceReader() +{ +} + +SR_PRIV int ResourceReader::open_callback(struct sr_resource *res, + const char *name, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + reader->open(res, name); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } + return SR_OK; +} + +SR_PRIV int ResourceReader::close_callback(struct sr_resource *res, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + reader->close(res); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } + return SR_OK; +} + +SR_PRIV ssize_t ResourceReader::read_callback(const struct sr_resource *res, + void *buf, size_t count, void *cb_data) +{ + try { + auto *const reader = static_cast(cb_data); + return reader->read(res, buf, count); + } catch (const Error &err) { + return err.result; + } catch (...) { + return SR_ERR; + } +} + shared_ptr Context::create() { return shared_ptr(new Context(), Context::Deleter()); @@ -77,7 +127,7 @@ Context::Context() : { check(sr_init(&_structure)); - struct sr_dev_driver **driver_list = sr_driver_list(); + struct sr_dev_driver **driver_list = sr_driver_list(_structure); if (driver_list) for (int i = 0; driver_list[i]; i++) _drivers[driver_list[i]->name] = @@ -161,16 +211,6 @@ void Context::set_log_level(const LogLevel *level) check(sr_log_loglevel_set(level->id())); } -string Context::log_domain() -{ - return valid_string(sr_log_logdomain_get()); -} - -void Context::set_log_domain(string value) -{ - check(sr_log_logdomain_set(value.c_str())); -} - static int call_log_callback(void *cb_data, int loglevel, const char *format, va_list args) { va_list args_copy; @@ -200,13 +240,26 @@ void Context::set_log_callback(LogCallbackFunction callback) { _log_callback = callback; check(sr_log_callback_set(call_log_callback, &_log_callback)); -} +} void Context::set_log_callback_default() { check(sr_log_callback_set_default()); _log_callback = nullptr; -} +} + +void Context::set_resource_reader(ResourceReader *reader) +{ + if (reader) { + check(sr_resource_set_hooks(_structure, + &ResourceReader::open_callback, + &ResourceReader::close_callback, + &ResourceReader::read_callback, reader)); + } else { + check(sr_resource_set_hooks(_structure, + nullptr, nullptr, nullptr, nullptr)); + } +} shared_ptr Context::create_session() { @@ -885,8 +938,7 @@ shared_ptr SessionDevice::get_shared_from_this() Session::Session(shared_ptr context) : UserOwned(_structure), - _context(context), - _saving(false) + _context(context) { check(sr_session_new(context->_structure, &_structure)); _context->_session = this; @@ -895,8 +947,7 @@ Session::Session(shared_ptr context) : Session::Session(shared_ptr context, string filename) : UserOwned(_structure), _context(context), - _filename(filename), - _saving(false) + _filename(filename) { check(sr_session_load(context->_structure, filename.c_str(), &_structure)); GSList *dev_list; @@ -974,93 +1025,6 @@ void Session::stop() check(sr_session_stop(_structure)); } -void Session::begin_save(string filename) -{ - _saving = true; - _save_initialized = false; - _save_filename = filename; - _save_samplerate = 0; -} - -void Session::append(shared_ptr packet) -{ - if (!_saving) - throw Error(SR_ERR); - - switch (packet->_structure->type) - { - case SR_DF_META: - { - auto meta = (const struct sr_datafeed_meta *) - packet->_structure->payload; - - for (auto l = meta->config; l; l = l->next) - { - auto config = (struct sr_config *) l->data; - if (config->key == SR_CONF_SAMPLERATE) - _save_samplerate = g_variant_get_uint64(config->data); - } - - break; - } - case SR_DF_LOGIC: - { - if (_save_samplerate == 0) - { - GVariant *samplerate; - - check(sr_config_get(sr_dev_inst_driver_get(packet->_device->_structure), - packet->_device->_structure, NULL, SR_CONF_SAMPLERATE, - &samplerate)); - - _save_samplerate = g_variant_get_uint64(samplerate); - - g_variant_unref(samplerate); - } - - if (!_save_initialized) - { - vector> save_channels; - - for (auto channel : packet->_device->channels()) - if (channel->_structure->enabled && - channel->_structure->type == SR_CHANNEL_LOGIC) - save_channels.push_back(channel); - - auto channels = g_new(char *, save_channels.size()); - - int i = 0; - for (auto channel : save_channels) - channels[i++] = channel->_structure->name; - channels[i] = NULL; - - int ret = sr_session_save_init(_structure, _save_filename.c_str(), - _save_samplerate, channels); - - g_free(channels); - - if (ret != SR_OK) - throw Error(ret); - - _save_initialized = true; - } - - auto logic = (const struct sr_datafeed_logic *) - packet->_structure->payload; - - check(sr_session_append(_structure, _save_filename.c_str(), - (uint8_t *) logic->data, logic->unitsize, - logic->length / logic->unitsize)); - } - } -} - -void Session::append(void *data, size_t length, unsigned int unit_size) -{ - check(sr_session_append(_structure, _save_filename.c_str(), - (uint8_t *) data, unit_size, length)); -} - static void datafeed_callback(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt, void *cb_data) { @@ -1438,9 +1402,9 @@ shared_ptr Input::device() return _device->get_shared_pointer(shared_from_this()); } -void Input::send(string data) +void Input::send(void *data, size_t length) { - auto gstr = g_string_new(data.c_str()); + auto gstr = g_string_new_len((gchar *)data, length); auto ret = sr_input_send(_structure, gstr); g_string_free(gstr, false); check(ret); @@ -1565,10 +1529,33 @@ shared_ptr OutputFormat::create_output( Output::Deleter()); } +shared_ptr OutputFormat::create_output(string filename, + shared_ptr device, map options) +{ + return shared_ptr( + new Output(filename, shared_from_this(), device, options), + Output::Deleter()); +} + +bool OutputFormat::test_flag(const OutputFlag *flag) +{ + return sr_output_test_flag(_structure, flag->id()); +} + Output::Output(shared_ptr format, shared_ptr device, map options) : UserOwned(sr_output_new(format->_structure, - map_to_hash_variant(options), device->_structure)), + map_to_hash_variant(options), device->_structure, NULL)), + _format(format), + _device(device), + _options(options) +{ +} + +Output::Output(string filename, shared_ptr format, + shared_ptr device, map options) : + UserOwned(sr_output_new(format->_structure, + map_to_hash_variant(options), device->_structure, filename.c_str())), _format(format), _device(device), _options(options) @@ -1596,6 +1583,6 @@ string Output::receive(shared_ptr packet) } } -#include "enums.cpp" +#include }