/**
 * @file ivm.h
 * @brief ivm API
 */
/* Project generated by builder 0.10.24 */
#ifndef INC_IVM_H
#define INC_IVM_H
#define IVM_BUILDER_VERSION_MAJOR 0
#define IVM_BUILDER_VERSION_MINOR 10
#define IVM_BUILDER_VERSION_BUGFIX 24
#define IVM_BUILDER_VERSION_SUFFIX ""
#define IVM_BUILDER_VERSION "0.10.24"


#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
#include <wchar.h>


#undef IVM_URPC_API_EXPORT
#if defined(_WIN32)
    #if IVM_URPC_BUILDING_STAGE
        #define IVM_URPC_API_EXPORT __declspec(dllexport)
    #else
        #define IVM_URPC_API_EXPORT __declspec(dllimport)
    #endif
#else
    #define IVM_URPC_API_EXPORT __attribute__((visibility("default")))
#endif

#undef IVM_URPC_CALLING_CONVENTION
#if defined(_WIN32)
    #define IVM_URPC_CALLING_CONVENTION __cdecl
#else
    #define IVM_URPC_CALLING_CONVENTION
#endif

typedef int device_t;
#define device_undefined (-1)
typedef int result_t;
#define result_ok 0
#define result_error (-1)
#define result_not_implemented (-2)
#define result_value_error (-3)
#define result_nodevice (-4)
#define result_timeout (-5)

#define STR_result_ok_0 "result_ok 0"
#define STR_device_undefined_1 "device_undefined (-1)"
#define STR_result_error_1 "result_error (-1)"
#define STR_result_not_implemented_2 "result_not_implemented (-2)"
#define STR_result_value_error_3 "result_value_error (-3)"
#define STR_result_nodevice_4 "result_nodevice (-4)"
#define STR_result_timeout_5 "result_timeout (-5)"

/**
 * \~english
 * @name Logging level
 * \~russian
 * @name Уровень логирования
 */
//@{
/**
 * \~english
 * Logging level - error
 * \~russian
 * Уровень логирования - ошибка
 */
#define LOGLEVEL_ERROR         0x01
/**
 * \~english
 * Logging level - warning
 * \~russian
 * Уровень логирования - предупреждение
 */
#define LOGLEVEL_WARNING     0x02
/**
 * \~english
 * Logging level - info
 * \~russian
 * Уровень логирования - информация
 */
#define LOGLEVEL_INFO        0x03
/**
 * \~english
 * Logging level - debug
 * \~russian
 * Уровень логирования - отладка
 */
#define LOGLEVEL_DEBUG        0x04
//@}

/**
 * \~english
 * Logging callback prototype.
 * @param loglevel - A logging level.
 * @param message - A message.
 * \~russian
 * Прототип функции обратного вызова для логирования.
 * @param loglevel - Уровень логирования.
 * @param message - Сообщение.
 */
typedef void (IVM_URPC_CALLING_CONVENTION *ivm_logging_callback_t)(int loglevel, const wchar_t *message, void *user_data);

/**
 * \~english
 * Simple callback for logging to stderr in wide chars.
 * @param loglevel - A logging level.
 * @param message - A message.
 * \~russian
 * Простая функция логирования на stderr в широких символах.
 * @param loglevel - Уровень логирования.
 * @param message - Сообщение.
 */
IVM_URPC_API_EXPORT void IVM_URPC_CALLING_CONVENTION ivm_logging_callback_stderr_wide(int loglevel, const wchar_t *message, void *);

/**
 * \~english
 * Simple callback for logging to stderr in narrow (single byte) chars.
 * @param loglevel - A logging level.
 * @param message - A message.
 * \~russian
 * Простая функция логирования на stderr в узких (однобайтных) символах.
 * @param loglevel - Уровень логирования.
 * @param message - Сообщение.
 */
IVM_URPC_API_EXPORT void IVM_URPC_CALLING_CONVENTION ivm_logging_callback_stderr_narrow(int loglevel, const wchar_t *message, void *);

/**
 * \~english
 * Sets a logging callback.
 * Passing NULL disables logging.
 * @param logging_callback a callback for log messages
 * \~russian
 * Устанавливает функцию обратного вызова для логирования.
 * Передача NULL в качестве аргумента отключает логирование.
 * @param logging_callback указатель на функцию обратного вызова
 */
IVM_URPC_API_EXPORT void IVM_URPC_CALLING_CONVENTION ivm_set_logging_callback(ivm_logging_callback_t cb, void *data);
#define IVM_FRAME_SIZE    0x19 /**< \~english IV curve fame size in points. Is used in get_measurement and get_measurement_raw commands. \~russian Размер кадра передачи точек вольтамперной характеристики. Используется в командах get_measurement и get_measurement_raw. */

#define IVM_CALIBRATION_OK    0x0 /**< \~english Calibration complete successfully. \~russian Калибровка завершена успешно. */

#define IVM_STATUS_OK    0x0 /**< \~english The device is OK. \~russian Устройство функционирует нормально. */

#define IVM_IOSTATE_GEN_PROBE_BUTTON_PRESSED    0x1 /**< \~english Button on the generator probe is in pressed state right now \~russian Кнопка на щупе генератора в данный момент находится в нажатом состоянии */
#define IVM_IOSTATE_RECV_PROBE_BUTTON_PRESSED    0x2 /**< \~english Button on the receiver probe is in pressed state right now \~russian Кнопка на щупе приёмника в данный момент находится в нажатом состоянии */

