Дата публикации: Oct 07, 2015 9:23:6 PM
Когда-то давно, аж три года тому назад, я сделал небольшое приложение на языке python, которое я назвал Serial Flow Monitor. Название произошло от имени библиотеки SerialFlow, реализующей простой протокол обмена данными по последовательному порту. Подробно про этот протокол я уже писал в одной из статей.
Собственно, всё умеет делать SFMonitor - это слушать последовательный порт, и разбирать пакеты протокола, красиво отображая данные. Полученные данные отображаются в виде цветных графиков, с возможностью постраничного вывода - очень удобно и наглядно. В свое время, SFMonitor помог мне разобраться с комплементарным фильтром для инклинометра.
И вот, пару недель тому назад, мне снова потребовался мой SFMonitor. Появилась задача визуализации данных с датчика TSL1401. Эти данные представляют собой вектор из 128 байт. То есть это совсем не график функции от времени, это нечто другое. Нужен был новый тип визуализации пакета, который бы каждый момент времени отображал все значения вектора в плоскости V(N), где V - значение байта, N - номер байта.
Как всегда бывает у закоренелых кодеров, дело не обошлось только этим изменением. Я вдруг решил, что приложение нужно кардинально обновить, и привести в порядочный вид. Попутно захотелось применить SFMonitor в занятиях со школьниками. Например, можно очень наглядно продемонстрировать как меняется значение на выходе того же акселерометра.
Также, следовало адаптировать код под свежую версию python 3.4, ведь изначально SFMonitor запускался на python 2.6. В свою очередь, обновление интерпретатора привело к необходимости замены компонента визуализации графиков. Пришлось отказаться от QWT, в пользу pyqtgraph. О чем я нисколько не пожалел. pyqtgraph такой же быстрый, как и QWT, а самое главное - проект ещё живой.
За две недели вечернего кодинга, удалось реализовать практически все хотелки. В итоге, было сделано следующее:
1) Добавлен новый тип визуализации Вектор. То, что раньше называлось вектором, было переименовано в Позицию. Именно режим Позиция изображен в ролике про акселерометр.
2) Добавлен вид отображения графиков - точечный (scatter).
3) Добавлены настройки:
Данные/Параметры потоков
цвет графика;
точечный график - переключение между точечным и сплошным;
беззнаковый/знаковый - как интерпретировать данные в пакете, со знаком или без;
размер значения в пакете - сколько байт занимает значение в пакете. Может быть 1 байт (0..255), или 2 (0..65535);
отображать шлейф - в режиме Позиция, за маркером тянется небольшой шлейф;
наличие разделителя значений - вариант пакета, в котором значения не разделяются символом 0x10, удобно для векторов;
Данные/Шкалы графика
размер страницы;
Файл/Настройки:
язык;
4) Добавлена локализация с возможностью расширения. Исходники переводов хранятся в файлах .po, которые затем необходимо
скомпилировать в .mo файлы. Пока есть только Английский и Русский языки.
5) Наконец, собран msi-инсталлятор для установки приложения на windows. Сборочный скрипт добавлен в git-репозиторий проекта (setup.py)
Кстати, есть ещё одно важное изменение. Сама библиотека SerialFlow тоже немного изменилась, так что следует взять свежую версию по ссылке внизу статьи. В частности, изменилась функция setPacketFormat. Теперь у неё три таких аргумента:
размер значения в байтах (1 или 2);
длина пакета (до 128);
разделять значения (true или false).
Исходники проекта теперь общедоступны на Github. Каждый желающий может дописать библиотеку, добавить в неё новые возможности. Достаточно написать мне на почту просьбу о добавлении в участники проекта (нужно выдать права "пушера" на github). Также я готов выслушать разумные предложения по развитию проекта.
В ближайших планах написать урок по использованию приложения на нашем учебном портале robotclass.ru, а также дополнить существующие уроки.
P.S. Данные с датчика TSL1401 так и не удалось посмотреть - пациент умер :(
Исходные коды SFMonitor: https://github.com/makeitlab/software_tools.git
Дистрибутив: http://git.robotclass.ru/download/SFMonitor-1.1-win32.msi
SerialFlow библиотека: https://github.com/oevsegneev/arduino-dev/tree/master/libs/SerialFlow