LINUX.ORG.RU

Вышел драйвер для GDI-принтеров Canon

 , , , ,


0

3

Первая работоспособная (хотя и не очень) версия открытого драйвера для принтеров Canon CAPT (LBP-****) вышла сегодня. В отличие от проприетарного драйвера, открытый является легковесным, не требует запуска демонов при загрузке системы и не саботирует работу принтеров других производителей.

При установке драйвера обратите внимание на выбор правильного устройства из списка (не usb://, а обязательно capt://) и на правильность файла *.ppd (в нем определены низкоуровневые параметры принтера, и с неправильным *.ppd принтер будет, скорее всего, печатать полосы).

Изменения:

  • полностью переписан код драйвера (с C на C++)
  • теперь драйвер работает через libusb и является бакэндом для CUPS
  • автоопределение принтеров
  • в основном устранены зависания принтера при сбоях печати

Недоработки:

  • не проверяется наличие бумаги!
  • при печати более чем одной страницы может печататься только первая
  • при печати очень сложных страниц иногда переполняется память принтера, «хвост» страницы обрезается
  • неправильные верхние и нижние поля

На сегодняшний день поддержан и проверен LBP-2900 и, вероятно, будет работать очень похожий на него LBP-3000. Другие модели не проверялись, так как их нет у разработчика.

ПРОЕКТУ ДЛЯ РАЗВИТИЯ ТРЕБУЮТСЯ РАЗРАБОТЧИКИ!

Требования: знание C++, наличие одного из CAPT-принтеров.

>>> Скачать



Проверено: anonymous_incognito ()
Последнее исправление: anonymous_incognito (всего исправлений: 2)

Yammp, огромная благодарность тебе. Когда я и HighwayStar начали его ковырять, то и не подозревали, что кроме неизвестного алгоритма сжатия картинки там ещё столько проблем.

Artificial_Thought ★★★★
()
Ответ на: комментарий от Artificial_Thought

> Yammp, огромная благодарность тебе. Когда я и HighwayStar начали его ковырять, то и не подозревали, что кроме неизвестного алгоритма сжатия картинки там ещё столько проблем.

Спасибо тебе и HighawayStar за неоценимую помощь в реверсинге! Многие жизненно важные элементы протокола были найдены вами.

Кстати, скажи мне, как тебя в благодарности в исходниках вписать, как назвать.

Yampp
() автор топика
Ответ на: комментарий от Yampp

Автор - профессиональный программист и программированием зарабатывает. Поэтому писать что-то еще кроме работы, извините, ну совсем не тянет...

хех.. почему бы тогда просто не выкинуть принтер в помойку и не купить с нормальными дровами? Сейчас принтеры такого класса стоят копейки.

mashina ★★★★★
()
Ответ на: комментарий от Yampp

У меня есть LBP-810

1. могу тестировать и немножко отлаживать, но никогда отладкой USB-протоколов не занимался.
2. знаю С++
3. из маздая в виртуалбоксе (если пробросить USB) работает на ура, думаю, можно подсмотреть что-нибудь.
4. писать сюда: socketpair@gmail.com

anonymous
()
Ответ на: комментарий от mashina

У этого принтера очень легко перезаправлять картридж. Открычиваем несколько шурупов, вытаскиваем пробку и засыпаем тонер. У многих других принтеров этой ценовой категории всякие чипованные картриджи и прочее.

Artificial_Thought ★★★★
()
Ответ на: комментарий от Yampp

Неправда это. Ещё раз упомняну в качестве примера HP и hplip. Работают неторопливо, но практически весь функционал выполняют без всех ужасов упонмянутых тут в обсуждениях.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Про hplip в курсе, но я еще и габариты (место на столе) учитываю. Не экономил бы - давно бы нормальный принтер поставил. Цветной притом.

Yampp
() автор топика
Ответ на: комментарий от Yampp

Зарплата программиста 100т в месяц. В месяце 20 дней в дне 8 часов. Получается 625р в час. Нормальный postscript принтер с ethernet дыркой стоит 6т. Уверен, что на этот проект уже потрачено больше 10 человекочасов. Так в чем смысл?

Reset ★★★★★
()
Ответ на: комментарий от duott

> Драйвер должен поставлять производитель железа.

Ключевое слово «должен». А если он не поставляет, или поставляет глючное говно? :)

cruxish ★★★★
()

Молодцы, классный проект. Интересен ещё и как пособие, по написанию драйверов ко всяким гадостям ).

Aman
()
Ответ на: комментарий от Reset

Так в чем смысл?

Умножьте полученные Вами цифры ещё на количество таких принтеров на планете, подключённых к рабочим станциям с ОС семейства GNU/Linux на борту, и рабочим станциям, испольщующим прочие ОС, совместимые с драйвером.
Далеко не всё человек делает в угоду лишь себе. Иногда получается так, что, делая что-то бескорыстно, при том даже преследуя корыстную цель «получить удовлетворение от того, что сделал что-то для кого-то», всё-таки остается реальная польза для этого «кого-то».

Regards

mcdebugger ★★
()
Ответ на: комментарий от Reset

> Картридж стоит 2т и в домашних условиях работает год.

В общем, считайте это подарком от программистов всем пользователям, сдуру купившим такой принтер. Я, скорее всего, действительно бы его выкинул, если бы не узнал, СКОЛЬКО их по домам стоит. Понятно, что популяризации линукса это не способствует.

Yampp
() автор топика

Хочу быть разработчиком, си++ знаю неполностью, но быстро научусь.

xerox phaser 3140.

uju ★★
()

Достойно, уважаю.

теперь драйвер работает через libusb и является бакэндом для CUPS

верный подход.

# полностью переписан код драйвера (с C на C++)

зря, это конечно, не конец, но изрядно затормозит развитие.

Требования: знание C++, наличие одного из CAPT-принтеров.

А в этой части есть предложение вынести логику драйвера на более высокий уровень. Подключить интерпретатор луа, чтобы все эти сиюминутные вещи к конкретным принтерам писать на ем.

AVL2 ★★★★★
()
Ответ на: комментарий от AVL2

> зря, это конечно, не конец, но изрядно затормозит развитие.

В этом случае - ускорит. Причина очень простая: мы очень плохо знаем настоящее устройство протокола принтера, поэтому после очередных открытий приходится полностью менять логику работы драйвера. На Си это трудно, а на C++ делается за пару минут.

А в этой части есть предложение вынести логику драйвера на более высокий уровень.

Сиюминутные вещи к конкретным принтерам находятся в PPD. Единственная принтерозависимая часть в C++ - это алгоритм сжатия. Их там два: SCoA и HiSCoA, и переключаются они из PPD одной циферкой. HiSCoA отлажен, а вместо SCoA стоит тривиальная затычка, ибо негде тестировать. Все остальное у всех принтеров по идее одинаково.

Неподдержка каких-то отдельных принтеров идет от непонимания протокола обмена: там много флажков неизвестного назначения. Эта часть однозначно одинакова для всех принтеров, но некоторые ситуации на некоторых принтерах не встречаются и потому автору неизвестны.

Yampp
() автор топика

полностью переписан код драйвера (с C на C++)

ололо.

scaldov ★★
()
Ответ на: комментарий от scaldov

> А программисты живут не только в Москве!

У нормальных программистов по всей стране зарплата одинаковая. А остальным в отрасли делать нечего. Особенно тем, кто на C++ пишет как на Java, с кучей new и virtual.

Yampp
() автор топика
Ответ на: комментарий от AptGet

И не хомячковый C++. Поэффективнее Си будет и по скорости, и по объему бинарника. На C++ писать тоже уметь надо.

Yampp
() автор топика
Ответ на: комментарий от AptGet

Особенно тем, кто на C++ пишет как на Java, с кучей new и virtual.

Сдаётся мне, на С++ так писать начали лет за 10 до явы...

Ximen ★★★★
()
Ответ на: комментарий от Yampp