#define IVM_IOEVENTS_GEN_PROBE_BUTTON_PRESSED    0x1 /**< \~english Button on the generator probe was pressed some time ago \~russian Кнопка на щупе генератора была нажата некоторое время назад */
#define IVM_IOEVENTS_GEN_PROBE_BUTTON_RELEASED    0x2 /**< \~english Button on the generator probe was released some time ago \~russian Кнопка на щупе генератора была отпущена некоторое время назад */
#define IVM_IOEVENTS_RECV_PROBE_BUTTON_PRESSED    0x4 /**< \~english Button on the receiver probe was pressed some time ago \~russian Кнопка на щупе приёмника была нажата некоторое время назад */
#define IVM_IOEVENTS_RECV_PROBE_BUTTON_RELEASED    0x8 /**< \~english Button on the receiver probe was released some time ago \~russian Кнопка на щупе приёмника была отпущена некоторое время назад */

#define IVM_MEASUREMENT_NOT_COMPLETE    0x0 /**< \~english The measurement is not complete and the measured data is not ready \~russian Измерение не завершено и измеренные данные не готовы. */
#define IVM_MEASUREMENT_COMPLETE    0x1 /**< \~english The measurement is complete and the measured data is ready to be read. \~russian Измерение завершено, можно осуществлять чтение измеренных значений. */

#define IVM_IOEVENTSRST_GEN_PROBE_BUTTON_PRESSED    0x1 /**< \~english Reset button on the generator probe was pressed event \~russian Сброс события нажатия кнопки на щупе генератора */
#define IVM_IOEVENTSRST_GEN_PROBE_BUTTON_RELEASED    0x2 /**< \~english Reset button on the generator probe was released event \~russian Сброс события отпускания кнопки на щупе генератора */
#define IVM_IOEVENTSRST_RECV_PROBE_BUTTON_PRESSED    0x4 /**< \~english Reset button on the receiver probe was pressed event \~russian Сброс события нажатия кнопки на щупе приёмника */
#define IVM_IOEVENTSRST_RECV_PROBE_BUTTON_RELEASED    0x8 /**< \~english Reset button on the receiver probe was released event \~russian Сброс события отпускания кнопки на щупе приёмника */

#define IVM_MIN_NUMBER_POINTS    0xa /**< \~english Minimum number points  in a single measurement. \~russian Минимальное количество точек в одном измерении. */
#define IVM_MAX_NUMBER_POINTS    0x3e8 /**< \~english Maximum number points  in a single measurement. \~russian Максимальное количество точек в одном измерении. */

#define IVM_CURRENT_SENSE_MODE_ISOLATED    0x0 /**< \~english Current sense resistors disconnected. \~russian Токоизмерительные резисторы отключены. */
#define IVM_CURRENT_SENSE_MODE_I_LOW    0x1 /**< \~english Low current mode. \~russian Режим малых токов. */
#define IVM_CURRENT_SENSE_MODE_I_MID    0x2 /**< \~english Medium current mode. \~russian Режим средних токов. */
#define IVM_CURRENT_SENSE_MODE_I_HIGH    0x3 /**< \~english High current mode. \~russian Режим больших токов. */

#define IVM_OUT_MODE_PROBE_SIGNAL_CONTINUOUS    0x0 /**< \~english Upper probe is continuously connected to the probe signal source. Lower probe is continuously connected to the ground through the current sense resistor. This is basic mode for measurements. \~russian Верхний щуп непрерывно подключен к источнику пробного сигнала. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. Этот режим является базовым для проведения измерений. */
#define IVM_OUT_MODE_GROUNDED_CONTINUOUS    0x1 /**< \~english Both probes are continuously connected to ground. Lower probe is connected to the ground through current sense resistor. \~russian Верхний щуп непрерывно подключен к источнику пробного сигнала. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. Этот режим является базовым для проведения измерений. */
#define IVM_OUT_MODE_PROBE_SIGNAL_WITH_GROUNDING    0x2 /**< \~english Upper probe is connected to the probe signal source during measurement and automatically grounded when measurements are not conducted. Lower probe is continuously connected to the ground through the current sense resistor. \~russian Верхний щуп подключен к источнику пробного сигнала в процессе измерения и автоматически заземляется в случаях, когда измерения не производятся. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. */
typedef struct
{
    uint16_t FrameNumber; /**< \~english Number of the requested frame. Frame numbering starts from 0. \~russian Номер запрашиваемого кадра. Нумерация кадров начинается с 0. */

} ivm_in_get_measurement_t;

typedef struct
{
    float Voltage[25]; /**< \~english Array of voltages (voltage coordinates of the IV-curve) within the requested frame. Units: Volts. \~russian Массив напряжений (координат ВАХ по напряжению) в пределах запрашиваемого кадра. Единицы измерения: Вольты. */
    float Current[25]; /**< \~english Array of currents (current coordinates of the IV-curve) within the requested frame. Units: mA. \~russian Массив токов (координат ВАХ по току) в пределах запрашиваемого кадра. Единицы измерения: мА. */

} ivm_out_get_measurement_t;

