воскресенье, 2 июня 2013 г.

О редкой породе козлов... и API DLL

Программисты Velleman (да и проект-менеджеры до кучи) вполне достойны занесения в Красную книгу как редкие козлы. Это же надо было суметь написать (или заказать на стороне и потом принять написанное) API DLL для наборов K8096/K8097 (наборы DIY, «собери сам») так, что вызовы set-типа (установка параметров устройства) и get-типа (получение параметров устройства) не уживаются в одном (общем) потоке (одна программа/процедура/функция/обработчик события).

Ну и ко всему этому они еще ухитрились просто «никак» документировать этот API. Ну т.е. формально все вроде бы описано, но в лоб оно не работает просто от слова «никак». Вызов get-типа начинает работать только в том случае, если он вызывается по другому событию (в другом обработчике). Соответственно при использовании данного контроллера в «реальной жизни» внезапно™ всплывают неожиданные нюансы и тонны кирпичей лулзов.

При всем при этом техподдержка на голубом глазу лепит самоуверенно пишет нам следующее:
The DLL can be used from any programming language.
А когда их начинаешь как нашкодивших котят тыкать носом в эту лужу проблему на примере несложного консольного теста (где были проставлены таймауты по 0,1 сек для компенсации задержек срабатывания, причем увеличение этих таймаутов вплоть до нескольких секунд абсолютно ничего не дает), они начинают лечить поциента обстоятельно рассказывать про асинхронность работы их API и сложность ловли ответа API в консольном приложении, в упор не видя имеющиеся таймауты (используемые для компенсации этой самой асинхронности) в тексте показанной им программы:
If the motor is responding, but you are not getting the correct status, then the problem is due to timing. The communication between the DLL and the card is asynchronous, meaning that when you call SetTorque, the command is sent to the card but the reply may come in later. Once torque has been applied, a confirmation is sent back to the DLL, and the DLL updates its internal status. It is possible that you request the status before the card's answer has been received and processed.
It is very difficult to combine a console application with something event driven.
Еще бы это было не very difficult с настолько криво написанным API DLL (к слову говоря, написанным на Delphi).

В результате, вместо написания нормального кода приходится «вставлять лом» (пруфлинк), и при этом вовсе нет железобетонной уверенности в том, что получившаяся конструкция будет стабильно работать всегда и везде. Ну и само собой разумеется, что в лоб этот API в консольных приложениях использовать невозможно. И дело здесь, как оказывается, вовсе не в асинхронности его работы.




1 комментарий:

  1. Это прекрасно, я считаю:

    We have to weigh carefully the fact that not everyone that will be using the card is a software programmer. We can not use more difficult constructs like callbacks.

    If you know how to write software and want more than the current API can offer, you are free to write your own API. The K8096 uses the serial port which is easy to write to / read from. The communication is documented and we are here to explain it should it not be clear.

    ОтветитьУдалить

Ваш комментарий откроется после проверки и подтверждения.
Благодарю за понимание необходимости проверки!