API для SECU

Обсуждение программного обеспечения для ПК и БК. Discussion of related computer software.

Moderator: STC

serge__5518
LQFP112 - Up with the play
Posts: 200
Joined: Sat Jun 09, 2012 11:12 am

Re: API для SECU

Post by serge__5518 »

STC wrote:нужно компилировать с использованием MS Visual Studio и делать в виде динамически линкуемой DLL.
Я давно не использовал DLL. Подзабыл кое что... Но не думаю, что это проблема.
А если сразу использовать DLL менеджера?
Что мне мешает создать объект класса CCommunicationManager используя DLL и хедер файлы. Правда, похоже что хедеры нужно будет слегка поправить...
При этом использую следующие DLL (поправь если неправ):
fwimpexp.dll, hexutils.dll, io-core.dll, paramdesk.dll.
STC wrote:более правильно будет перетянуть к себе класс PlatformParamHolder.
Ок!
ВАЗ 2103 , Secu-3 (m32),
ДАД GM Daewoo, ДТОЖ 23.3828,
Катушка 2111-3705010
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: API для SECU

Post by STC »

А если сразу использовать DLL менеджера?
Что мне мешает создать объект класса CCommunicationManager используя DLL и хедер файлы. Правда, похоже что хедеры нужно будет слегка поправить...
При этом использую следующие DLL (поправь если неправ):
fwimpexp.dll, hexutils.dll, io-core.dll, paramdesk.dll.
По идее тебе не нужно ничего кроме io-core. Но для ее подключения к Builder тебе нужно написать прослойку (твой API) и желательно чтобы эта прослойка выглядела как набор С-функций с конвенцией вызова cdecl. У твоего API будет отдельный заголовочный файл (*.h) и файл *.cpp в котором будет реализация API (создание классов и вызов функций из кишков io-core). Заголовочные файлы править наверное не нужно, так как ты врядли будешь вызывать ф. напрямую, а только через свой API.
Я не знаю можно ли из Builder работать с DLL связанной на этапе компиляции, скорее всего нужно будет делать "позднее звязывание" (как сделано в SECU-3 Manager когда он вызывает ф. из Builder). Я имею ввиду рботу через ф. GetModuleHandle и GetProcAddress
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
serge__5518
LQFP112 - Up with the play
Posts: 200
Joined: Sat Jun 09, 2012 11:12 am

Re: API для SECU

Post by serge__5518 »

STC wrote: По идее тебе не нужно ничего кроме io-core.
Ok!
Посмотрел исходники CCommunicationManager. В принципе переписать его в Builder несложно.
Нужно будет переписать инициализацию ISettingsData* m_pSettings;

Нужно-ли в API беспокоиться о взаимодействии адаптеров и контроллеров? Или достаточно, например:
m_pControlApp->SetEventHandler(m_pAppAdapter);

А что делает объект EventHandler в классе CCommunicationManager?

Для чего и как часто нужно включать/выключать контроллеры?
(в контексте API)

P.S.
Проблемы подключения Builder к Microsoft DLL в любом виде, вроде решаемы.
ВАЗ 2103 , Secu-3 (m32),
ДАД GM Daewoo, ДТОЖ 23.3828,
Катушка 2111-3705010
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: API для SECU

Post by STC »