typedef struct
{
    uint8_t Manufacturer[16]; /**< \~english Manufacturer name. The name is set by the manufacturer. \~russian Имя производителя. Устанавливается производителем. */
    uint8_t ProductName[16]; /**< \~english Product name. The name is set by the manufacturer. \~russian Название продукта. Устанавливается производителем. */
    uint8_t ControllerName[16]; /**< \~english User controller name. This name can be set by user via additional command. Some devices may not support custom controller name setup. \~russian Пользовательское имя контроллера. Может быть установлено пользователем с помощью отдельной команды. Некоторые устройства могут не поддерживать установку пользовательского имени контроллера. */
    uint8_t HardwareMajor; /**< \~english The major number of the hardware version. \~russian Основной номер версии устройства. */
    uint8_t HardwareMinor; /**< \~english Minor number of the hardware version. \~russian Второстепенный номер версии устройства. */
    uint16_t HardwareBugfix; /**< \~english Patch number of the hardware version. \~russian Номер правок этой версии устройства. */
    uint8_t BootloaderMajor; /**< \~english Bootloader major version number. \~russian Основной номер версии загрузчика. */
    uint8_t BootloaderMinor; /**< \~english Bootloader minor version number. \~russian Второстепенный номер версии загрузчика. */
    uint16_t BootloaderBugfix; /**< \~english Bootloader release version number. \~russian Номер релиза версии загрузчика. */
    uint8_t FirmwareMajor; /**< \~english Firmware major version number. \~russian Основной номер версии прошивки. */
    uint8_t FirmwareMinor; /**< \~english Firmware minor version number. \~russian Второстепенный номер версии прошивки. */
    uint16_t FirmwareBugfix; /**< \~english Firmware release version number. \~russian Номер релиза версии прошивки. */
    uint32_t SerialNumber; /**< \~english Device serial number. \~russian Серийный номер устройства. */
    uint8_t Reserved[8]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_get_identity_information_t;

typedef struct
{
    uint8_t Result; /**< \~english Calibration result code. In case of successful calibration Result is 0 (CALIBRATION_OK). In case the Result is not 0, some errors happened during calibration process. If you need detailed Result codes description for your device please contact the manufacturer. \~russian Код результата калибровки. В случае успешного завершения калибровки Result принимает значение 0 (CALIBRATION_OK). В случае если значение Result отлично от нуля, в процессе калибровки возникли ошибки. Если Вам требуется подробное описание возможных кодов результата для Вашего устройства, пожалуйста, свяжитесь с производителем. */

} ivm_start_autocalibration_t;

typedef struct
{
    uint32_t Status; /**< \~english Device general status code. Status should be 0 (STATUS_OK) during normal operation. If you need detailed Status codes description for your device please contact the device manufacturer. \~russian Общий код состояния устройства. В нормальном режиме работы значение Status должно быть 0 (STATUS_OK). Если Вам требуется подробное описание возможных значений параметра Status для Вашего устройства, пожалуйста, свяжитесь с производителем. */
    int16_t Temperature; /**< \~english Temperature in tenths of degrees C. Some devices may not support the temperature measurements. In this case 0 will be returned. \~russian Температура процессора в десятых долях градусов цельсия. Некоторые устройства не поддерживают измерения температуры. В этом случае будет возвращаться 0. */
    uint8_t Reserved0[2]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */
    uint16_t IOState; /**< \~english Current state of the device inputs and outputs (set of ORed flags) \~russian Текущее состояние дополнительных цифровых входов и выходов устройства (набор флагов, объединённых через логическое ИЛИ) */
    uint16_t IOEvents; /**< \~english Events occurred with the device inputs and outputs (set of ORed flags). This flags are set by hardware and should be reset by software via calling reset_events command \~russian События, произошедшие в дополнительных цифровых входов и выходов устройства (набор флагов, объединённых через логическое ИЛИ). Флаги устанавливаются аппаратно и должны сбрасываться программно путём вызова команды reset_events */
    uint8_t Reserved1[42]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_get_status_t;

typedef struct
{
    uint8_t ReadyStatus; /**< \~english ReadyStatus indicates whether the measurement is finished or not. Possible values:  0 (MEASUREMENT_NOT_COMPLETE) - the measurement is not complete and the measured data is not ready, 1 (MEASUREMENT_COMPLETE) - the measurement is complete and the measured data is ready to be read. \~russian ReadyStatus позволяет узнать завершилось ли измерение. Возможные значения: 0 (MEASUREMENT_NOT_COMPLETE) – измерение не завершено и измеренные данные не готовы, 1 (MEASUREMENT_COMPLETE) – измерение завершено, можно осуществлять чтение измеренных значений. */
    uint8_t Reserved[15]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_check_measurement_status_t;

typedef struct
{
    uint16_t Frame; /**< \~english Number of the requested frame. Frame numbering starts from 0. \~russian Номер запрашиваемого кадра. Нумерация кадров начинается с 0. */

} ivm_in_get_measurement_raw_t;

typedef struct
{
    uint16_t ADCHighCode[25]; /**< \~english ADC High codes within the requested frame. \~russian Коды верхнего АЦП в рамках запрашиваемого кадра. */
    uint16_t ADCLowCode[25]; /**< \~english ADC Low codes within the requested frame. \~russian Коды нижнего АЦП в рамках запрашиваемого кадра. */

} ivm_out_get_measurement_raw_t;

typedef struct
{
    uint16_t IOEventsRst; /**< \~english By setting bits to 1 in this field you can reset appropriate get_status.IOEvents bits. This field and the get_status.IOEvents have the same structure. Several bits to reset can be ORed \~russian Установка бит в 1 в этом поле приводит к сбросу соответствующих битов в get_status.IOEvents. Структура этого поля совпадает со структурой поля get_status.IOEvents. Для сброс нескольких событий биты могут быть объединены через логическое ИЛИ */
    uint8_t Reserved0[30]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_in_reset_events_t;

typedef struct
{
    uint8_t Reserved0[16]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_out_reset_events_t;

typedef struct
{
    float SamplingRate; /**< \~english This rate determines the period between subsequent samples in measured curve. Units: samples / second.  Normally this parameter is set together with probe signal frequency for providing fixed resolution, which is determined by the SamplingRate / ProbeSignalFrequency ratio. Examples: desired resolution: 100 samples / period; desired probe signal frequency: 10 Hz; in this case required sampling rate is 10 Hz * 100 points / period = 1000 samples / second; in case of probe signal frequency 1 kHz with the same desired resolution the required sampling rate will be 100 KSPS (the value 100 000 in samples / second should be set). The sampling rate value should be in range [1; 2 000 000]. \~russian Частота дискретизации, определяющая промежуток времени между соседними точками в измеряемое последрвательности. Единицы измерения: измерения  секунду. Обычно этот параметр устанавливается совместно с частотой пробного сигнала для обеспечения фиксированного разрешения, которое определяется отношением частоты дискретизации к частоте пробного сигнала (SamplingRate / ProbeSignalFrequency). Примеры: желаемое разрешение: 100 точек на период; желаемая частота пробного сигнала: 10 Гц; в этом случае требуемая частота дискретизации будет 10 Гц * 100 точек на период = 1000 измерений в секунду; в случае частоты пробного сигнала 1 кГц при том же желаемом разрешении частота дискретизации будет 100 000 измерений в секунду. Значение параметра SamplingRate должно находиться в диапазоне [1; 2 000 000]. */
    float ProbeSignalFrequency; /**< \~english Harmonic probe signal frequency. Units: Hz. Normally this parameter is set together with sampling rate for providing fixed resolution. More details in SamplingRate parameter description. ProbeSignalFrequency value should be in range [1, 100 000]. \~russian Частота пробного гармонического сигнала. Единицы измерения: Гц. Обычно этот параметр устанавливается совместно с частотой дискретизации для обеспечения фиксированного разрешения. Подробности в описании параметра SamplingRarte. Значение параметра ProbeSignalFrequency должно находиться в диапазоне  [1, 100 000]. */
    uint32_t NumberPoints; /**< \~english Number points in a single curve measurements, also referred as an IV curve length. Normally this parameter matches resolution, which is determined by the SamplingRate / ProbeSignalFrequency ratio. However in some special cases the value of this parameter can be differ from resolution for covering several harmonic probe signal periods. Period of time, covered by the single curve measurement can be calculated as NumberPoints * SamplingFrequency. The value of this parameter should be in range determined by constants MIN_NUMBER_POINTS and MAX_NUMBER_POINTS. \~russian Число точек, получаемое в ходе одного измерения кривой, этот параметр также упоминается как длина ВАХ или длина кривой. Обычно этот параметр совпадает с разрешением, которое определяется отношением SamplingRate / ProbeSignalFrequency. Тем не менее в некоторых случаях, когда требуется измерить несколько периодов пробного сигнала значение данного параметра может отличаться от разрешения. Величина промежутка времени на протяжении которого производится измерение одной кривой может быть посчитана как произведение NumberPoints * SamplingFrequency. MIN_NUMBER_POINTS и MAX_NUMBER_POINTS. Значение данного параметра должно находиться в промежутке определяемом константами MIN_NUMBER_POINTS и MAX_NUMBER_POINTS. */
    uint32_t NumberChargePoints; /**< \~english This parameter determines delay added testing component precharge before measurement. This parameter is set as number of samples. The value of the delay in seconds can be calculated as NumberChargePoints * SamplingRate. These precharge points are not presented in measurement results. Warning: some devices don’t support precharge. \~russian Этот параметр определяет задержку добавляемую для предварительной зарядки исследуемого компонента перед измерением. Этот параметр задаётся в виде количества точек. Величина задержки в секундах может быть посчитана как произведение параметров NumberChargePoints * SamplingRate. Точки предварительного заряда в результаты измерений не попадают. Предупреждение: некоторые устройства не поддерживают предварительный заряд. */
    float MaxVoltage; /**< \~english Harmonic probe signal voltage amplitude. Units: Volts. This is open circuit voltage. Real voltage drop between probes during the measurement will be smaller due to finite current sensor impedance. The current sensor impedance is determined by the CurrentSensorMode parameter. This parameter can take only the values from fixed set of voltages: 1.2, 3.3, 5, 12. If other value is transferred the closest valid value will be set. \~russian Амплитуда напряжения пробного гармонического сигнала. Единицы измерения: Вольты. Это значение может достигаться в режиме холостого хода. Реальное падение напряжения между щупами в процессе измерения будет меньше из-за конечного импеданса измерителя тока. Импеданс измерителя тока определяется значением параметра CurrentSensorMode. Этот параметр может принимать значения только из фиксированного набора напряжений: 1.2, 3.3, 5 и 12. В случае, если передано другое значение будет установлено ближайшее значение из списка допустимых. */
    uint8_t Reserved0[4]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */
    uint32_t CurrentSensorMode; /**< \~english In different modes current sensor uses different current sense resistors. The higher current the smaller current sense resistor should be used. Mode defines the resolution and noise level. Current sense resistors also limit the maximum current. For preventing damage of sensitive components due to high currents such components should be tested in low current mode. This parameter can take one of the following values: CURRENT_SENSE_MODE_I_HIGH, CURRENT_SENSE_MODE_I_MID, CURRENT_SENSE_MODE_I_LOW. More technical details can be found in user manual. \~russian В разных режимах измеритель тока использует токоизмерительные резисторы разного номинала. Чем больше ток, тем меньше должен быть номинал токоизмерительного резистора. Режим определяет разрешение и уровень шумов. Токоизмерительные резисторы также ограничивают максимальный ток. Чтобы предотвратить повреждение чувствительных компонентов из-за протекания больших токов, такие компоненты должны тестироваться в режиме малых токов. Этот параметр может принимать одно из следующих значений: CURRENT_SENSE_MODE_I_HIGH (режим больших токов), CURRENT_SENSE_MODE_I_MID (режим средних токов), CURRENT_SENSE_MODE_I_LOW (режим малых токов). Более подробную техническую информацию можно найти в основном руководстве к прибору. */
    uint8_t OutputMode; /**< \~english Defines electrical connection of both probe connectors to one of the standard sources. During some operations like automatic ADC calibration output mode can be changed automatically from hardware. Note: both ADCs are permanently connected to corresponding probe connectors. Possible values: 0x0 (OUT_MODE_PROBE_SIGNAL_CONTINUOUS). Upper probe is continuously connected to the probe signal source. Lower probe is continuously connected to the ground through the current sense resistor. This is basic mode for measurements. 0x1 (OUT_MODE_GROUNDED_CONTINUOUS). Both probes are continuously connected to ground. Lower probe is connected to the ground through current sense resistor. 0x2 (OUT_MODE_PROBE_SIGNAL_WITH_GROUNDING). Upper probe is connected to the probe signal source during measurement and automatically grounded when measurements are not conducted. Lower probe is continuously connected to the ground through the current sense resistor. \~russian Определяет подключение разъёмов обоих щупов к одному из стандартных источников. В ходе некоторых операций, например, таких как автоматическая калибровка АЦП, режим подключения щупов может автоматически изменяться. Замечание: оба АЦП постоянно подключены к соответствующим разъёмам щупов. Возможные значения: 0 (OUT_MODE_PROBE_SIGNAL_CONTINUOUS). Верхний щуп непрерывно подключен к источнику пробного сигнала. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. Этот режим является базовым для проведения измерений. 1 (OUT_MODE_GROUNDED_CONTINUOUS). Верхний щуп непрерывно подключен к источнику пробного сигнала. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. Этот режим является базовым для проведения измерений. 2 (OUT_MODE_PROBE_SIGNAL_WITH_GROUNDING). Верхний щуп подключен к источнику пробного сигнала в процессе измерения и автоматически заземляется в случаях, когда измерения не производятся. Нижний щуп постоянно подключен к земле через токоизмерительный резистор. */
    uint8_t Reserved1[19]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_measurement_settings_t;

typedef struct
{
    uint8_t Reserved0[8]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. */
    float ADCMult; /**< \~english Scaling factor for the ADC codes to voltage conversion (for linear model). Units: Volt / count. \~russian Коэффициент масштабирования для пересчёта кодов АЦП в напряжения (в линейной модели). Единицы измерения: Вольт / отсчёт. */
    float ADCVOffset; /**< \~english Bias for the ADC codes to voltage conversion (for linear model). Units: Volts. \~russian Смещение для пересчёта кодов АЦП в напряжения (в линейной модели). Единицы измерения: Вольты. */
    float CurrentSense1Mult; /**< \~english Scaling factor for the ADC codes to currents conversion (for linear model). Units: mA / count. \~russian Коэффициент масштабирования для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА / отсчёт. */
    float CurrentSense1Offset; /**< \~english Bias for the ADC codes to currents conversion (for linear model). Units: mA. \~russian Смещение для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА. */
    float CurrentSense2Mult; /**< \~english Scaling factor for the ADC codes to currents conversion (for linear model). Units: mA / count. \~russian Коэффициент масштабирования для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА / отсчёт. */
    float CurrentSense2Offset; /**< \~english Bias for the ADC codes to currents conversion (for linear model). Units: mA. \~russian Смещение для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА. */
    float CurrentSense3Mult; /**< \~english Scaling factor for the ADC codes to currents conversion (for linear model). Units: mA / count. \~russian Коэффициент масштабирования для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА / отсчёт. */
    float CurrentSense3Offset; /**< \~english Bias for the ADC codes to currents conversion (for linear model). Units: mA. \~russian Смещение для пересчёта кодов АЦП в токи (в линейной модели). Единицы измерения: мА. */
    uint8_t Reserved1[72]; /**< \~english Software should not rely on the value of this field. To provide compatibility with future products the value of this field shouldn’t be modified. \~russian Значение данного поля не должно использоваться в прикладном ПО. Для обеспечения совместимости с другими устройствами не изменяйте значение этого поля. */

} ivm_calibration_settings_t;
/**
 * \~english
 * Open a device by name \a name and return identifier of the device which can be used in calls.
 * @param[in] name - A device name.
 * Device name has form "com:port" or "xi-net://host/serial" or "udp://host:port".
 * In case of USB-COM port the "port" is the OS device uri.
 * For example "com:\\.\COM3" in Windows or "com:///dev/ttyACM34" in Linux/Mac.
 * In case of network device the "host" is an IPv4 address or fully qualified domain uri (FQDN),
 * "serial" is the device serial number in hexadecimal system.
 * For example "xi-net://192.168.0.1/00001234" or "xi-net://hostname.com/89ABCDEF".
 * In case of ethernet udp-com adapter the "host" is an IPv4 address, "port" is network port
 * For example: "udp://192.168.0.2:1024"
 * Note: only one program may use COM-device in same time.
 * If errors occur when opening device, you need to make sure that the COM port is in the system and
 * device is not currently used by other programs.
 * \~russian
 * Открывает устройство по имени \a name и возвращает идентификатор устройства.
 * @param[in] name - Имя устройства.
 * Имя устройства имеет вид "com:port" или xi-net://host/serial или udp://host:port.
 * Для COM устройства "port" это имя устройства в ОС.
 * Например "com:\\.\COM3" (Windows) или "com:///dev/tty/ttyACM34" (Linux/Mac).
 * Для сетевого (XiNet) устройства "host" это IPv4 адрес или полностью определённое имя домена,
 * "serial" это серийный номер устройства в шестнадцатеричной системе.
 * Например "xi-net://192.168.0.1/00001234" или "xi-net://hostname.com/89ABCDEF".
 * Для ethernet переходника com-udp "host" это IPv4 адрес переходника, "port" это порт переходника.
 * Например "udp://192.168.0.2:1024"
 * Замечание: в один момент времени COM устройство может использоваться только одной программой.
 * Если при открытии устройства возникают ошибки, нужно убедиться, что COM-порт есть в системе и что это
 * устройство в данный момент не используется другими программами
 */
IVM_URPC_API_EXPORT device_t IVM_URPC_CALLING_CONVENTION ivm_open_device(const char *uri);

/**
 * \~english
 * Get library version.
 * @param[out] lib_version - Library version.
 * \~russian
 * Версия библиотеки.
 * @param[out] lib_version - Версия библиотеки.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_libversion(char *lib_version);

/**
 * \~english
 * Return measurement result: part (frame) of IV curve obtained during the most recent measurement. The data is retrieved from the device by frames. To read the whole curve frame by frame call this command with different FrameNumber argument values several times. Frame numbering starts from 0. To calculate the number of frames divide expected curve length (in points) by the FRAME_SIZE. The curve length can be controlled by the get/set_measurement_settings command. The FRAME_SIZE is constant and equals to 25 points. In case the curve length is not the multiple of the FRAME_SIZE the last frame will be incomplete. The software should not relay on the residual points of the last frame. Example: to read curve consisting of 120 points 5 frames should be requested (120 / 25 = 4.8 => 5 frames); this command should be called 5 times with the FrameNumber argument values: 0, 1, 2, 3, 4. In the last frame only first 20 points will be valid. To receive valid data this command should be called when the measurement will be fully completed. To check whether the measurement is completed or not use check_measurement_status command. To launch new measurement use start_measurement command. To plot IV curve merge all frames into two large voltage and current arrays. Then make a plot using voltages as X coordinates and currents as Y coordinates of the curve points.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[in] input - Device in data.
 * @param[out] output - Device out data.
 * \~russian
 * Чтение результатов измерения: части вольтамперной характеристики, полученной в ходе последнего измерения. Чтение данных с устройства осуществляется по кадрам. Для получения всей кривой эта команда должна быть последовательно вызвана несколько раз с разными значениями аргумента FrameNumber. Нумерация кадров начинается с 0. Для вычисления количества кадров нужно разделить ожидаемую длину кривой (в точках) на размер кадра (FRAME_SIZE). Длина кривой определяется командами get/set_measurement_settings. Размер кадра (константа FRAME_SIZE) фиксирован и равен 25 точкам. В случае, когда длина кривой не кратна размеру кадра последний кадр будет заполнен не до конца. Программное обеспечение не должно использовать значения остаточных точек в последнем кадре. Пример: для получения кривой, содержащей 120 точек требуется запросить 5 кадров (120 / 25 = 4,8 => 5 кадров); эта команда должна быть вызвана 5 раз со значениями аргумента FrameNumber: 0, 1, 2, 3, 4. В последнем кадре только первые 20 точек будут иметь актуальные значения. Для получения актуальных данных эта команда должна вызываться только после полного завершения измерения. Чтобы проверить завершилось ли последнее измерение или нет, можно воспользоваться командой check_measurement_status. Для запуска нового измерения можно воспользоваться командой start_measurement. Чтобы построить график вольтамперной характеристики нужно объединить все полученные кадры в два массива напряжений и токов. Затем нужно построить график, используя напряжения в качестве X-координат, а токи в качестве Y-координат, точек кривой.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[in] input - Данные, отправляемые устройству.
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_measurement(device_t handle, ivm_in_get_measurement_t *input, ivm_out_get_measurement_t *output);

/**
 * \~english
 * Return device identity information. It is useful to find your device in a list of available devices or check software compatibility with current device and firmware version. Compatibility check should be performed using the compatibility table. Please contact manufacturer to obtain the most recent version of the compatibility table.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Возвращает идентификационную информацию об устройстве. Эта информация удобна для поиска нужного устройства среди списка доступных а также проверки совместимости программного обеспечения с текущим устройством и версией прошивки. Проверка совместимости должна производиться с использованием таблицы совместимости. Пожалуйста, свяжитесь с производителем для получения наиболее свежей версии таблицы совместимости.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_identity_information(device_t handle, ivm_get_identity_information_t *output);

/**
 * \~english
 * Launch device automatic calibration. During calibration procedure coefficients for conversion raw ADC data to currents and voltages for different modes will be found. To provide optimal conditions probes should be isolated from any external devices or conducting surfaces during calibration procedure (just leave probes without any electrical contact). This command is launched in blocking mode: response will be received when the calibration will be complete. New calibration coefficients will be applied for all measurements until the next automatic calibration, manual coefficients setup or device reset (hardware or software). Normally calibration should be performed just once after device initialization. In case of thermal drift recalibration can compensate parameters changes. The device firmware also has default calibration coefficients. So measurements can be conducted without automatic calibration in case the default calibration provides accurate results.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Запуск автоматической калибровки устройства. В процессе калибровки будут найдены коэффициенты, используемые для пересчёта сырых данных АЦП в токи и напряжения. Для обеспечения оптимальных условий щупы не должны иметь контакта с внешними устройствами или проводящими поверхностями во время калибровки (можно просто оставить щупы «в воздухе» без какого-либо электрического контакта). Команда запускается в блокирующем режиме: ответ будет получен после того, как калибровка будет завершена. Новые калибровочные коэффициенты будут применяться ко всем измерениям до следующего запуска автоматической калибровки, установки коэффициентов вручную или перезагрузки устройства (программной или аппаратной). Обычно калибровку устройства нужно производить всего один раз сразу после инициализации устройства. В случае изменения параметров устройства из-за тепловых воздействий повторная калибровка может компенсировать изменения. В прошивке устройства также есть коэффициенты, которые используются по умолчанию. Таким образом, в случае, если коэффициенты по умолчанию обеспечивают достаточно точные результаты, измерения могут производиться без вызова процедуры автоматической калибровки.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_start_autocalibration(device_t handle, ivm_start_autocalibration_t *output);

/**
 * \~english
 * Return current device status.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Возвращает информацию о текущем состоянии устройства.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_status(device_t handle, ivm_get_status_t *output);

/**
 * \~english
 * Launch single measurement in non-blocking mode. It just send the request to start measurement process (command handling will be finished before the whole measurement process will be completed). Use check_measurement_status command to check whether the measurement is finished or not.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * \~russian
 * Команда осуществляет запуск измерения в неблокирующем режиме. Эта команда только отправляет запрос на запуск измерительного процесса (выполнение команды будет завершено до того, как завершится само измерение). Чтобы проверить завершилось ли запущенное измерение или нет, используйте команду check_measurement_status.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_start_measurement(device_t handle);

/**
 * \~english
 * Return information about the most recent measurement. This status changes during the measurement process. This command should be used to check whether the measurement is complete or not before requesting measured data.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Получение информации о последнем измерении. В процессе измерения статус изменяется. Эту команду следует использовать для проверки завершения измерения перед запросом результатов измерений.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_check_measurement_status(device_t handle, ivm_check_measurement_status_t *output);

/**
 * \~english
 * Return raw measurement result: part (frame) of IV curve ADC codes. Note: this command should be used for debug or highly customized measurements. Normally measurement results should be retrieved by the get_measurement command. The data is retrieved from the device by frames. To read the whole curve frame by frame call this command with different FrameNumber argument values several times. Frame numbering starts from 0. To calculate the number of frames divide expected curve length (in points) by the FRAME_SIZE. The curve length can be controlled by the get/set_measurement_settings command. The FRAME_SIZE is constant and equals to 25 points. In case the curve length is not the multiple of the FRAME_SIZE the last frame will be incomplete. The software should not relay on the residual points of the last frame. Example: to read curve consisting of 120 points 5 frames should be requested (120 / 25 = 4.8 => 5 frames); this command should be called 5 times with the FrameNumber argument values: 0, 1, 2, 3, 4. In the last frame only first 20 points will be valid. To receive valid data this command should be called when the measurement will be fully completed. To check whether the measurement is completed or not use check_measurement_status command. To launch new measurement use start_measurement command.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[in] input - Device in data.
 * @param[out] output - Device out data.
 * \~russian
 * Чтение результатов измерения: части (кадра) кодов АЦП вольтамперной характеристики, полученной в ходе последнего измерения. Замечание: эта команда должна использоваться в отладочных целях или в случае нестандартных измерений. В нормальном режиме для получения результатов измерений должна использоваться команда get_measurement. Чтение данных с устройства осуществляется по кадрам. Для получения всей кривой эта команда должна быть последовательно вызвана несколько раз с разными значениями аргумента FrameNumber. Нумерация кадров начинается с 0. Для вычисления количества кадров нужно разделить ожидаемую длину кривой (в точках) на размер кадра (FRAME_SIZE). Длина кривой определяется командами get/set_measurement_settings. Размер кадра (константа FRAME_SIZE) фиксирован и равен 25 точкам. В случае, когда длина кривой не кратна размеру кадра последний кадр будет заполнен не до конца. Программное обеспечение не должно использовать значения остаточных точек в последнем кадре. Пример: для получения кривой, содержащей 120 точек требуется запросить 5 кадров (120 / 25 = 4,8 => 5 кадров); эта команда должна быть вызвана 5 раз со значениями аргумента FrameNumber: 0, 1, 2, 3, 4. В последнем кадре только первые 20 точек будут иметь актуальные значения. Для получения актуальных данных эта команда должна вызываться только после полного завершения измерения. Чтобы проверить завершилось ли последнее измерение или нет, можно воспользоваться командой check_measurement_status. Для запуска нового измерения можно воспользоваться командой start_measurement.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[in] input - Данные, отправляемые устройству.
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_measurement_raw(device_t handle, ivm_in_get_measurement_raw_t *input, ivm_out_get_measurement_raw_t *output);

/**
 * \~english
 * Reset hardware event flags which can be obtained by get_status command
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[in] input - Device in data.
 * @param[out] output - Device out data.
 * \~russian
 * Сбрасывает флаги аппаратных событий, которые можно получить с помощью команды get_status
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[in] input - Данные, отправляемые устройству.
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_reset_events(device_t handle, ivm_in_reset_events_t *input, ivm_out_reset_events_t *output);

/**
 * \~english
 * Settings for probe signal generator, current and voltage sensors. Updated settings will be applied for all measurements until the next update settings command execution or device reset.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Настройки генератора опорного сигнала, измерителей тока и напряжения. Установленные настройки будут применяться ко всем измерениям до следующего вызова команды обновления настроек или перезагрузки устройства.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_measurement_settings(device_t handle, ivm_measurement_settings_t *output);

/**
 * \~english
 * Settings for probe signal generator, current and voltage sensors. Updated settings will be applied for all measurements until the next update settings command execution or device reset.
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[in] input - Device in data.
 * \~russian
 * Настройки генератора опорного сигнала, измерителей тока и напряжения. Установленные настройки будут применяться ко всем измерениям до следующего вызова команды обновления настроек или перезагрузки устройства.
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[in] input - Данные, отправляемые устройству.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_set_measurement_settings(device_t handle, ivm_measurement_settings_t *input);

/**
 * \~english
 * This command provides manual calibration coefficients setup. Normally this command should not be used. Calibration coefficients can be found automatically by executing start_autocalibration command. Device also can operate with default calibration coefficients without any calibration. Manually updated coefficients will be applied for all measurements until the next automatic calibration, manual coefficients setup or device reset (hardware or software).
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[out] output - Device out data.
 * \~russian
 * Эта команда позволяет контролировать значения калибровочных коэффициентов вручную. В нормальном режиме работы эта команда использоваться не должна. Калибровочные коэффициенты могут быть определены автоматически. Для этого нужно выполнить команду start_autocalibration. Устройство также может работать с калибровочными коэффициентами, установленными по умолчанию. Коэффициенты, обновлённые вручную, будут применяться ко всем измерениям до следующего запуска автоматической калибровки, установки коэффициентов вручную или перезагрузки устройства (программной или аппаратной).
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[out] output - Данные, получаемые с устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_calibration_settings(device_t handle, ivm_calibration_settings_t *output);

/**
 * \~english
 * This command provides manual calibration coefficients setup. Normally this command should not be used. Calibration coefficients can be found automatically by executing start_autocalibration command. Device also can operate with default calibration coefficients without any calibration. Manually updated coefficients will be applied for all measurements until the next automatic calibration, manual coefficients setup or device reset (hardware or software).
 * @param[in] handle - Device ID, obtained by ivm_open_device() function.
 * @param[in] input - Device in data.
 * \~russian
 * Эта команда позволяет контролировать значения калибровочных коэффициентов вручную. В нормальном режиме работы эта команда использоваться не должна. Калибровочные коэффициенты могут быть определены автоматически. Для этого нужно выполнить команду start_autocalibration. Устройство также может работать с калибровочными коэффициентами, установленными по умолчанию. Коэффициенты, обновлённые вручную, будут применяться ко всем измерениям до следующего запуска автоматической калибровки, установки коэффициентов вручную или перезагрузки устройства (программной или аппаратной).
 * @param[in] handle - Идентификатор устройства, полученный от ivm_open_device().
 * @param[in] input - Данные, отправляемые устройству.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_set_calibration_settings(device_t handle, ivm_calibration_settings_t *input);

/**
 * \~english
 * Close specified device.
 * @param handle_ptr - An identifier of device.
 * \~russian
 * Закрывает устройство.
 * @param handle_ptr - Идентификатор устройства.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_close_device(device_t *handle_ptr);

/**
 * \~english
 * Load profile from device.
 * @param[in] handle - Device id.
 * @param[out] buffer - Pointer to output char* buffer. Memory for char* pointer must be allocated.
 * @param[out] allocate - Function for memory allocate.
 * \~russian
 * Загружает профиль с устройства.
 * @param[in] handle - Идентификатор устройства.
 * @param[out] buffer -  Адрес указателя на выходной буфер.
 * Память для указателя на char* должна быть выделена.
 * @param[out] allocate - Функция для выделения памяти.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_get_profile(device_t handle, char **buffer, void *(*allocate)(size_t));

/**
 * \~english
 * Save profile to device
 * @param[in] handle - Device id.
 * @param[in] buffer - Input char* buffer.
 * \~russian
 * Загружает профиль с устройства.
 * @param[in] handle - Идентификатор устройства.
 * @param[in] buffer - Входной буфер, откуда будет считан профиль.
 */
IVM_URPC_API_EXPORT result_t IVM_URPC_CALLING_CONVENTION ivm_set_profile(device_t handle, char *buffer);

#ifdef __cplusplus
}
#endif
#endif