Про hplip в курсе, но я еще и габариты (место на столе) учитываю. Не экономил бы - давно бы нормальный принтер поставил. Цветной притом.

Смотрю на габариты 2900 и одной из дешёвых HP моделей аналогичной категории - P1102. Размеры сапога 369 x 250 x 216, типового HP 349 x 196 x 238, т.е. разницы в габаритах практически нет.

mashina ★★★★★
()

О БОЖЕ! это щастье!!

(даже если недоконца не работает, то хоть чтото!)

еслибы у меня [голодранца] былибы деньги — ябы заданейтил разработчикам!

[а еслибы умел программировать — помогбы написанием дополнительного говнокода :-D]

[[а возможно еслибы я умел программировать — то работалбы в хорошей фирме на хорошей зарплате, и опятьтаки заданейтилбы!]]

user_id_68054 ★★★★★
()
Ответ на: комментарий от Yampp

> Посмотрите на код - там нету ни new, ни dynamic_cast

сегодня во сне мне приснилось чтото связанное с dynamic_cast ... возможно во время сна я проник через (глобальный-эфир/libastral) — в эту новость x_X

user_id_68054 ★★★★★
()

Здорово! Желаю дальнейших успехов.

ttnl ★★★★★
()

LBP-2900B (i-sensys). Проприетарные драйвера устанавливаются отлично. Принтер добавляется, виден его статус и параметры... но не печатает. А это прямо надежду дало. Буду сейчас проверять

GblGbl ★★★★★
()

Отличная новость!

пока правда проверил на openSUSE 11.4 с cups 1,4 — не завелся, при печати тестовой страницы принтер не подает признаков жизни, думаю что проблема где-то в cups

как можно попробовать напечатать страницу в обход купса?

HighwayStar ★★★★★
()
Ответ на: комментарий от unanonymous

> а та перестанет работать через пол года

1). Полгода

2). Не у всех Убунта

3). stable API nonsence в случае с Canonни при чём.

ZenitharChampion ★★★★★
()
Ответ на: комментарий от eReSik

> Вот бы LBP 3100 заработал :)

А попробуйте его с PPD-шкой от 2900, предварительно выкрутив в CUPS дебаг на максимум. А еще лучше, если и в Makefile включите опцию отладки. Пучатайте не более одной страницы и обязательно вставьте бумагу заранее. Если все нормально заработает, принтер объявляем поддержанным и включаем PPD в релиз, если нет - пришлите мне лог ошибок. Адреса в исходниках. По идее, это такой же HiSCoA 600 dpi 1 bpp, как и 2900, должен работать, но мало ли...

Yampp
() автор топика

Когда уже CUPS или HPLib при отсутствии бумаги в принтере начнет показывать окошечко:

В принтере кончилась бумага. Для продолжения печати вставьте бумагу.
[Отменить] [Продолжить печать]

?

pat_minus
()
Ответ на: комментарий от HighwayStar

с дебагом в cups в errors_log выводится такое