Посмотрел исходники CCommunicationManager. В принципе переписать его в Builder несложно.
Нужно будет переписать инициализацию ISettingsData* m_pSettings;
Думаю что без особой надобности переписывать его не нужно, нужно просто использовать его внутри реализации твоего API.
ISettingsData тебе не нужен, так как он описывает доступ к настройкам менеджера, а тебе они не нужны. В местах где вызываются функции этого интерфейса просто поставь нужные тебе значения или свои функции.
Нужно-ли в API беспокоиться о взаимодействии адаптеров и контроллеров? Или достаточно, например:
m_pControlApp->SetEventHandler(m_pAppAdapter);
Нет, беспокоиться не нужно. Адаптеры и контроллеры уже связываются вместе и инициализируются в CCommunicationManager.
А что делает объект EventHandler в классе CCommunicationManager?
Если открыть окно настроек менеджера и нажать ОК, то вызовется метод MainFrameController::OnAppSettings(), он в свою очередь сделает вызов m_pCommunicationManager.Init(), а тот в свою очередь вызовет EventHandler (это функция). Каждый контроллер вкладки в менеджере подписывается на на вызов EventHandler вызывая ССommunicationManager::setOnSettingsChanged() и передавая в качестве параметра адрес своего метода (например см. СParamMonTabController::OnSettingsChanged()). Таким образом каждый контроллер вкладки уведомляется о том, что настройки менеджера изменились.
Для чего и как часто нужно включать/выключать контроллеры?
(в контексте API)
В менеджере они включаются/выключаются при переходе между вкладками. Переключение контроллеров нужно чтобы работать или с прошивкой или с бутлоадером. В принципе это не нужно, просто я с самого начала так сделал (когда только начинал писать менеджер), а потом не стал переделывать.
Тебе понадобится переключать их если ты захочешь работать и с прошивкий и с загрузчиком. Если тебе нужно работать только с прошивкой, то включи 1 раз при инициализации API соответствующий контроллер и все.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
serge__5518
LQFP112 - Up with the play
Posts: 200
Joined: Sat Jun 09, 2012 11:12 am

Re: API для SECU

Post by serge__5518 »

STC wrote: Думаю что без особой надобности переписывать его не нужно
Скажем так, не переписать а почти скопировать -)
В любом случае, исходник как он есть, не скомпилируется в Builder ( если точнее , у меня CodeGear 2009.но это не меняет суть).
STC wrote: ISettingsData тебе не нужен, так как он описывает доступ к настройкам менеджера
Да, согласен.
STC wrote: Если открыть окно настроек менеджера и нажать ОК, то вызовется метод MainFrameController::OnAppSettings(), он в свою очередь сделает вызов m_pCommunicationManager.Init()
T.o. если API меняет платформу или параметры порта -вызываем СCommunicationManager::Init(void) ?
STC wrote:Если тебе нужно работать только с прошивкой, то включи 1 раз при инициализации API соответствующий контроллер и все.
Ок!
ВАЗ 2103 , Secu-3 (m32),
ДАД GM Daewoo, ДТОЖ 23.3828,
Катушка 2111-3705010
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: API для SECU

Post by STC »

T.o. если API меняет платформу или параметры порта -вызываем СCommunicationManager::Init(void) ?
Нужно вызывать только если изменились параметры порта.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
serge__5518
LQFP112 - Up with the play
Posts: 200
Joined: Sat Jun 09, 2012 11:12 am

Re: API для SECU

Post by serge__5518 »

STC wrote:В интернете есть инфа как это делать (делается через def файл), там вроде отличие только в наличии или отсутствии подчеркиваний в именах ф.
С функциями проще. С классами сложнее. Похоже, с классами я "погорячился" насчет подключения MS DLL к Builder.
В общем сделал импорт библиотеки из DLL(утилиткой implib.exe). Но декорирование имен в библиотеке осталось от MS VC++ (не понимает его Builder -).
coff2omf.exe не хочет преобразовывать lib-файл...
Если грузить DLL в процессе выполнения программы, то непонятно как получить указатель на конструктор класса для создания объекта. Тогда нужно что-то менять(добавлять) в исходниках....
В общем, если есть у тебя осталась библиотека от компиляции io-core.dll - вышли, если не затруднит.
ВАЗ 2103 , Secu-3 (m32),
ДАД GM Daewoo, ДТОЖ 23.3828,
Катушка 2111-3705010
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: API для SECU

Post by STC »

С функциями проще. С классами сложнее. Похоже, с классами я "погорячился" насчет подключения MS DLL к Builder.
Я бы с классами не заморачивался, а сделал бы API в виде С-функций.
В общем сделал импорт библиотеки из DLL(утилиткой implib.exe). Но декорирование имен в библиотеке осталось от MS VC++ (не понимает его Builder -).
coff2omf.exe не хочет преобразовывать lib-файл...
Попробуй поиграться с def-файлом. Вот пример из SECU-3 Manager:

