29 января 2011 в 00:31

Просмотри видео на сканере штрихкодов


«Из всех искусств для нас важнейшими являются кино и цирк»
— В.И. Ленин


Просмотр видео — одно из любимых развлечений в современном мире, фильмы сейчас смотрят практически на всех устройствах, даже на холодильниках. К сожалению, рядом не оказалось подходящего холодильника, и я решил просмотреть фильм на сканере штрихкодов. Под рукой оказался сканер Cipher Lab 8001. Технические характеристики плеера сканера:
  • 16-битный CMOS процессор
  • 1 Мб памяти для программ
  • 1 Мб SRAM для данных
  • FSTN дисплей с LED подсветкой разрешением 100×64


1 Мб памяти должно было хватить для хранения ролика, но это бы лишило плеер интерактивности, и усложнило процесс разработки. Поэтому выводить на экран будем данные, которые поступают непосредственно с инфракрасного порта. Также для простоты не используются крайние 4 столбца экрана. Итоговое разрешение картинки 96×64 (количество точек в строке кратно размеру байта).

Прошивка сканера


В прошивке нет ничего сложного:
  1. Считываем данные с инфракрасного порта;
  2. выводим на экран;
  3. посылаем компьютеру запрос на следующий кадр.

Единственное, на что следует обратить внимание — размер входящего буфера ограничен 256 байтам. А так как размер целого кадра 96×64/8 = 768 байт, нам придется разбить кадр на 4 блока по 16 строчек. Да, данные влезли бы в 3 блока по 256 байт, но хотелось, чтобы номер блока передавался как первый байт входного буфера.

int PlaceFromCom(void) {
    long timer;
    int position;
    char c, picture[BLOCK_SIZE];
    unsigned char blockId, loaded;
    
    SendRequest();

    timer = sys_msec;
    loaded = 0;
    position = 0;
    while (sys_msec <= timer + TIMEOUT_MSEC) {
        if (read_com(COM_PORT_NUM, &c)){
            picture[position] = c;
            position++;
            if (position == BLOCK_SIZE){
                loaded = 1;
                break;
            }
        }
    }
    if (!loaded){
        printf("Comm error\r\n");
        return 1;
    }
    blockId = (picture[0] % 4);
    show_image (0, blockId * BLOCK_H, IMAGE_WIDTH, BLOCK_H, &(picture[1]));
    return 0;
}

Программа вывода


Программа для вывода видео в COM выглядит еще проще, чем прошивка:
  1. Делаем скриншот экрана;
  2. меняем его размер и конвертируем в двухцветное изображение;
  3. разбиваем на блоки и конвертируем в поток байтов;
  4. ждем запроса от сканера, возвращаем буфер.

По какой-то причине снятие скриншота в Питоне занимает очень много времени, поэтому в программе это действие вынесено в отдельный поток. Остальной код тривиален. Например, цикл вывода:
while True:
    data = ser.read(9999)
    if len(data) > 0:
        if data[0] == "V":
            ser.write(chr(currentBlock))
            ser.write(desktop.strings[currentBlock])
            currentBlock = (currentBlock + 1) % blockCount

Результат работы




Исходники программ можно скачать тут.
Денис Потапов @PatapSmile
карма
264,0
рейтинг 0,0
Обо всём и ни о чём
Самое читаемое Разработка

