Это система для управления различным оборудованием и программным обеспечением.
TANGO поддерживает 4 платформы на данный момент: Linux, Windows NT, Solaris и HP-UX.
Здесь будет описана работа с Linux(Ubuntu 18.04) Упрощает работу с различным оборудованием и софтом. Из исходников не смог ее запустить, для работы использовал готовый образ TangoBox 9.3.
В инструкции описано как ставить из пакетов. Нас будут интересовать только первые два компонента. Я работал с ней на python & c++. Здесь в качестве примера будет использоваться c++. Теперь перейдем к описанию как подключить устройство к TANGO и как с ним работать. В качестве примера будет взята плата GPS neo-6m-0-001:  Как видно на картинке плату к ПК подключаем через UART CP2102. При подключении к ПК появляется устройство /dev/ttyUSB[0-N], обычно /dev/ttyUSB0. Теперь запустим pogo, и с генерируем скелет код для работы с нашей платой.  У меня уже был создан код, создадим его заново File->New.  Получаем следующее:  Наше устройство(под устройством в дальнейшем будет иметься ввиду программная часть) пустое и имеет две команды управления: State & Status. Его нужно заполнить необходимыми атрибутами:  Device Property — значения по умолчанию которые передаем в устройство для его инициализации, для платы GPS нужно передать имя платы в системе com="/dev/ttyUSB0" и скорость com порта baudrade=9600 Commands — команды управления нашим устройством, им можно задать аргументы и возвращаемое значение. Далее задаются атрибуты устройства которые можно читать/писать в/из него.
Scalar Attributes — простые атрибуты (char, string, long и т.п.)
Spectrum Attributes — одномерные массивы
Image Attributes — двумерные массивы States — состояния в котором находится наше устройство. Пример добавления атрибута gps_string:  Polling period время в мс, как часто будет обновляться значение gps_string. Если время обновления не задать, то атрибут будет обновляться только по запросу. Получилось:  Теперь нужно с генерировать код File->Generate  По умолчанию Makefile не генерируется, в 1-ый раз нужно поставить галочку что бы его создать. Это сделано для того что бы внесенные в него правки не удалялись при новой генерации. Создав его единожды и настроив под свой проект(прописать ключи компиляции, доп. файлы) можно забыть про него. Теперь переходим непосредственно к программированию. pogo с генерировал нам следующее:  Нас будут интересовать NEO6M.cpp & NEO6M.h. Рассмотрим для примера конструктор класса: Что здесь есть и что здесь главное? В функции init_device() происходит выделение памяти для наших атрибутов: gps_string & gps_array, но это не важно. Самое важное здесь, это комментарии: Все что находится внутри этого блока комментария при последующих перегенерациях кода в pogo не будет удаляться!. Все что в не блоках будет! Это те места где мы можем программировать и вносить свои правки. Теперь какие главные функции содержит класс NEO6M: Когда мы захотим прочитать значение атрибута gps_string, будут вызваны функции в следующем порядке: always_executed_hook, read_attr_hardware и read_gps_string. В read_gps_string произойдет заполнение gps_string значением. Заходим в папку с исходниками и: Программа скомпилируется в папку ~/DeviceServers.  В БД уже есть какие-то устройства, создадим теперь наше Edit->Create Server  Теперь попробуем подключиться к нему:  Ни чего не выйдет, сначала надо запустить нашу программу: Подключиться к com порту у меня можно только с правами root-а. v — уровень логирования. Для того что бы запустить несколько таких устройств, необходимо создать нужное количество Devices в Jive:
 Для каждого задать свои Properties. Адрес устройства и скорость подключения.
Теперь запускаем: У нас запуститься два устройства сразу. Теперь можем подключиться:  В графике смотреть на картинки конечно хорошо, но нужно что-то более полезное. Напишем клиент который будет подключаться к нашему устройству и забирать с него показания. Как компилировать: Результат: Получили результат в качестве возврата команды, взятия атрибутов строки и массива символов. Статью писал для себя, потому что спустя некоторое время начинаю забывать как и что делать. Спасибо за внимание. Инженер программист