Code: Select all

EXPORTS
  ; VC funcname              = BCB funcname
  Chart2DCreate              = _Chart2DCreate
  Chart2DUpdate              = _Chart2DUpdate
  Chart2DSetOnChange         = _Chart2DSetOnChange
  Chart2DSetOnClose          = _Chart2DSetOnClose
  Chart2DSetMarksVisible     = _Chart2DSetMarksVisible  
  Chart2DSetAxisValuesFormat = _Chart2DSetAxisValuesFormat
  Chart2DSetOnGetAxisLabel   = _Chart2DSetOnGetAxisLabel
  Chart2DInverseAxis         = _Chart2DInverseAxis
  Chart2DShow                = _Chart2DShow
  Chart2DSetLanguage         = _Chart2DSetLanguage
  Chart2DSetOnWndActivation  = _Chart2DSetOnWndActivation
  Chart2DEnable              = _Chart2DEnable
  Chart2DSetAxisEdits        = _Chart2DSetAxisEdits
  Chart2DUpdateAxisEdits     = _Chart2DUpdateAxisEdits
Тебе по идее нужно левую и правую части поменять местами.
Если грузить DLL в процессе выполнения программы, то непонятно как получить указатель на конструктор класса для создания объекта. Тогда нужно что-то менять(добавлять) в исходниках....
Ну сделать банальную функцию, которая будет создавать объект и возвращать указатель. Можно через "фабрику" сделать.
В общем, если есть у тебя осталась библиотека от компиляции io-core.dll - вышли, если не затруднит.
Осталась:
Attachments
io-core_static_lib.zip
(12.55 KiB) Downloaded 690 times
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
serge__5518
LQFP112 - Up with the play
Posts: 200
Joined: Sat Jun 09, 2012 11:12 am

Re: API для SECU

Post by serge__5518 »

STC wrote: Я бы с классами не заморачивался, а сделал бы API в виде С-функций.
Прошу прощения - долго не отвечал.
Речь шла об использовании io-core.DLL. А в DLL -классы. Их не вытянуть в виде функций.
А если насчет DEF файла, то например определения конструктора класса CComPort выглядят так:
VC ??0CComPort@@QAE@ABV0@@Z
Builder @CComPort@$bctr$qiuiui
Т.о., в лучшем случае нужно собрать заново DLL -)

Решил пойти другим путем. Сейчас закончил адаптацию классов в каталоге io-core под Builder.
Сделал все кроме адаптеров, так как там построено все на CWnd.
В файлах сделал изменения по #define USE_FOR_API_BUILDER. Изменения можно
найти поиском по строке @Add_serge_5518. В основном это отличия синтаксиса и линковки заголовочных файлов. Архив с измененными файлами привожу ниже. Можно подумать как эти изменения интегрировать более изящно -). Если вариант с изменениями в исходниках одобряешь - можно двигаться дальше.
Attachments
io-core_changed.zip
(69.78 KiB) Downloaded 702 times
ВАЗ 2103 , Secu-3 (m32),
ДАД GM Daewoo, ДТОЖ 23.3828,
Катушка 2111-3705010
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: API для SECU

Post by STC »

Речь шла об использовании io-core.DLL. А в DLL -классы. Их не вытянуть в виде функций.
Я имел ввиду написать обертки для классов на С.
Сделал все кроме адаптеров, так как там построено все на CWnd.
Замени его на аналогичный класс в билдере. СWnd используется для получения сообщений, это невидимое окно у которого родительским является главное окно (да любое). Эти сообщения посылает поток из CControlApp.
В файлах сделал изменения по #define USE_FOR_API_BUILDER. Изменения можно
найти поиском по строке @Add_serge_5518. В основном это отличия синтаксиса и линковки заголовочных файлов. Архив с измененными файлами привожу ниже. Можно подумать как эти изменения интегрировать более изящно -). Если вариант с изменениями в исходниках одобряешь - можно двигаться дальше.
В принципе ничего против варианта с исходниками не имею, думаю что можно и так. Архив посмотрю вечером.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Post Reply