Дисплей покупателя fp73p073 настройка
Тирика-Магазин
Установка драйвера дисплея покупателя
Драйвер торгового оборудования АТОЛ поддерживает широкий спектр моделей дисплеев покупателя. Если выбранной вами модели в списке ниже нет, пожалуйста, обратитесь с вопросом о поддержке выбранной вами модели в фирму АТОЛ: возможно, новая версия драйвера, кот. уже выйдет к моменту прочтения вами этой статьи, уже будет поддерживать ваш дисплей покупателя. На момент написания этой статьи драйвер АТОЛ поддерживал следующие модели дисплеев:
- Datecs DPD-201
- Меркурий ДП-01
- Меркурий ДП-02
- Меркурий ДП-03
- NCR 597X
- Дисплеи покупателя с протоколом EPSON (Firich, POSIFLEX, NCR 7446, Jarltech, Birch DSP-800F, PartnerTech CD7220, CipherLab VFD-220FC, ICD-2002F и другие)
- Дисплеи покупателя с протоколом EPSON USA (POSIFLEX-PD302C и другие)
- Flytech
- GIGATEK DSP800/850
- Штрих-FrontMaster
- GIGATEK DSP820
- TEC LIUST51
- IPC
- OMRON DP75-21
На тестирование нам достался дисплей покупателя Posiflex PD-2800/320, внешне очень похожий на представленный на картинке в начале этой статьи. Для подключения к компьютеру этот дисплей покупателя оснащен сдвоенным USB-кабелем, который подключается, соответственно, к двум USB-разьемам компьютера. Для того, чтобы заставить его работать с программой Тирика-Магазин, мы:
2. Скачали дополнительно драйвер виртуального COM-порта производства фирмы Posiflex - производителя дисплея. Для этого мы зашли на сайт www.posiflex.com, в "меню" в верхней части сайта выбрали пункт Support и потом Download, напечатали в строке поиска фразу virtual com и скачали программу Posiflex USB Virtual Com Port Driver for WinXP-Win7-Win8 32Bit64Bit_v5.19a
3. Сделали папку "Виртуальный драйвер COM-порта" на жестком диске компьютера и разархивировали туда содержимое скачанного на шаге 2 архива с файлами драйвера виртуального COM-порта
4. Подключили дисплей покупателя к компьютеру, потом открыли на рабочем столе иконку Мой Компьютер, шелкнули правой кнопкой мыши в пункт Этот компьютер, в появившемся меню выбрали пункт Управление и дальше Диспетчер Устройств, нашли надпись "Неизвестное устройство" (оно было помечено ярким желтым значком) и после щелчка правой кнопкой мыши выбрали пункт Установить/Обновить Драйвер:
5. В открывшемся окне нужно выбрать пункт Поиск и установка драйвера вручную и на следующем экране указать путь к папке, в которую мы разархивировали файлы драйвера виртуального COM-порта (см. 3 выше)
Появился дисплей покупателя. Интересно стало попробовать его использовать в качестве информационного табло для вывода информации о текущем дне, времени до конца рабочего дня/недели, информации о погоде, курсе валют.
При этом не хотел использовать ресурсоёмкие приложения и свой ПК. Остановился на связке мини-ПК Raspberry + Linux + Дисплей покупателя.
Что использовал?
- Одноплатный компьютер Raspberry Pi 2 Model B v1.1 с установленной ОС Raspbian GNU/Linux 9.4 (stretch).
- Дисплей покупателя POSUA LPOS-VFD USB.
- Командный интерпретатор bash.
Файл parse.sh
Комментарии
Команда wget позволяет скачивать из сети файлы, страницы и т.д. Опция -q — выводит минимум информации, -O — сохраняет в указанный файл.
В строках ниже производится запись в файл:
Причем, если используется перенаправление потока вывода в файл > , то содержимое файла перезаписывается, а использование >> дозаписывает данные в файл.
Пример использования параметра в функции:
Непосредственно в функции:
Где — параметр. Передаётся число 6.
Обратите внимание на сложную функцию замены подстроки, например:
В строке остаются только символ "." и все цифры от 0 до 9.
Послесловие
В языке bash доступны практически все возможности "обычных" языков программирования. А некоторые команды, по сравнению с аналогами в 1С, удивляют своей лаконичностью и функциональностью.
На данный момент дисплей покупателя в качестве информационного табло стабильно работает больше полугода.
Как и многие я любитель слушать музыку с различных интернет радиостанций. И давным-давно задумал себе сделать wifi-радио. Сначала его заменяли смартфоны, планшеты, но хотелось чего-то стационарного, оригинального, своего. Плюс хотелось чего-то лампового и с linux. Такого в продаже, конечно же, нет. Тогда и пришла идея запилить такое радио самому.
Ремарка. Хочется сразу отметить, что эта серия статей невероятный долгострой. По ряду причин никак не могла выйти в свет в течение двух лет. Поэтому не пугайтесь дат. К счастью я нашёл в себе силы, энергию и энтузиазм таки её выложить. И искренне надеюсь, что это будет не последняя часть.
Дисплей покупателя
Долго рыская по интернетам, и читая различную документацию, я таки определился, чего же на самом деле хочу. Мой выбор пал на дисплеи компании «Posiflex.». Лично я остановился на двух моделях: PD-2600 и PD-2800. Воспользуюсь случаем и принесу слова благодарности компании «АТОЛ» за данные модели. Главное их отличие между собой в способе подключения к компьютеру и блоке питания. Для работы первого дисплея требуется внешний блок питания, и подключается он через СОМ-порт компьютера. Второй же дисплей подключается по USB и от него же берёт питание. В остальном отличие у них заканчивается. Не смотря на USB-интерфейс – этот дисплей не отличается по принципу работы от PD-2600. USB-интерфейс данного дисплея – это просто обёртка виртуального СОМ-порта и питания.
Следует отметить, что цвет свечения у данных дисплеев разный. У меня один был зелёный, другой голубой. Как оказалось, что цвет дисплея определяется только светофильтром из оргстекла. В нормальном виде (без светофильтра) он светит почти белым (с зеленоватым отливом).
Слева кусок оранжевого оргстекла, посередине естественный цвет экрана, справа родной синий светофильтр.
Дисплеи появились у меня под Новый Год (с 2013 на 2014), по этому я не преминул воспользоваться возможностью и вывести поздравление на них :)
Разница внешнего вида дисплеев PD-2600 и PD-2800. Надпись – это дань традиции, зарождённой во время чтения и работы в журнале “Хакер”. Прошу простить :)
Разумеется, всё это было мерзким читерством для пробы дисплеев я ничего не особенного не делал. А просто воспользовался готовой операционной системой для касс на базе Линукс, запущенную на виртуальной машине:
Операционка на виртуалке
Но, выводить надписи через сторонние приложения, было скучно и я начал разбираться, как же с ним можно дружить.
Как же работать с этим зверьком?
Когда готовишь статью, то эпизодически рыскаешь в поисках лучшего описания своей задачи. И на хабре наткнулся на статью, где кратенько рассказывается о том, как автор загружал свои шрифты на дисплей. Однако, совершенно не говорится ни о модели, ни о том, что же эти команды на самом деле делают. Поэтому я постараюсь описать человеческим языком, что и почему мы делаем, но данный пост не является кратким пересказом мануалов (RTFM!). Так же отмечу, что тема столь обширная, дабы не разжёвывать каждый шаг, будет формат матана: «очевидно, что. ».
Даю сразу ссылку на документацию: ДОКУМЕНТАЦИЯ Обращаю внимание, что документацию я искал долго и упорно, нашёл на каком-то американском сайте Posiflex. Сейчас она есть на сайте «АТОЛ» (Российского представительства компании Posiflex). Документация от других дисплеев, увы, не подойдёт или подойдёт, но не во всех вопросах (Не все йогурты одинаково полезны). Ниже объясню почему.
Итак, перейдём к вкусняшкам. После включения любого из дисплеев, он нас будет приветствовать таким образом:
Задаём режим работы дисплея
Обращаю внимание, что существует множество режимов работы. Мы будем использовать систему команд, совместимую с дисплеями Epson. В документации это раздел EPSON EMULATION MODE. «Дитям мороженое, бабе цветы. Смотри не перепутай»(с)
В данном режиме дисплей управляется ESC-последовательностями почти как vt52-терминал (однако совместимость не полная).
Чтобы упростить понимание, что же мы делаем и зачем, я напомню, что это весьма детально описывал в своей статье «Создание собственных драйверов под Linux». Там есть спойлер FAQ (найдите через поиск), и там красиво в картинках показано что и как работает, и для чего какие команды. Чтобы было понятно в той статье «\033» эквивалентно записи «\x1B» в данной статье (одна в восьмеричной системе, вторая в шестнадцатеричной)
Давайте поиграемся с дисплеем из командной строки. Не будем подключать большого программирования. Для сегодняшней статьи этого будет с головой. Будем считать, что дисплей PD-2600 у нас подключён через USB-переходник и видится системой как /dev/ttyUSB0. То же самое будет работать с дисплеем PD-2800, только он будет у нас определяться как /dev/ttyACM0.
Для начала выставим скорость работы. По умолчанию скорость работы СОМ-порта (на обоих дисплеях) 9600. Эта скорость также задаётся переключателями.
И уже после этой «весьма сложной команды» мы можем протестировать.
Суровый аппаратный привет миру.
Всё, на этом повествование можно заканчивать. Привет мир удался. Но на самом деле не всё так просто. Данный дисплей поддерживает Великий и Могучий русский язык. Но делает это весьма своеобразно. Для работы с русским языком, согласно документации требуется выбрать кодовую таблицу. Если этого не сделать, то при выводе будет вот такая петрушка.
Чтобы включить кодовую страницу с русской кириллицей следует отдать следующую команду:
После чего пробуем вывести снова наш текст
И-и-и-и, вновь нас ждёт облом…
Так в чём же дело? Проблема оказалось простой, но мне потребовалось два дня, чтобы до этого дотукать. Всё элементарно — проблема кодировок. Хвала камраду goodic за то, что мне подсказал верную кодировку. В результате получаем многострадальную команду, которая нам таки перекодирует наш текст в русский и выведет на экран.
На самом деле я опустил деталь, что каждый раз я отсоединял питание дисплея, заново инициализировал СОМ-порт и давал эти команды. Но существует ещё множество вкусных команд. Таких как: сдвиг курсора, очистка экрана, помещение курсора домой и т.п. Часть команд совместимо с vt52. Если привести весь список команд из документации, то он будет выглядеть вот так:
Теперь, по науке, чтобы вывести «Привет хабру», надо сделать следующее. На английском подписи соответствует названию команды в таблице выше, для удобства.
Как мы видим, команды позволяют делать различные очень вкусные вещи. Например, можно с помощью команд включать и выключать запятую (точку) на экране. Например.
У неё есть отдельное место. Но я ни разу не видел, чтобы кто-то пользовался этой возможностью. Как правило, все просто используют под точку отдельное знакоместо. Так же есть символ подчёркивания. В общем, дисплей разве что щи не варит. Демонстрировать все возможности дисплея в фотографиях я не буду, тем более что задача эта не благодарная. В посте про драйвера, этот громадный спойлер прочитало лишь несколько человек.
Для меня самое главное в данных дисплеях, это загрузка пользовательских шрифтов. О них и поговорим ниже.
Подключаем тяжёлую артиллерию. Пользовательские шрифты.
Самое крутое в данных дисплеях — это поддержка пользовательских шрифтов. Однако, могу разочаровать, что дальнейшее описание подходит только к PD-2600 и PD-2800 моделям дисплея. Даже в рамках одной фирмы отличается синтаксис команд загрузки шрифтов. И лично поимел немало граблей, используя документацию на ранние версии дисплеев данной фирмы. К сожалению, не понимаю, почему в таком простом месте каждый изобретает велосипед, а не примут какой-то единый стандарт, даже хотя бы в рамках одного предприятия.
Проблема поиска документации разработчика на данные дисплеи стояла очень остро. Общей информации очень много, но вот документации разработчика найти было очень сложно (2013-2014 год). Кратко опишу свой тернистый путь, быть может, кто-то по нему пройдёт.
Изначально, документация, программиста, которую удалось найти — это была документация на дисплей PD2100/2200. Особенность загрузки символа заключается в том, что в символе множество точек, и выглядит карта символов следующим образом:
Карта символов
Согласно документации загрузка символа осуществляется командой: ~ (режим Epson и далее говорим только о нём). Где ad — это номер загружаемого символа, а x1 — x5 это пять байт карты символов, согласно таблице:
Таблица точек в байте, для дисплея PD2100/2200
Опытным путём было установлено, что загрузка символов идёт (хоть на том спасибо), но данная таблица не соответствует дисплею PD-2600! Разработчики, обратите внимание, что дисплеи НЕ ВЗАИМОЗАМЕНЯЕМЫ с точки зрения команд! С большим трудом удалось найти документацию разработчика на дисплей PD-2600. Там таблица точек выглядит следующим образом:
Таблица точек в байте, для дисплея PD2600/2800
Перекодирование символа превращается в тот ещё ребус, но вполне решаемый.
Так же, оказалось, что можно загрузить только два пользовательских символа, если загружать больше, то предыдущие символы сбрасываются в значение по умолчанию! Единственное, что символ, выведенный на экран уже не меняет своих очертаний, так что можно выводить символы и перезагружать его новым значением (что весьма неудобно).
Перестаём ныть, и давайте рассмотрим пример вывода символа вертикальной черты. Нарисуем его и переведём согласно таблице.
Перекодировка символа
Получаем такую картину:
Посылка в СОМ-порт будет выглядеть следующим образом (данные в hex):
1B 25 01 разрешаем использование пользовательского символа (Set/cancel user-defined characters). 01 – символ 1.
1B 26 A0 10 42 08 21 04 загрузка пользовательского символа по адресу A0 (Define user defined characters), последние пять байт — битовая маска символа.
A0 — печатаем символ
Таким образом в консоли всё будет выглядеть следующим образом.
Для начала проинициализируем дисплей
Первое, это надо дать команду, разрешающую пользовательские шрифты
Далее загрузим символ вертикальной черты, следующей командой
Символ загружен на позицию A0, выведем его:
В результате получим:
Отрисованный символ
Можно даже завалить экран “забором”, для наглядности
Забор
Вообще с перезагрузкой символов можно делать весьма крутые штуки. Например, бегущую палочку, которая является перезагрузкой из пяти различных символов.
Для чего это всё нужно, поведаю в других статьях.
Заключение к первой части
Один из этапов прототипа.
В следующих статьях мы рассмотрим программирование данного дисплея на тёплом ламповом си, работа с маршрутизатором, mpd и многие другие вкусности.
Есть у меня знакомый, который занимается ремонтом автомобильного железа. Он как-то принес мне микроконтроллер, выпаянный из блока управления автономного отопителя. Сказал, что его программатор это не берет, а ему хотелось бы иметь возможность переливать прошивки туда-сюда, т.к. блоков много, в железе они часто одинаковые, а вот агрегаты, которыми они управляют отличаются. И вроде и блок есть взамен неисправного, но ПО разное и заменить просто так нельзя. Так как задачка была интересной, решил покопаться. Если тема интересна и вам, прошу под кат.
Подопытным оказался M306N5FCTFP. Это микроконтроллер группы M16C/6N5. Ядро M16C/60 разработано Mitsubishi, а т.к. преемником этой компании по части МК с 2003 года является Renesas, то сейчас эти микроконтроллеры известны именно под этим брендом.
Немного о самом микроконтроллере
Камешек представляет собой 16-разрядный микроконтроллер в 100-выводном QFP корпусе. Ядро имеет 1 МБайт адресного пространства, тактовая частота 20МГц для автомобильного исполнения. Набор периферии так же весьма обширный: два 16-разрядных таймера и возможность генерации 3-фазного ШИМ для управления моторами, всякие UART, SPI, I2C естественно, 2 канала DMA, имеется встроенный CAN2.0B контроллер, а также PLL. На мой взгляд очень неплохо для старичка. Вот обзорная схемка из документации:
Так как моя задача выдрать ПО, то так же весьма интересует память. Данный МК выпускался в двух вариантах: масочном и Flash. Ко мне попал, как выше уже упоминалось, M306N5FCTFP. Про него в описании сказано следующее:
- Flash memory version
- 128 KBytes + 4K (дополнительные 4K — так называемый блок А в подарок пользователю для хранения данных, но может хранить и программу)
- V-ver. (автомобильное исполнение с диапазоном +125°C)
Как вытащить из устройства то, что разработчики втащили
Вполне естественно, что начинать попытки достать что-то из микроконтроллера нужно с изучения механизмов, которые встроены разработчиком чипа для задач программирования памяти. В мануале указано, что производитель любезно разместил в памяти загрузчик, для нужд внутрисхемного программирования устройства.
Как видно из картинки выше, память разбита на 2 части: пользовательская область, и область загрузчика. Во второй как раз с завода залит загрузчик по умолчанию, который умеет писать, читать, стирать пользовательскую память и общается через асинхронный, синхронный, либо CAN-интерфейс. Указано, что он может быть переписан на свой, а может быть и не переписан. В конце концов это легко проверяется попыткой постучаться к стандартному загрузчику хотя-бы через UART… Забегая вперед: производитель отопителя не стал заморачиваться своим загрузчиком, поэтом копать дальше можно в этом направлении. Сразу оговорюсь, что есть еще способ параллельного программирования, но т.к. программатора для этого у меня не было, я не рассматривал этот вариант.
О защите от считывания
Все бы было совсем просто, если бы в загрузчике не была предусмотрена защита от несанкционированного доступа. Я просто приведу очень вольный перевод из мануала.
Функция проверки идентификатора
Используется в последовательном и CAN режимах обмена. Идентификатор, переданный программатором, сравнивается с идентификатором, записанным во flash памяти. Если идентификаторы не совпадают, команды, отправляемые программатором, не принимаются. Однако, если 4 байта вектора сброса равны FFFFFFFFh, идентификаторы не сравниваются, позволяя всем командам выполняться. Идентификатор — это 7 байт, сохраненных последовательно, начиная с первого байта, по адресам 0FFFDFh, 0FFFE3h, 0FFFEBh, 0FFFEFh, 0FFFF3h, 0FFFF7h, и 0FFFFBh.
Таким образом, чтобы получить доступ к программе, нужно знать заветные 7 байт. Опять же, забегая вперед, я подключился к МК, используя тот же «M16C Flash Starter» и убедился, что комбинации из нулей и FF не проходят и этот вопрос придется как то решать. Здесь сразу же всплыла мысль с атакой по сторонним каналам. Уже начал прикидывать в голове платку, позволяющую измерять ток в цепи питания, но решил, что интернет большой и большинство велосипедов уже изобретено. Вбив несколько поисковых запросов, довольно быстро нашел на hackaday.io проект Serge 'q3k' Bazanski, с названием «Reverse engineering Toshiba R100 BIOS». И в рамках этого проекта автор решал по сути точно такую же задачу: добыча встроенного ПО из МК M306K9FCLR. Более того — на тот момент задача им была уже успешно решена. С одной стороны я немного расстроился — интересная загадка разгадана не мной. С другой — задача превратилась из поиска уязвимости, в ее эксплуатацию, что обещало гораздо более скорое решение.
В двух словах, q3k точно по такой же логике начал изучение с анализа потребляемого тока, в этом плане он был в гораздо более выгодных условиях, т.к. у него был ChipWhisperer, этой штукой я до сих пор не обзавелся. Но т.к. его первый зонд для снятия тока потребления оказался неподходящим и вычленить из шумов что-то полезное у него не получилось, он решил попробовать простенькую атаку на время отклика. Дело в том, что загрузчик во время выполнения команды дергает вывод BUSY, чтобы проинформировать хост о том, занят он, или готов выполнять следующую команду. Вот, по предположению q3k, замер времени от передачи последнего бита идентификатора до снятия флага занятости мог послужить источником информации при переборе. При проверке этого предположения перебором первого байта ключа действительно было обнаружено отклонение по времени только в одном случае — когда первый байт был равен FFh. Для удобства измерения времени автор даже замедлил МК, отключив кварцевый резонатор и подав на тактовый вход меандр 666кГц, для упрощения процедуры измерений. После чего идентификатор был успешно подобран и ПО было извлечено.
Первый блин — граблями
Ха! Подумал я… Сейчас я быстренько наклепаю программку к имевшейся у меня STM32VLDiscovery c STM32F100 на борту, которая будет отправлять код и измерять время отклика, а в терминал выплевывать результаты измерений. Т.к. макетная плата с целевым контроллером до этого подключалась к ПК через переходник USB-UART, то, дабы ничего не менять на макетке, работать будем в асинхронном режиме.
Когда при старте загрузчика вход CLK1 притянут к земле, он понимает, что от него хотят асинхронного общения. Собственно потому я его и использовал — подтяжка была уже припаяна и я просто соединил проводами две платы: Discovery и макетку с целевым M306.
Заметка по согласованию уровней:
Т.к. M16 имеет TTL-уровни на выводах, а STM32 — LVTTL (упрощенно, в даташите подробнее), то необходимо согласование уровней. Т.к. это не устройство, которое, как известная батарейка, должно работать, работать и работать, а по сути подключается разок на столе, то с трансляторами уровней я не заморачивался: выходные уровни от STM32 пятивольтовый МК переварил, в смысле 3 вольта как «1» воспринимает, выходы от М16 подаем на 5V tolerant входы STM32 дабы ему не поплохело, а ногу, которая дергает RESET M16 не забываем перевести в режим выхода с открытым стоком. Я вот забыл, и это еще +2ч в копилку упущенного времени.
Этого минимума достаточно, чтобы железки друг друга поняли.
Логика атакующего ПО следующая:
- Устанавливаем соединение с контроллером. Для этого необходимо дождаться, пока завершится сброс, затем передать 16 нулевых символов с интервалом более, чем 20 мс. Это для того, чтобы отработал алгоритм автоопределения скорости обмена, т.к. интерфейс асинхронный, а МК о своей частоте ничего не знает. Стартовая скорость передатчика должна быть 9600 бод, именно на эту скорость рассчитывает загрузчик. После этого при желании можно запросить другую скорость обмена из пяти доступных в диапазоне 9600-115200 (правда в моем случае на 115200 загрузчик работать отказался). Мне скорость менять не нужно, поэтому я для контроля синхронизации просто запрашивал версию загрузчика. Передаем FBh, загрузчик отвечает строкой вроде «VER.1.01».
- Отправляем команду «unlock», которая содержит текущую итерацию ключа, и замеряем время до снятия флага занятости.
Команда состоит из кода F5h, трех байт адреса, где начинается область идентификатора (в моем случае, для ядра M16C, это 0FFFDFh), длина (07h), и сам идентификатор. - Измеряем время между передачей последнего бита идентификатора и снятием флага занятости.
- Увеличиваем перебираемый байт ключа (KEY1 на начальном этапе), возвращаемся к шагу 2 до тех пор, пока не переберем все 255 значений текущего байта.
- Сбрасываем статистику на терминал (ну или выполняем анализ «на борту»).
В итоге, для всех значений результаты были идентичны. Полностью идентичны. Тактовая частота таймера у меня была 24Мгц, соответственно разрешение по времени — 41,6 нс. Ну ок, попробовал замедлить целевой МК. Ничего не поменялось. Здесь в голове родился вопрос: что я делаю не так, как это делал q3k? После сравнения разница нашлась: он использует синхронный интерфейс обмена (SPI), а я асинхронный (UART). И где-то вот здесь я обратил внимание на тот момент, который упустил вначале. Даже на схемах подключения для синхронного и асинхронного режимов загрузчика вывод готовности назван по-разному:
В синхронном это «BUSY», в асинхронном это «Monitor». Смотрим в таблицу «Функции выводов в режиме Standart Serial I/O»:
«Семён Семёныч…»
Упущенная вначале мелочь завела не туда. Собственно, если в синхронном режиме это именно флаг занятости загрузчика, то в асинхронном (тот, который serial I/O mode 2) — просто «мигалка» для индикации работы. Возможно вообще аппаратный сигнал готовности приемопередатчика, оттого и удивительная точность его поднятия.
В общем перепаиваем резистор на выводе SCLK с земли на VCC, припаиваем туда провод, цепляем все это к SPI и начинаем сначала…
Успех!
В синхронном режиме все почти так же, только не требуется никакой предварительной процедуры установки соединения, упрощается синхронизация и захват времени можно выполнить точнее. Если бы сразу выбрал этот режим сохранил бы время… Я снова не стал усложнять и измерять время именно от последнего бита, а запускал таймер перед началом передачи последнего байта ключа, т.е. включаем таймер и отправляем в передатчик KEY7 (на скриншоте выше, из логического анализатора, видно расстояние между курсорами. Это и есть отсчитываемый отрезок времени).
Этого оказалось более чем достаточно для успешной идентификации. Вот так выглядит перебор одного байта:
По оси абсцисс у нас количество дискрет счетчика, по оси ординат, соответственно, передаваемое значение ключа. Отношение сигнал/шум такое, что даже никаких фильтров не требуется, прямо как в школе на уроке информатики: находим максимум в массиве и переходим в подбору следующего байта. Первые 6 байт подбираются легко и быстро, чуть сложнее с последним: там просто наглый перебор не проходит, нужен сброс «жертвы» перед каждой попыткой. В итоге на каждую попытку уходит что-то около 400 мс, и перебор идет в худшем случае в районе полутора минут. Но это в худшем. После каждой попытки запрашиваем статус и, как только угадали, останавливаемся. Я вначале вообще просто быстренько ручками перебрал идентификатор, вставляя в excel вывод консоли и строя график, тем более, что это была разовая задача, но уже для статьи решил дописать автоматический перебор, ради красивой консольки…
Конечно, если бы разработчик затер загрузчик (заменил своим), так просто выкрутиться не получилось бы, но в автомобильной электронике частенько МК вообще не закрыты. В частности в блоке управления с другого отопителя, в котором был установлен V850 того же Renesas все решилось подпайкой пары проводов и копированием прошивки штатной утилитой. Это в мире ЭБУ двигателем целые криптовойны. Видимо не нравится производителям явление чип-тюнинга и других видов вмешательства… Хотя это как гонка брони и снаряда — железки круче, дороже, но победителя нет…
Обычной причиной возникновения размытости являются потери в удлинительных кабелях.
Для минимизации потери сигнала используйте высококачественный удлинительный
кабель или кабель со встроенным усилителем.
Размытое изображение наблюдается только при разрешении, значение которого меньше
физического (максимального) разрешения?
”. Установите значение разрешения,
равное физическому разрешению монитора.
Наблюдаются дефекты элементов изображения.
Одна или несколько точек на экране постоянно отображаются черными или белыми, либо
постоянно имеют красный, зеленый, синий или другой цвет.
Включите и выключите питание.
Эти пикселы, которые либо постоянно светятся, либо не поджигаются, этот дефект
типичен для ЖК-технологии.
Искаженные цвета изображения.
Изображение имеет желтый, голубой или розовый оттенок.
На панели управления монитора нажмите кнопку “Enter” (“Ввод”) и переместите курсор к
значку “Recall” (Сброс настроек) с помощью кнопки
. Затем нажмите кнопку
“Enter” (“Ввод”), чтобы войти в подменю “Recall” (Сброс настроек). Нажимая кнопку
, выберите “Color Recall” (Сброс настроек цвета), выберите “Yes” (Да) в подменю “Color
Recall” (Сброс настроек цвета), затем нажмите кнопку “Enter” (“Ввод”), чтобы восстановить
заводские настройки цвета. Если цвета изображения, а также цвет экранного меню
искажены, вероятно, один из трех основных цветов отсутствует во входном сигнале.
Проверьте разъемы сигнального кабеля. Если какой-либо из выводов разъемов погнут или
поврежден, обратитесь за помощью к продавцу монитора.
На экране отсутствует изображение.
Индикатор монитора горит зеленым цветом?
Индикатор монитора горит оранжевым цветом?
Если индикатор горит оранжевым цветом, включен режим управления питанием. Нажмите
клавишу на клавиатуре компьютера или подвиньте мышь. Если это не даст результата,
Описание файлов-скриптов
Необходимые замечания
Установку и настройку ОС Linux на устройство Raspberry в данном материале не рассматриваю.
Для редактирования текста в среде Linux использовал редакторы nano и mcedit.
Для доступа к мини-ПК на базе ОС Linux из среды Windows пользовался клиентами для удаленного доступа по протоколу SSH — KiTTY/PuTTY.
Для передачи файлов между ОС Windows и Linux использовал программу WinSCP.
Bash — командный интерпретатор (командная оболочка).
Bash — аббревиатура от "Bourne-Again Shell" ("возрождённая" оболочка). Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из другого командного интерпретатора sh (сокращение от shell).
Bash — это ещё и мощный язык программирования.
Я занимаюсь сопровождением программных продуктов на базе 1С и для меня это было возможностью самому познакомится с программированием в среде Linux.
В меру своего понимания буду разъяснять выполняемые команды. Это сделано с целью большого охвата аудитории.
1 этап. Подключение и настройка дисплея покупателя
После того как присоединили к USB-порту дисплей покупателя (ДП) выясним параметры подключенного устройства. В терминале выполним команду:
Получим список присоединенных USB устройств к Raspberry:
Из информации полученной командой находим строку Product=POSua LPOS-II-VFD USB CDC. Это наш дисплей покупателя. В этой секции нам нужна строка Vendor=0000 ProdID=0131 Rev=01.00. А конкретно vendor=0000 prodID=0131. Так идентифицирует себя устройство.
Для корректной работы с ДП необходимо загрузить модуль работы с USB в ядро системы. Выполняем команду с повышенными правами:
modprobe — программа для добавления модулей в ядро Linux. usbserial — модуль ядра который обеспечивает эмуляцию COM-порта на USB устройствах. 0x – означает шестнадцатеричный формат.
Так как у меня подключено одно USB-устройство, то в системе Linux автоматически получает файл ttyUSB0. Такова важная особенность взаимодействия с устройствами в ОС Linux – работа с устройством как с файлом. Файлы устройств хранятся в каталоге /dev .
Для корректной работы с ДП установим скорость передачи данных:
stty — команда устанавливает параметры терминального ввода/вывода для устройства. -F — устройство. В нашем случае дисплей покупателя /dev/ttyUSB0 . И для данного устройства устанавливается скорость 9600 бод.
2 этап. Программирование
Для очистки экрана дисплея выполним команду:
echo — команда вывода в терминал. Опция -e — включает поддержку вывода escape-последовательностей, -n — указывает, что не надо выводить перевод строки. Допускается запись -en .
Сочетания символов, состоящих из обратной косой черты \ , за которой следует буква или набор цифр, называются escape-последовательностями.
0с — очистка экрана дисплея и отмена строчного режима, 0b — перемещает курсор в верхнюю крайнюю левую позицию. Символ > — управление потоком (перенаправляет вывод). В данном случае в файл /dev/ttyUSB0 нашего устройства. Если просто выполнить команду echo "Hello!" , то в окне терминала появится текст, указанный в кавычках.
Кстати, команду изменяющую скорость для передачи данных на устройство можно было записать и так:
| — перенаправляет вывод одной команды на вход другой (конвейер). В нашем случае последовательность символов "Привет!" не выводится в файл устройства сразу, а передаётся на "конвертирование" утилите iconv. iconv — преобразует из одной кодировки в другую.
Командный интерпретатор bash позволяет не только выполнять команды непосредственно в терминале, но и писать файлы-скрипты.
Где namefile.sh — файл скрипта. Расширение sh — означает, что это файл-скрипт bash. chmod – программа для изменения прав доступа к файлам и каталогам. u+x — устанавливает право на выполнение файла для текущего пользователя.
Решение задачи выполним двумя скриптами. Первый скрипт — основной (dispos.sh). Он выводит всю необходимую информацию на дисплей покупателя. Второй — вспомогательный (parse.sh) получает данные погоды, сервисов котировок валют и записывает данные в промежуточные файлы. Промежуточные файлы с данными используются в первом скрипте.
Для того, чтобы скрипты могли выполняться, необходимо выполнить команды:
Обратите внимание, что используется просто +x . Это "укороченная" версия u+x .
Скрипты нужно запускать с определённой периодичностью. Для этого воспользуемся стандартным планировщиком crontab. Для редактирования служит команда:
В планировщик добавим две строки:
Скрипт parse.sh выполняется каждые 20 минут, а скрипт dispos.sh каждую минуту.
Перед первоначальным выводом на дисплей покупателя прежде надо выполнить скрипт parse.sh который получит первичные данные о погоде и валюте.
Далее я приведу полные тексты скриптов с короткими комментариями.
Файл dispos.sh
Комментарии
Для вывода текущей даты служит команда date . Пример,
После выполнения получаем дату вида: 20.05.2019 12:11.
Для расчёта времени до конца дня воспользуемся дополнительной переменной TIME_OF_WORKDAY и установим значение TIME_OF_WORKDAY="18:00:00" . Ну а далее рассчитаем часы и минуты до конца рабочего дня:
date +%s — получаем текущую дату и время в секундах.
date +%s --date=$TIME_OF_WORKDAY — получаем время в секундах до TIME_OF_WORKDAY ("18:00:00") .
Расчет времени до конца рабочей недели:
Где DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` — время в секундах с текущего момента времени до пятницы 17:00:00.
Часть скрипта реализована с помощью функций. Например,
disp_clear() — название функции. В <> указываются выполняемые команды.
Переменная DEV_DISPLAY является "глобальной" и задаётся вначале скрипта и соответственно DEV_DISPLAY="/dev/ttyUSB0" .
Чтение данных из файла, например конкретной строки (1):
sed — это текстовый редактор, выполняющий операции редактирования над информацией в стандартном потоке ввода или файле. Параметр -n – выводит текущую выбранную строку. ‘1’ — печатает 1 строку и выходит не читая остальные ( p — печать, q — выход).
Ещё вариант чтения из файла (построчно):
А таким образом DISPLAY_LINE1=$ из строки LINE1 извлекаем подстроку длиной 14 символов начиная с 0.
Замена символов производится комбинацией // , например, так DOLLAR//–/- . Заменяется символ "–" на "-".
Читайте также: