Производитель ультразвуковых толщиномеров получал от заказчиков один и тот же вопрос: «А под Linux программа есть?». Программы под Linux не было, и её написал я, Евгений Росляков. Разработкой занимаюсь с 2016 года. Работаю как самозанятый, по договору, а бухгалтерия получает от меня закрывающие документы. Сам из Москвы, с производителем работали удалённо, приборы мне прислали на стол.
Толщиномеры меряют стенки труб, котлов и резервуаров, а покупают их энергетические компании, заводы, службы технадзора. Прибор работает в поле сам по себе, но после обхода инженер подключает его к компьютеру, сливает замеры, строит отчёт и сдаёт его в архив. Для этого нужна программа на компьютере.
Старую программу лет десять назад написали на C# под Windows. Она работала, но заказчики массово переводили рабочие места на российские дистрибутивы Linux, и производитель начал терять тендеры: в требованиях стояло «совместимость с отечественной ОС». Запуск через слой совместимости работал через раз, а отчёты печатались криво.
Было и второе неудобство. Протокол обмена с прибором описан в прошивке на C, а в программе для компьютера его когда-то переписали заново на C#. Любое изменение в прошивке приходилось повторять дважды, и версии регулярно расходились.
Выбрал Qt и C++. Одна кодовая база собирается под Windows и Linux, интерфейс выглядит одинаково, а работа с USB-портом и файлами не требует отдельного кода под каждую систему. Qt используется по открытой лицензии LGPL, с динамической компоновкой библиотек: производителю не нужно покупать коммерческую лицензию, которую в России сейчас не продают.
Протокол обмена вынес в отдельную библиотеку на чистом C и взял её прямо из прошивки, с небольшими правками. Теперь это один и тот же код в приборе и в программе. Программирование на C здесь оказалось самым скучным и самым полезным местом проекта: разработчик прошивки меняет протокол один раз, а программа на компьютере получает изменение при следующей сборке.
В итоге в проекте сошлись все три языка из строки C/C++/C#. На C — общая библиотека протокола. На C++ с Qt — новая программа. Старый код на C# я разобрал как спецификацию: из него восстановил формулы пересчёта и формат старых файлов замеров, чтобы архивы прошлых лет открывались в новой программе.
Самое интересное — экран сигнала. Инженеру нужно видеть эхо-сигнал с прибора и двигать стробы, по которым считается толщина. В старой программе график рисовался стандартными средствами и подтормаживал на длинных записях. Новый рисую через OpenGL: даже запись на десятки тысяч точек двигается и масштабируется плавно на слабом офисном ноутбуке. Карту толщин по точкам обхода тоже вывожу через OpenGL, цветом от зелёного до красного.
Отчёты строятся по шаблону производителя и сохраняются в PDF. Проверял печать на Linux на нескольких принтерах, потому что именно на ней старая программа и ломалась.
Сборки под Linux сделал пакетами для двух самых распространённых у заказчиков дистрибутивов. Права на USB-порт выдаются при установке, без ручной настройки системы.
Производитель теперь отвечает на тендерный вопрос про Linux одной строкой и ставит программу на рабочие места заказчиков без танцев. Первые установки прошли у постоянного клиента-энергетика: инженеры слили замеры, построили отчёты и не заметили, на какой системе они это делают.
Расхождения версий протокола закончились. Новая функция прибора появляется в программе вместе с новой прошивкой, без отдельной доработки.
Архивы старой программы открываются в новой. Это было обязательным условием: у многих заказчиков отчёты за годы обходов.
Есть и то, что пока не сделано. Обновление прошивки прибора через новую программу работает только под Windows: драйвер загрузчика микроконтроллера под Linux капризничает, и я не стал выпускать сырую версию. Это следующий этап.
Старая программа на C# ещё полгода поставляется для тех, кто не готов обновляться, но новых функций в ней уже не будет.
Если у вас есть прибор и старая программа только под Windows, напишите мне через freelance.ru. Посмотрю код и протокол и скажу, что можно перенести, а что лучше переписать.