Технология DiScoX Общие положения Технология DiScoX предназначена для создания пользователями собственных компонентов графической оболочки осциллографа DiSco. Созданные и подключенные компоненты отображаются в дополнительных закладках приложения. Пользовательский компонент создается на основе технологии ActiveX. Для того, чтобы ActiveX компонент мог быть подключен к приложению, необходимо соблюдение следующих условий: 1. Файл компонента должен иметь расширение *.ocx 2. Файл компонента должен располагаться в подкаталоге AddIns рабочего каталога программы 3. Файл компонента должен содержать экспортируемую функцию DllGetControlProgID(char* progId, char* caption) progId – указатель на z-строку, содержащую ProgId (ClassName) компонента caption - указатель на z-строку, содержащую отображаемое наименование компонента (Примечание – z-строка – это последовательность байт (символов), заканчивающаяся байтом 00H) Порядок создания компонента на примере продуктов Borland C++ Builder 6 и Borland Delphi 7 1. Создать проект Active Form (File->New->Other->ActiveX->ActiveForm) 2. В появившемся диалоговом окне ввести имя создаваемого компонента, например «ActiveFormX». 3. В файл проекта добавить экспортируемую функцию DllGetControlProgID Delphi: В файл проекта (*.dpr) добавляется функция procedure DllGetControlProgID(szProgID: PAnsiChar;szCaption: PAnsiChar); stdcall; var ProgID: string; Caption: string; begin ProgID := ClassIDToProgID(CLASS_ActiveFormX); Caption := 'Delphi DiScoX Test'; StrCopy(szProgID, PChar(ProgID)); StrCopy(szCaption, PChar(Caption)); end; Для того, чтоб эта функция могла быть экспортирована ее имя включается в секцию exports файла проекта exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer, DllGetControlProgID; С++Builder: В файл проекта добавляется функция extern "C" void _export DllGetControlProgID(char* progId, char* caption) { strcpy(progId, ClassIDToProgID(CLSID_ActiveFormX).c_str()); strcpy(caption, "BCB DiScoX Test"); } 4. Разместить на главной форме проекта необходимые компоненты. 5. Скомпилировать проект. 6. Поместить полученный *.ocx файл в каталог AddIns (или в любой подкаталог данного каталога). 7. Запустить графическую оболочку DiSco 8. В программе-оболочке выбрать пункт меню «Сервис->Настройки->ActiveX». В появившейся закладке отменить компонент, который необходимо отобразить на дополнительной закладке и нажать OK. В результате в программе-оболочке появится дополнительная закладка, содержащая только что созданный ActiveX компонент. Доступ к функциям осциллографа с помощью DiSco API Доступ к функциям осциллографа осуществляется на основе COM-интерфейсов. Для того чтобы получить к ним доступ требуется импортировать из системы соответствующую библиотеку типов. При работе в Borland Delphi и CBuilder это осуществляется выбором пункта меню “Project->Import Type Library…”. В появившемся диалоговом окне следует найти библиотеку “OscAPI 1.0 Type Library (Version 1.0)” и импортировать библиотеку нажатием кнопки Create Unit. При этом в проект будет включен файл, содержащий описание классов, обеспечивающих доступ к функциям осциллографа. Импортированная COM-библиотека содержит следующие интерфейсы: Интерфейс IDevice HRESULT Init([in] int initParam) – инициализация библиотеки. Передаваемый функции параметр всегда должен быть равен 0. HRESULT GetFirmwareVersion([out,retval] BSTR* ver) – возвращает версию ПО устройства в формате 'X.X (DD/MM/YY)' HRESULT ResetDevice(void) – сброс устройства; Интерфейс IOscilloscope HRESULT GetChannelData([in,out] SAFEARRAY (double)buffer, [in,out] int* bufferSize, Channel channel); HRESULT SetChannelOnOff([in] Channel channel, [in] OnOff onOff); включить.выключить канал HRESULT SetPipeMode([in] PipeMode mode); - установить режим чтения HRESULT SetPipeBufferSize([in] int size) – размер буфера чтения в байтах (при работе в потоковом режиме) HRESULT UseTrigger([in] VARIANT_BOOL useTrigger) – включить синхронизацию HRESULT SetTriggerEdge([in] TriggerEdge edge) – задать тип синхронизации (по фронту/спаду) HRESULT SetTriggerSource([in] TriggerSource src) – задать источник синхронизации HRESULT SetTriggerType([in] TriggerType type) – задать тип синхронизации HRESULT SetTriggerLevel([in] Channel channel, [in] double level); - задать уровень синхронизации для канала (по умолчанию 0 В) HRESULT SetDiffTriggerLevel([in] double level); - задать величину перепада при дифференциальной синхронизации (по умолчанию 0.5 В) HRESULT SetTimeBase([in] double timeBase); - установить период дискретизации в секундах HRESULT SetSamplingFrequency([in] double samplingFrequency); - установить частоту дискретизации в герцах HRESULT SetChannelMaxGain([in] Channel channel, [in] double voltage); установить диапазон измеряемого напряжения в вольтах HRESULT Run(void); - запустить измерение HRESULT GetChannelSample(int index, Channel channel, [out, retval] double* data); получить отсчет с номером index. Кроме того, в библиотеке определены следующие перечисляемые типы typedef enum PipeMode {Buff = 0, Pipe} PipeMode; typedef enum TriggerEdge {Falling = 0, Rising} TriggerEdge; typedef enum TriggerType {Absolute = 0, Differential} TriggerType; typedef enum TimerMultiplier {HzX10, HzX1} TimerMultiplier; typedef enum Channel {A, B} Channel; typedef enum TriggerSource {ChannelA, ChannelB, External} TriggerSource; typedef enum OnOff {Off, On} OnOff;