Комментарии (71)

  • +7
    круть
  • +63
    Автор знает толк)
    • 0
      Ага, гурман
  • +8
    С ума сойти
    • +1
      2 раза.
  • +20
    Музыка тоже через него играет? :-)
    • +22
      Это тема следующего топика. Частотный диапазон устройства 1—6 кГц, длительность ноты от 1/100 секунды.
      • +2
        Отлично, будем ждать :-)
      • 0
        Я подумал, что это невозможно, но смотреть видео на сканере штрих кодов тоже.
    • 0
      Не исключено что, в сканере есть спикер, но в ролике явно звук при обработке добавлен или воспроизводится параллельно с записью видео. Да и процессор не вовремя с обновлением кадров справляется, какой уж тут звук. :-)
  • –19
    Не мне одному показался ролик больно знакомым?
    • НЛО прилетело и опубликовало эту надпись здесь
    • –2
      Это клип Benny Benassi — Satisfaction, ваш самизнаетекто.
  • +3
    Обожемой. Satisfaction тут как нельзя кстати.
  • +1
    Это супер!
  • +3
    Отличный пятничный JFF-пост =)
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      • +19
        Прошу прощения
        • 0
          Nokia 3310 рулит =)
    • 0
      Для сименсов 45-й серии делали.
  • –2
    MaaadMan!!!
  • +4
    Один из немногих случаев, когда я смотрел видео «плохого» качества задержав дыхание.
  • +6
    У меня где-то завалялись исходники, исполняющие мелодию из «Бумера» на фискальном регистраторе, но ваш experience недостижим. Браво!
  • +27
    Женские журналы проигрывают видео, сканеры штрих-кодов…
    Расскажи это футурологам прошлого — в дурку посадят.
  • +3
    Фулл ЭйчДи прям ))
  • +1
    Маньяк))
  • 0
    Чем дальше в будущее, тем оно страшнее.
    А что вообще должно было делать это устройство, зачем в нем дисплей и клавиатура?
    • +7
      Это не совсем сканер штрихкодов, это — терминал сбора данных, используется в основном на складах. Он может хранить базу товаров, считать их количество, записывать приходы, расходы, а позже синхронизировать все с компьютером.
      • 0
        — Что ты сделал с моим сканером?
        — А ты пожалуйся начальству, что я заставил твой сканер клипы показывать, посмотрим, кому больше поверят.
  • НЛО прилетело и опубликовало эту надпись здесь
  • +6
    Офигеть до чего додуматься можно! Класс!

    В последнее время все больше появляется подобных нестандартных «изобретений». Можно пофантазировать о том, что могут придумать (если еще нет :-):

    Проецирование фильма на какую-нибудь плоскость (например, стену) с помощью фар автомобиля — что-то вроде мобильного кинотеатра;
    Или фонарик с таким же принципом;
    Или, например, видео на PHP — автоматически обновляемый скриптик, который отображает по порядку автоматически генерированные картинки.

    Много чего придумать можно :-)
    • 0
      Я думаю проецировать экран через фары не сложно. Надо всего лишь вместо стекла фары поставить ЖК-матрицу :) А так как фары две, то можно проецировать стерео-картинку.
  • +5
    Примерно как я смотрю аниме через libcaca. Через ssh. На воге.
  • –18
    Безусловно круто, но…



    • +11
      Вам безусловно стало легче, при публикации этой неновой картинки, значит свою функцию она выполнила.

      Просто поразмышляйте на досуге, что где-то существуют люди которые просто могут делать необычные вещи и им (затраты времени, денег, ума) это почти ничего не стоит, в отличии от.
      • –6
        Картинка не нова. И я не сомневаюсь, что её видели все кто только мог. Смысл заложенный в ней от этого не меняется.

        Автор поста, безусловно — талантище. Но столько трудов… искусство ради искусства.

        Наверное я слишком прагматичен чтобы оценить это.
        • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Но столько трудов… искусство ради искусства.
          Наверное я слишком прагматичен чтобы оценить это.

          А ради чего тогда, если не ради самого себя существует искусство?
        • 0
          Все, что делается не дари искусства, называется ремеслом.
  • –1
    Респект, что цитату привели целиком. А то ее обычно пафосно произносят, без последнего слова.
    P.S. Кино — безусловно великое искусство, но вырывание из контекста меняет смысл кординально.
    • +19
      Полностью она звучит так: "Пока народ безграмотен, из всех искусств для нас важнейшими являются кино и цирк". (Полное собрание сочинений. 5-е изд., Т. 44., с. 579)
      • 0
        Что-то мне кажется, что в массе своей народ всегда будет безграмотным, особенно в свете последних тенденции…
        Простите, понесло.
      • +1
        Респект, однако. Думал — вы изучали труды этого товарища в институте, т.к. это было неотъемлемой частью программы. А вы оказывается моложе меня :) (А я о неполности цитаты сужу, можно сказать, — по наслышке).
        • 0
          Мне недавно попадалась интересная ссылка — «Фразы, не дослушанные до конца».
          • 0
            А еще помница такое было: "… путешествие в тысячу ли начинается с одного шага. Кто действует — потерпит неудачу."
  • 0
    А что там со скриншотами на питоне не так? ImageGrub из PIL достаточно быстро работает вроде
    • 0
      У меня получалось 1/4 секунды на скриншот. Если в этот момент ничего не выводить на сканер, то это очень заметно.
  • 0
    Когда-то давно для примитивного Siemens C55 была такая программка, которая показывала видео. Это было завораживающе. Так вот, эта программка умела показывать 4 градации серого, имитируя это мерцанием.
  • +3
    Этот сканер хоть остался сканером?? или дорога в один конец?)
    • +1
      Остался сканером, там прошивка тоже заливается через ИК порт.
  • +1
    Будет чем заняться на работе в понедельник. Как раз новую задачу с Cipher'ом поставили…
  • 0
    Прикольно :) На более старших Сайферах есть поддержка радиосвязи. В программировании ничего хитрого тоже.
  • 0
    А для сабжа есть SDK какой-то? А то не очень понятно, чем компилить и как шить. И что такое «8000lib.h» например. Не очень понятно так же, что все-таки там за процессор, моделька не указана. Какая частота например?
    А так все супер, улыбнули с утра.
    • 0
      Там родной SDK именно для этих сканеров, и компилятор от Тошибы (почему?). Прошивается загрузчиком который идет в комплекте со сканером.
  • 0
    А если на устройстве сделать буфер хотя бы для 2х-3х кадров, то возможно видео не будет так подтормаживать?
    • 0
      Возможно, я не проверял. В связке может быть три бутылочных горлышка:
      1. Снятие скриншота (см. выше).
      2. Передача данных (по ИК порту удалось получить только 38400 кБит/с)
      3. Непосредственно вывод
      Надо комбинировать и искать самый оптимальный вариант, но это выходит за рамки пятничного поста)
  • 0
    Автор, а какой там процессор стоит? Вы пользовались родным SDK?
  • 0
    Какой процессор не знаю, SDK родной.
    • 0
      Вы крут!
  • 0
    а еще такое предложение: возможно ли было передавать только изменяющиеся области экрана? тогда бы скорость прорисовки на статических сценах увеличилась, впрочем вы и сами это понимаете.
    • –1
      Тогда уж видеопоток гнать напрямую %)
  • +1
    Обалдеть! Я уже и забыл, что в своё время змейку забацал на точно таком же. =)
    Приятные воспоминания…
    • +1
      LioL > задали написать софт для штрихкод-сканера, чтоб с нашей левой базой не глючил… осталось ровно 32кб памяти
      LioL > ну я и написал змейку… управляется через последнюю цифру штрихкода
      LiOL > сегодня прихожу на склад… грузчики наклеили на лист бумаги по четыре штрихкода и играют… ВСЕ…
      вы?
      • 0
        Не, не моё =)
        С клавиш управлялось, но аппарат здоровский!
  • 0
    Стимбой аднака ))
  • 0
    Круто! А я прочитал заголовок и подумал, что уже и там стали ставить такое железо, которое видео тянет, а все хитрее оказалось. Кстати, а ИК порт еще где-то сохранился в устройствах или приходится какой-то внешний вариант использовать?
  • 0
    Классный пост, из области Artisan Crafts в IT. Честь вам и хвала, автор! Невольно вспоминается Code Pilot, девайс из продвинутых старых наборов LEGO Technic, он с помощью штрихкодов управлял моторчиками и музыкой, и даже одним-двумя концевиками. Особой прелестью была автоматическая генерация условий в получавшейся программе. Помнится, я даже спроектировал на основе набора довольно функциональную автоматическую линию… Жаль, фото не сохранилось.
  • 0
    Лишь эпиграф в этой статье надо бы поправить.
    Ленин никогда не произносил части этой фразы «и цирк». По крайней мере источников пока не обнаружено.
  • 0
    Интересно, можно ли управлять считывателем штрих-кодов так, чтобы он свой красный луч с определённой частотой включал-отключал? Можно было бы на стенах картинки рисовать ) А ещё у нас есть такой девайс, как «дисплей покупателя» — тоже, наверное, можно было бы интересного напрограммировать…
  • 0
    торт

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.