X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=d5477847653f85acb6f637b48de4a3ce677a9659;hb=HEAD;hp=c17a2ee524efad9ebcd62e7006eeeedc41829bc5;hpb=895cbcdd3cc420342f6c293a2713be0b808397c1;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index c17a2ee5..d5477847 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -18,8 +18,9 @@ */ /* Needed for isascii(), as used in the GNU libstdc++ headers */ +/* Needed in strutil.c for POSIX.1-2008 locale functions */ #ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 +#define _XOPEN_SOURCE 700 #endif #include @@ -31,6 +32,8 @@ namespace sigrok { +using namespace std; + /** Helper function to translate C errors to C++ exceptions. */ static void check(int result) { @@ -176,6 +179,32 @@ map> Context::input_formats() return result; } +shared_ptr Context::input_format_match(string filename) +{ + const struct sr_input *input; + const struct sr_input_module *imod; + int rc; + + /* + * Have the input module looked up for the specified file. + * Failed lookup (or "successful lookup" with an empty result) + * are non-fatal. Free the sr_input that was created by the + * lookup routine, but grab the input module kind and return an + * InputFormat instance to the application. This works because + * the application passes a filename, no input data got buffered + * in the sr_input that we release. + */ + input = NULL; + rc = sr_input_scan_file(filename.c_str(), &input); + if (rc != SR_OK) + return nullptr; + if (!input) + return nullptr; + imod = sr_input_module_get(input); + sr_input_free(input); + return shared_ptr{new InputFormat{imod}, default_delete{}}; +} + map> Context::output_formats() { map> result; @@ -212,7 +241,7 @@ static int call_log_callback(void *cb_data, int loglevel, try { (*callback)(LogLevel::get(loglevel), message.get()); - } catch (Error e) { + } catch (Error &e) { return e.result; } @@ -258,12 +287,12 @@ shared_ptr Context::create_user_device( default_delete{}}; } -shared_ptr Context::create_header_packet(Glib::TimeVal start_time) +shared_ptr Context::create_header_packet(Glib::DateTime start_time) { auto header = g_new(struct sr_datafeed_header, 1); header->feed_version = 1; - header->starttime.tv_sec = start_time.tv_sec; - header->starttime.tv_usec = start_time.tv_usec; + header->starttime.tv_sec = start_time.to_unix(); + header->starttime.tv_usec = start_time.get_microsecond(); auto packet = g_new(struct sr_datafeed_packet, 1); packet->type = SR_DF_HEADER; packet->payload = header; @@ -350,6 +379,14 @@ shared_ptr Context::create_analog_packet( return shared_ptr{new Packet{nullptr, packet}, default_delete{}}; } +shared_ptr Context::create_end_packet() +{ + auto packet = g_new(struct sr_datafeed_packet, 1); + packet->type = SR_DF_END; + return shared_ptr{new Packet{nullptr, packet}, + default_delete{}}; +} + shared_ptr Context::load_session(string filename) { return shared_ptr{ @@ -909,6 +946,7 @@ Session::Session(shared_ptr context, string filename) : _owned_devices.emplace(sdi, move(device)); } _context->_session = this; + g_slist_free(dev_list); } Session::~Session() @@ -943,6 +981,7 @@ vector> Session::devices() auto *const sdi = static_cast(dev->data); result.push_back(get_device(sdi)); } + g_slist_free(dev_list); return result; } @@ -1115,11 +1154,10 @@ int Header::feed_version() const return _structure->feed_version; } -Glib::TimeVal Header::start_time() const +Glib::DateTime Header::start_time() const { - return Glib::TimeVal( - _structure->starttime.tv_sec, - _structure->starttime.tv_usec); + Glib::DateTime time = Glib::DateTime::create_now_utc(_structure->starttime.tv_sec); + return time.add_seconds(_structure->starttime.tv_usec / 1.0e6); } Meta::Meta(const struct sr_datafeed_meta *structure) : @@ -1287,6 +1325,48 @@ vector Analog::mq_flags() const return QuantityFlag::flags_from_mask(_structure->meaning->mqflags); } +shared_ptr Analog::get_logic_via_threshold(float threshold, + uint8_t *data_ptr) const +{ + auto datafeed = g_new(struct sr_datafeed_logic, 1); + datafeed->length = num_samples(); + datafeed->unitsize = 1; + + if (data_ptr) + datafeed->data = data_ptr; + else + datafeed->data = g_malloc(datafeed->length); + + shared_ptr logic = + shared_ptr{new Logic{datafeed}, default_delete{}}; + + check(sr_a2l_threshold(_structure, threshold, + (uint8_t*)datafeed->data, datafeed->length)); + + return logic; +} + +shared_ptr Analog::get_logic_via_schmitt_trigger(float lo_thr, + float hi_thr, uint8_t *state, uint8_t *data_ptr) const +{ + auto datafeed = g_new(struct sr_datafeed_logic, 1); + datafeed->length = num_samples(); + datafeed->unitsize = 1; + + if (data_ptr) + datafeed->data = data_ptr; + else + datafeed->data = g_malloc(datafeed->length); + + shared_ptr logic = + shared_ptr{new Logic{datafeed}, default_delete{}}; + + check(sr_a2l_schmitt_trigger(_structure, lo_thr, hi_thr, state, + (uint8_t*)datafeed->data, datafeed->length)); + + return logic; +} + Rational::Rational(const struct sr_rational *structure) : _structure(structure) { @@ -1485,6 +1565,8 @@ Glib::VariantBase Option::parse_string(string value) dt = SR_T_FLOAT; } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_INT32)) { dt = SR_T_INT32; + } else if (g_variant_is_of_type(tmpl, G_VARIANT_TYPE_UINT32)) { + dt = SR_T_UINT32; } else { throw Error(SR_ERR_BUG); } @@ -1582,6 +1664,11 @@ Output::~Output() check(sr_output_free(_structure)); } +shared_ptr Output::format() +{ + return _format; +} + string Output::receive(shared_ptr packet) { GString *out;