D [10/Apr/2011:22:31:35 +0900] [Job 11] STATE: +connecting-to-device
D [10/Apr/2011:22:31:35 +0900] Discarding unused printer-state-changed event...
D [10/Apr/2011:22:31:35 +0900] PID 12892 (/usr/lib/cups/filter/pstops) exited with no errors.
D [10/Apr/2011:22:31:35 +0900] [Job 11] Printer using device file "/dev/usblp0"...
D [10/Apr/2011:22:31:35 +0900] [Job 11] STATE: -connecting-to-device
D [10/Apr/2011:22:31:35 +0900] [Job 11] backendRunLoop(print_fd=0, device_fd=5, snmp_fd=-1, addr=(nil), use_bc=0, side_cb=0x7fe70377b810)
D [10/Apr/2011:22:31:35 +0900] Discarding unused printer-state-changed event...
I [10/Apr/2011:22:31:35 +0900] [Job 11] Starting GPL Ghostscript 9.00...
D [10/Apr/2011:22:31:35 +0900] Discarding unused job-progress event...
D [10/Apr/2011:22:31:35 +0900] Discarding unused printer-state-changed event...
D [10/Apr/2011:22:31:35 +0900] [Job 11] Running /usr/bin/gs -dQUIET -dPARANOIDSAFER -dNOPAUSE -dBATCH -dNOMEDIAATTRS -sDEVICE=cups -sstdout=%stderr -sOUTPUTFILE=%stdout -c  -f -_
I [10/Apr/2011:22:31:35 +0900] [Job 11] Start rendering...
I [10/Apr/2011:22:31:35 +0900] [Job 11] Processing page 1...
D [10/Apr/2011:22:31:35 +0900] Discarding unused job-progress event...
D [10/Apr/2011:22:31:35 +0900] Discarding unused printer-state-changed event...
D [10/Apr/2011:22:31:35 +0900] [Job 11] Read 1800 bytes of print data...
I [10/Apr/2011:22:32:06 +0900] Saving job cache file "/var/cache/cups/job.cache"...
D [10/Apr/2011:22:32:06 +0900] cupsdSetBusyState: Printing jobs
D [10/Apr/2011:22:32:06 +0900] Report: clients=0
D [10/Apr/2011:22:32:06 +0900] Report: jobs=2
D [10/Apr/2011:22:32:06 +0900] Report: jobs-active=1
D [10/Apr/2011:22:32:06 +0900] Report: printers=1
D [10/Apr/2011:22:32:06 +0900] Report: printers-implicit=0
D [10/Apr/2011:22:32:06 +0900] Report: stringpool-string-count=311
D [10/Apr/2011:22:32:06 +0900] Report: stringpool-alloc-bytes=7128
D [10/Apr/2011:22:32:06 +0900] Report: stringpool-total-bytes=7008
HighwayStar ★★★★★
()
Ответ на: комментарий от HighwayStar

> не завелся, при печати тестовой страницы принтер не подает признаков жизни

Драйвер несовместим с usblp, если что. Порт не занят ли?

как можно попробовать напечатать страницу в обход купса?

Сначала надо сделать raster-файл ОБЯЗАТЕЛЬНО! с правильным ppd. Это можно сделать через cupsfilter:

$ cupsfilter -m application/ -p принтер.ppd файл > файл.raster

Полученный файл зависим от устройства, в нем, помимо картинки, лежат и параметры сжатия и опции протокола, взятые из PPD.

Определяем URI нужного принтера:

# /usr/lib/cups/backend/capt

Пробуем печатать:

# export DEVICE_URI=cups://usb/чегототам # /usr/lib/cups/backend/capt 1 1 1 1 1 < файл.raster

Для печати должно быть 5 или 6 параметров. Все, кроме argv[4] и argv[6], игнорируются. argv[4] - это число копий (игнорируется, если параметров 5), argv[6] - имя файла (если не указан, то stdin). Имя принтера берется из argv[0] (при запуске из CUPS) или из переменной окружения DEVICE_URI.

Yampp
() автор топика
Ответ на: комментарий от HighwayStar

> Printer using device file «/dev/usblp0»

Вот где собака зарыта. Надо rmmod usblp, после чего указать другой URI принтера (не usb://, а обязательно capt:// ).

Yampp
() автор топика
Ответ на: комментарий от Yampp

То есть, просто не тот драйвер работал. Вместо /usr/lib/cups/backend/capt запускался /usr/lib/cups/backend/usb. Потом при случае надо будет написать детектор и для таких устройств, но там программирования много, а профит невелик.

Yampp
() автор топика
Ответ на: комментарий от Ximen

> Сдаётся мне, на С++ так писать начали лет за 10 до явы...

Да. Но с тех пор для C++ был выработан более эффективный стиль программирования, а для Java - не был. Впрочем, этот более эффективный стиль редко выходит за пределы серьезного высокопроизводительного кода и качественно написанных библиотек вроде gtkmm. Во всех остальных случаях (и в энтерпрайзе в том числе) код написан по-хомячьи, смотреть страшно. Отсюда и нелюбовь анонимусов к C++: хомячий код они видели, а нормальный - никогда.

Yampp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.