Интеграция рентгеновских детекторов Detection Technology

Мы предлагаем услуги по интеграции рентгеновских детекторов Detection Technology. Имеем отлаженные решения и многолетний опыт применения в различных проектах.

Семейство высокопроизводительных плат линейных рентгеновских детекторов с ASIC-предусилителем. ASIC-предусилитель преобразует выходное напряжение фотодиодной матрицы в напряжение последовательного выхода для легкой интеграции с электроникой считывания. Могут быть расположены встык, образуя большую линейную матрицу детекторов.

Шаг пикселя 1,5, 1,6 и 2,5 мм доступен с различными вариантами сцинтилляторов для широкого спектра применений с энергией рентгеновского излучения от 30 до 450 кВт/ч. X-Card 2 выпускается с шагом пикселя 0,2, 0,4 и 0,8 мм и обладает ключевыми преимуществами при меньшем шаге пикселя, повышенной чувствительности и длительном сроке службы благодаря максимальной стойкости к излучению. Доступны варианты сцинтилляторов для широкого спектра применений с энергией рентгеновского излучения от 30 кВп до 9 МэВ.

#ifndef XRAYPLUGIN_H
#define XRAYPLUGIN_H

#include "XRayPluginGlobal.h"

#ifdef __cplusplus
extern "C" {
#endif

#define XRAYPLUGIN_ALLOK               (0)   ///< Все хорошо
#define XRAYPLUGIN_NOT_CONNECTED       (-1)  ///< Плата не подключена (попытка работы с платой в отсутствии пройденой процедуры подключения)
#define XRAYPLUGIN_ALLREADY_CONNECTED  (-2)  ///< Плата уже подключена (ошибка при подключении к новой плате, когда уже есть одно подключение)
#define XRAYPLUGIN_INTERNAL_ERROR      (-3)  ///< Внутренняя ошибка (не должно появляться в штатной работе)
#define XRAYPLUGIN_BAD_PARAMS          (-4)  ///< Неверные/недопустимые параметры
#define XRAYPLUGIN_LOCK_ERROR          (-5)  ///< Ошибка захвата мьютекса (возможна при некоректной работе в многопоточном окружении)
#define XRAYPLUGIN_INIT_ERROR          (-6)  ///< Ошибка инициализации платы (возможно аппаратные проблемы платы)
#define XRAYPLUGIN_NOT_FOUND           (-7)  ///< Плата не обнаружена (плата не подключена, нет питания платы и т.п.)
#define XRAYPLUGIN_FAILTURE            (-8)  ///< Сбой
#define XRAYPLUGIN_UNSUPPORTED         (-9)  ///< Операция не поддерживается (текущая версия платы не поддерживает данный функционал)
#define XRAYPLUGIN_RECEIVEINPROGRESS   (-10) ///< Идет прием данных (возникает при попытке изменения конфигурации/настроек при активном режиме сканирования когда идет поток строк)

#define XRAYPLUGIN_BITS_16             (16)  ///< 16-битный режим сэмплирования данных
#define XRAYPLUGIN_BITS_18             (18)  ///< 18-битный режим сэмплирования данных

#define XRAYPLUGIN_CARDINFO_NAME_MAXLEN   (30)
#define XRAYPLUGIN_CARDINFO_DESC_MAXLEN   (50)

/// Информация о плате-сенсоров поддерживаемой данной платой захвата
struct cardInfo {
    char name[XRAYPLUGIN_CARDINFO_NAME_MAXLEN],  ///< Название платы
         description[XRAYPLUGIN_CARDINFO_DESC_MAXLEN];  ///< описание платы
    char energyCount;    ///< кол-во энергий (1 или 2)
    short pixelsCountPerEnergy;
} __attribute__((packed));

#define XRAYPLUGIN_PLUGIN_API_VERSION    "0.9"

#define XRAYPLUGIN_PLUGININFO_VERSION_MAXLEN         (25)
#define XRAYPLUGIN_PLUGININFO_DESCRIPTION_MAXLEN     (30)
#define XRAYPLUGIN_PLUGININFO_TIMESTAMPSTR_MAXLEN    (30)

/// Информация о данном плагине
struct pluginInfo {
    int apiVersion;  ///< версия API
    unsigned long long pluginApiFeatureSet;  ///< битовое поле с поддерживаемыми опциональными возможностями
    unsigned int timestamp;  ///< дата/время сборки плагина
    char version[XRAYPLUGIN_PLUGININFO_VERSION_MAXLEN],   ///< версия плагина
         description[XRAYPLUGIN_PLUGININFO_DESCRIPTION_MAXLEN],  ///< описание плагина
         timestampStr[XRAYPLUGIN_PLUGININFO_TIMESTAMPSTR_MAXLEN];  ///< отметка времени
} __attribute__((packed));

#define XRAYPLUGIN_BOARDINFO_VENDOR_MAXLEN           (50)
#define XRAYPLUGIN_BOARDINFO_MODEL_MAXLEN            (50)
#define XRAYPLUGIN_BOARDINFO_DESCRIPTION_MAXLEN      (50)
#define XRAYPLUGIN_BOARDINFO_SERIALNUMBER_MAXLEN     (25)
#define XRAYPLUGIN_BOARDINFO_SOFTWAREVERSION_MAXLEN  (25)
#define XRAYPLUGIN_ERRORSTR_MAXLEN                   (120)

/// Информация о подключенной плате захвата
struct boardInfo {
    unsigned long long boardApiFeatureSet;  ///< битовое поле с поддерживаемыми опциональными возможностями
    char channelsCount;  ///< кол-во каналов для подключения плат сенсоров
    char vendor[XRAYPLUGIN_BOARDINFO_VENDOR_MAXLEN],  ///< прозводитель платы
         model[XRAYPLUGIN_BOARDINFO_MODEL_MAXLEN],  ///< модель платы
         description[XRAYPLUGIN_BOARDINFO_DESCRIPTION_MAXLEN],  ///< описание платы
         serialNumber[XRAYPLUGIN_BOARDINFO_SERIALNUMBER_MAXLEN],  ///< серийный номер платы
         softwareVersion[XRAYPLUGIN_BOARDINFO_SOFTWAREVERSION_MAXLEN];  ///< версия ПО/прошивки платы
    float minGain, maxGain, gainStep, minStartConvPeriodSec, maxStartConvPeriodSec,
            minStartTransferDelaySec, maxStartTransferDelaySec;
    short minStartConvDelay, maxStartConvDelay;
    short supportedCardsTypeCount;
} __attribute__((packed));

/// Конфигурация платы захвата
struct boardConfig {
    char cardCount[XRAYPLUGIN_BOARD_MAXCHANNELSCOUNT];
} __attribute__((packed));

/// Конфигурация всей системы захвата (возможно объединение нескольких плат захвата в единую систему)
struct boardsConfig {
    struct boardConfig  boards[XRAYPLUGIN_BOARD_MAXBOARDSCOUNT];
    short               card;  ///< тип используемой платы сенсоров
    char                bits;  ///< режим "битности"
    char                masterBoardNum;   ///< При использовании конфигурации с несколькими платами захвата, здесь указывается номер платы захвата "мастера" (истоника синхронизации)
} __attribute__((packed));

/// настройки синхронизации платы захвата
struct syncConfig {
    float startConvPeriod, startTransferDelay;
    int startConvDelay;
} __attribute__((packed));

/// Структура с данными строки изображения
struct imgLine {
    const float  *leData,  ///< данные с низкоэнергетической линейки
                 *heData;  ///< данные с высокоэнергетической линейки
    int          length;   ///< длина строки (кол-во пикселей)
} __attribute__((packed));

/// Callback-функция в которую передаются сообщения протокола работы (лога)
typedef void (* __stdcall xrayLogCallbackFn)(int logLevel, const char *fileName,
        const char *funcName, unsigned int line, long long threadId,
        const char *threadNameIn, const char *msg, void *userData);
/*!
Установить указатель на callback-функцию лога
\param[in] fn указатель на callback-функцию
\param[in] userData указатель на данные пользователя который будет передаваться в callback-функцию
 */
int __stdcall DLL_PUBLIC xraySetPrintCallback(xrayLogCallbackFn fn, void *userData);
/*!
Установить текущий уровень подробности лога
\param[in] info Уровень подробности лога
 */
int __stdcall DLL_PUBLIC xraySetLogLevel(int logLevel);

/*!
Функция которая должна вызываться при загрузке плагина, возвращает структуру с
описанием плагина
\param[out] info Информация о плагине
 */
int __stdcall DLL_PUBLIC xrayPluginLoad(struct pluginInfo *info);
/*!
Выгрузить плагин
 */
int __stdcall DLL_PUBLIC xrayPluginUnload(void);
///
/*!
Запросить код и описание последней ошибки
\param[out] errorNum Указатель на переменную куда сохранить код ошибки
\param[out] errorStr Указатель на буфер куда сохранить описание ошибки
\param[in] errorStrSize Размер буфера куда будет сохранено описание ошибки
 */
int __stdcall DLL_PUBLIC xrayGetErrorMessage(int *errorNum, char *errorStr,
                                             int errorStrSize);

/// Callback-функция в которую строки изображения
typedef void (* __stdcall xrayLineCallbackFn)(int status, const struct imgLine *line,
                                              void *userData);
/*!
Подключение к плате захвата
\param[in] connectString Строка подключения
\param[out] info Информация о подключенной плате захвата
 */
int __stdcall DLL_PUBLIC xrayBoardConnect(const char *connectString,
                                          struct boardInfo *info);
/*!
Отключиться от платы захвата
 */
int __stdcall DLL_PUBLIC xrayBoardDisconnect(void);
/*!
Получить информацию плате сенсоров
\param[in] num Номер типа платы сенсоров
\param[out] info Информация о плате сенсоров
 */
int __stdcall DLL_PUBLIC xrayGetCardTypeInfo(int num, struct cardInfo *info);
/*!
Задать конфигурацию системы захвата (состоящей из одной или нескольких плат захвата)
\param[in] config структура с описанием системы захвата
 */
int __stdcall DLL_PUBLIC xraySetBoardConfig(struct boardsConfig *config);
/*!
Задать конфигурацию системы синхронизации
\param[in] config структура с конфигурацией синхронизации
 */
int __stdcall DLL_PUBLIC xraySetSyncConfig(struct syncConfig *config);
/*!
Задать уровень усиления сигнала с сенсоров
\param[in] value уровень усиления сигнала
 */
int __stdcall DLL_PUBLIC xraySetGain(float value);
/*!
Запустить прием данных. При этом система сбора начнет формировать строки
изображения в соответствии с заданной ранее конфигурацией
 */
int __stdcall DLL_PUBLIC xrayStartReceive(void);
/*!
Остановить прием данных.
 */
int __stdcall DLL_PUBLIC xrayStopReceive(void);
/*!
Установить указатель на Callback-функцию для возвращения строк изображения
\param[in] fn указатель на callback-функцию для возврата строк
\param[in] userData указатель на данные пользователя который будет передаваться в callback-функцию
 */
int __stdcall DLL_PUBLIC xraySetImgLineCallback(xrayLineCallbackFn fn, void *userData);

#ifdef __cplusplus
}
#endif

#endif // XRAYPLUGIN_H