Enigma1/2 изнутри - С/С++ программируем !

  • 1. Пример плагина с простым меню
    2. Как делается добавление в запись по таймеру?
    3. Есть ли уже готовый исходничек на стягивание файлика по заданому URL?

  • Цитата

    По словам пользователя AlexXF ...
    1. Пример плагина с простым меню
    2. Как делается добавление в запись по таймеру?
    3. Есть ли уже готовый исходничек на стягивание файлика по заданому URL?


    1. Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.


    2.-3. тамже, но в коде enigma Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.

  • Вот пасибки!


    И еще один вопросик - можно ли будет перехватить с помощью плагина кнопочку Info на пульте? Подозреваю, что нельзя - это уже надо как то лезьти в имидж.


    Я прав или нет?

  • Цитата

    По словам пользователя AlexXF ...
    Вот пасибки!


    И еще один вопросик - можно ли будет перехватить с помощью плагина кнопочку Info на пульте? Подозреваю, что нельзя - это уже надо как то лезьти в имидж.


    Я прав или нет?


    С помощью плагина сомневаюсь, что этобудет возможно, но для написания и компиляции плагина, тебе придется скомпилить CDK, соответственно вмести с ним ты скомпилишь и enigma, код отработки кнопок находится в ней, эта кнопка сейчас используется на 100% и на одиночное нажатие и на двойное. Если есть желание то можно поменять и это, но тогда у тебя будет своя инигма и тебе нужно делать свой имидж.

  • Изменено 19.04.2005


    DISCLAIM: Все копирайты за механизм сборки энигмы принадлежат Alexvrs, я всего лишь собрал их до кучи в один файлик текстовый...


    ДОБАВЛЕНИЕ от 21 апреля 2005: веселье с разными компилерами и пояснения некоторые принадлежат мне :)


    Натрахавшись порядком, с помощью Alexvrs собрал CDK. Процесс явно не веселый... А посему решил заново опубликовать процесс сборки и кое-какие фички раскопаные...


    Платформа: Debian (под Virtual PC)


    1. Сбор CDK энигмы


    Внимание!!!
    + Эта сволочь не компилируется с последним FLEX 2.5.31, который идет в поставке дебиана и посему надо иметь установленый 2.5.27 или 2.5.4a
    + Сборка CDK должна производится под root и исключительно с компилером gcc не старше 3.2.2


    (унинсталируем Flex 2.5.31 -
    apt-get remove flex
    качаем flex другой версии (есть в стабильной ветке), распаковываем, инсталлируем)


    GCC DOWNGRADE
    --------------------------
    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.
    качаем дистрибутив gcc 3.2.2 и под рутом его собираем


    cd $HOME/путь к развернутому gcc 3.2.2
    ./configure --prefix=/usr
    make all
    make install

    --------------------------


    Установили? Проверяем чего у нас есть на машине (все должно уже быть в порядке, но все таки)


    Должно быть (не моложе):
    automake: 1.7.2
    autoconf: 2.57
    cvs: 1.11.1p1
    libtool: 1.4.3
    make: 3.79.1,
    gettext: 0.12
    makeinfo: 4.1
    tar: 1.13.25
    gunzip: 1.3.2
    patch: 2.5.4
    infocmp: 5.2.20020112
    gcc: >= 2.95.4 (но не старше 3.2.2 !!!)
    g++: >= 2.95.4 (но не старше 3.2.2 !!!)
    yacc: 1.35
    bison: 1.35
    flex: 2.5.4 (!!! читаем выше !!!)
    pkg-config: 0.11.0


    Итак, поехали!
    ==============
    mkdir $HOME/tuxbox-cvs


    (одно из изменений - директория $HOME/dbox2 больше не нужна - для этого используется директория $HOME/tuxbox-cvs/root)

    Отступление, касающееся сборки плагинов



    1. Качаем-с CDK из ветки dreambox:
    ----------------------------

    cd $HOME/tuxbox-cvs
    export CVS_RSH=ssh
    cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z3 co -P -rdreambox .


    2. Переходим в папку с cdk...


    cd $HOME/tuxbox-cvs/cdk


    3. Вносим изменения, согласно ядра линукса 2.6.9


    chmod ugo+x prepare


    4. Подготавливаем необходимый тип билда


    ./prepare dm7000


    Допустимые значения : dm7000, dm500, dm56x0


    5. Запускаем сборку, которая сама обновит/пофиксит/изменит что надо из разных веток...


    make checkout


    6. Собираем имидж:


    make dreamboximage_root
    make rebuild-flash
    make flash-compress


    Курим... долго курим...


    В процессе могут быть зависания по невозможности скачать тот или иной архив. Смело жмем CTRL+C. Берем, ищем в гугле по названию архива где он есть, качаем и кладем в папочку:
    $HOME/tuxbox-cvs/cdk/Archive...


    и выполняем тот мейк, на котором прервалось все это...


    Изначально все закончится с ошибкой: мол имидж великоват для дрима.
    Не волнуемся и заходим в ../root/cdkflash/
    Вычищаем ненужные файлики .part (игры pacman, snake, если не нужен, то сервер samba...)


    Например:
    Чтобы удалить sambaserver надо удалить файл .part_sambaserver в папке root/cdkflash.


    В принципе данные файлики и определяют из чего будет состоять имидж.


    cd $HOME/tuxbox-cvs/cdk
    make rebuild-flash
    make flash-compress


    (более подробно про добавление/удаление элементов имиджа читаем здесь: Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.)


    В итоге все должно завершиться без ошибок. Как результат будет собран имидж в папке ../root/cdkflash/complete.img


    Естественно не забываем о максимальных размерах имиджа


    max size of cramfs (kernel+bild) is 1152K ( 1179648 bytes )
    max size of squashfs is 4992K (511180
    complete this is 6144K (6291456)


    И теперь переходим опять же к сборке энигмы из ветки HEAD
    Обновлено


    Переименовываем папку $HOME/tuxbox-cvs/apps/tuxbox/enigma в enigma.cdk (на всякий случай, вдруг пригодится?)


    cd $HOME/tuxbox-cvs
    cvs -d anoncvs@cvs.tuxbox.org:/cvs/tuxbox -z9 co -r HEAD apps/tuxbox/enigma


    cd $HOME/tuxbox-cvs/apps/tuxbox/enigma
    ./autogen.sh

    cd $HOME/tuxbox-cvs/cdk
    rm -f .enigma


    make .enigma


    Опять курим, пьем чай, смотрим кино....
    Собралось?


    Уррраааа!!!!

    Сообщение было отредактировано 13 раз, последнее редактирование пользователем AlexXF ().

  • Ну шаг сборки Энигмы пройден - чего же дальше?


    Собрать тестовый плагин!
    Он лежит в $HOME/tuxbox-cvs/apps/tuxbox/plugins/enigma/demo/


    1. Для начала...
    cd $HOME/tuxbox-cvs/cdk/
    rm -f .plugins


    2. теперь заходим в папку $HOME/tuxbox-cvs/apps/tuxbox/plugins/
    Удаляем оттуда все файлы (не папки!!!) кроме этих:

    .cvsignore
    AUTHORS
    ChangeLog
    Makefile.am
    NEWS
    README
    autogen.sh
    configure.ac
    tuxbox-plugins.pc.in


    3. Заходим в папку $HOME/tuxbox-cvs/apps/tuxbox/plugins/enigma/demo/


    Удаляем все файлы и папки оставив всего четыре файла:


    .cvsignore
    Makefile.am
    demo.cpp
    enigma_demo.cfg


    4. Заходим в папку $HOME/tuxbox-cvs/apps/tuxbox/plugins/enigma/
    Создаем файл Makefile.am с таким содержимым:


    SUBDIRS = demo


    5. Возвращаемся в папку $HOME/tuxbox-cvs/apps/tuxbox/plugins/


    Правим файл configure.ac
    (ищем AC_OUTPUT...)


    AC_OUTPUT([
    Makefile
    Include/Makefile
    enigma/demo/Makefile
    fx2/Makefile


    далее не трогаем особенно, главное было добавить строчку enigma/demo/Makefile


    6. Правим файл Makefile.am в той же папке ($HOME/tuxbox-cvs/apps/tuxbox/plugins/)


    SUBDIRS = include tuxtxt fx2 enigma


    7. Далее все просто, мы уже это проходили:


    cd $HOME/tuxbox-cvs/cdk
    ./autogen.sh
    ./configure --prefix=$HOME/dbox2 --with-cvsdir=$HOME/tuxbox-cvs --enable-maintainer-mode --with-cpu=405 --with-hostruleset=standard --with-targetruleset=flash
    make all


    8. Собраный плагин лежит там где и он должен быть:
    $HOME/dbox2/cdkroot/lib/tuxbox/plugins


    Уфф... а можно проще? Можно!

  • Работаем на примере того же demo


    Все предыдущие шаги пройдены, но для сборки одного единственного плагина постоянно использовать 8 шагов - муторная штука!


    А посему, после всего что проделано выше, заходим сюда:
    cd $HOME/tuxbox-cvs/apps/tuxbox/plugins/enigma/demo/


    1. Правим файл Makefile


    Ищем значение CXX = powerpc-tuxbox-linux-gnu-g++ и меняем его на CXX=$HOME/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-g++


    А вот тут - ОГРОМНОЕ ВНИМАНИЕ!!!
    $HOME надо заменить на явное значение... у меня например это выглядит так:
    CXX=/home/alexxf/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-g++
    Это качается для всех изменяемых файлов в данном случае...


    Далее - меняем значение CXXCPP = powerpc-tuxbox-linux-gnu-g++ -E на
    CXXCPP = $HOME/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-g++ -E


    Сохраняем!


    2. Нужно еще одно исправление...
    cd $HOME/tuxbox-cvs/apps/tuxbox/plugins/


    Правим файл libtool.sh


    CC = "powerpc-tuxbox-linux-gnu-g++"
    меняем на ... (догадались?)
    CC = "${HOME}/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-g++"


    Точно так же поступаем с остальными значениями:


    AR = "${HOME}/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-ar"
    LTCC = "${HOME}/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-gcc"
    STRIP = "${HOME}/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-strip"


    Правим еще одну переменную (она встречается дважды):


    RANLIB="powerpc-tuxbox-linux-gnu-ranlib" на
    RANLIB="${HOME}/dbox2/cdk/bin/powerpc-tuxbox-linux-gnu-ranlib"


    Сохраняем!


    3. Опять к нашему тестовому плагину:


    cd $HOME/tuxbox-cvs/apps/tuxbox/plugins/enigma/demo/
    rm -f *.lo
    rm -f *.la
    rm -f *.o
    make


    Все!!! Теперь в будущем надо только повторять шаг 3 для повторной рекомпиляции плагина, если его будем править под свои нужды...


    Вот так!

  • а можно еще проще ? можно.....



    это и все последующее можно заменить одной командой....
    export PATH=$PATH:$HOME/dbox2/cdk/bin


    после следующего обновления cdk из cvs все эти изменения файлов - пропадут,
    и придется делать снова.



    1 команда, make clean.


    P.S. в первом посте, не нужно делать первый make all.
    зачем собирать старую енигму ? чтобы потом переименовать её в old ?
    сразу можно переименовать, закачать новую, и потому уже make.

  • AlexXF,
    отличная статья ! её бы мне недельки полторы назад почитать, а то всю ночь убил на компиляцию.
    кстати у меня под мандрейком 10 не хотело компилится с automake: 1.7.2 пока не обновил до 1.8

  • Цитата

    По словам пользователя mvt ...
    это и все последующее можно заменить одной командой....
    export PATH=$PATH:$HOME/dbox2/cdk/bin


    :) не догадался... можно!


    Цитата


    P.S. в первом посте, не нужно делать первый make all.
    зачем собирать старую енигму ? чтобы потом переименовать её в old ?
    сразу можно переименовать, закачать новую, и потому уже make.


    Там такая дикая смесь, что ветка 1_0_0 содержить кое что, что нужно для плагинов и прочего... а ветка HEAD содержить РАБОЧУЮ энигму, которая работает на рудрим имиджах


    Короче - не зря все это делалось! Иначе - 100% плагины работать не будут.

  • Те, кто уже программирует под энигму, делитесь знаниями.


    Известно, что документации на CDK нету. А посему хотелось бы знать некоторые фички...


    1. Как таки узнать текущий канал, который показывается? Имя, ID и все прочее?
    2. Как переключиться на канал, имея в руках только его имя?
    3. Как запрограммировать таймер?


    Честно обещаю, чего нарою рассказывать здесь, благо задача копания в исходных текстах в поисках чего нить понятного не из легких.


    Ну так что, пишет кто нибудь или нет?

  • Привет mvt, рад тебя видеть, если ты тот о ком я подумал,


    Цитата

    это и все последующее можно заменить одной командой....
    export PATH=$PATH:$HOME/dbox2/cdk/bin


    все правельно, именно так я и делал ;) , и конечно тут еще не расказанно про кучу дополнений и тонкостей, но все сразу не упомнишь, т.к. все собирается понемногу и по маленьку,


    Цитата

    1 команда, make clean.


    небольшое дополнение, если менялись какие то файлы с исходниками, то можно просто
    make all,
    компилятор сам это поймет, а вот команда
    make install-exec-local,
    после компиляции скопирует полученный бинарник куда нужно


    и еще обратите внимание на файл configure.ac,
    вот тут есть некие дополнительные ключи для использования библиотек, если вы планируете использовать ряд возможностей для плугина (например доступ к xml файлам), то вам сюда, вот кусочек из моего файлика:


    TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config)
    TUXBOX_APPS_LIB_PKGCONFIG(FRIBIDI,fribidi)
    TUXBOX_APPS_LIB_PKGCONFIG(PNG,libpng)
    TUXBOX_APPS_LIB_PKGCONFIG(SIGC,sigc++-1.2)
    TUXBOX_APPS_LIB_PKGCONFIG(XMLTREE,tuxbox-xmltree)


    CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS $FRIBIDI_CFLAGS $PNG_CFLAGS $SIGC_CFLAGS $XMLTREE_CFLAGS -fno-exceptions -fno-rtti -Werror"

  • Хорошо программисту под Win32 - у него есть MSDN



    Так что программировать внешний интерфейс как оказалось очень просто, ничуть не сложнее Win32 !!!

  • Тут я раскажу как делать инсталяционные пакеты для имиджей ruDREAM (простите если не совсем в тему, но мне кажеться в этом разделе это уместно, т.к. изготовленный plugin нужно еще и установить в DreamBox):


    1. Для начала создаем вот такую структуру папок:


    [pluginType_pluginName]/var/tmp/install ,


    причем имя первой папки имеет некоторую условность, оно составное и имеет следующей формат:
    pluginType_pluginName ,


    где pluginType - тип плугина, вот весь используемый список типов:
    language, skin ,plugin, game, background, emu, updare
    pluginName - имя самого плугина (без пробелов, можно использовать любое понятное сокращение)


    2. в папку [pluginType_pluginName]/var/tmp/install
    копируем все файлы, которые будут устанавливаться на DreamBox


    3. в папке создаем 2 файла управляющих установкой и удалением дополнения (install/uninstall), имена файлов такие:
    install.xml - правлила установки
    [pluginType_pluginName].xml - правлила удаления, принцип названия файла оналогичен имени папки см. п.1


    4. Формат файлов install.xml/[pluginType_pluginName].xml , одинаковый и имеет такую структуру:

    PHP
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <install>
       <[type] target="5" name="имя дополнения" url="" version="DDD" creator="" description="описание дополнения" /> 
       <инструкция для установки/удаления №1/>
       <инструкция для установки/удаления №2/>
       <инструкция для установки/удаления №n/>
    </install>


    [type] - тип дополнения (все типы перечисленны в п.1)


    5. Формат инструкций такой:

    PHP
    <[инструкция] [параметр1]="xxxx" [параметр2]="xxxx" [параметрN]="xxxx" />


    [инструкция] - существует 9 вариантов:
    dir, file, configxml, configfile, registry, message, runscript, exeplugin, reboot


    (каждая инструкция имеет свой набор параметров, см. п. 6)


    продолжение следует......

  • 6. Все форматы инструкций:

    PHP
    <dir name="dir_name" distantion="path" permissions="755" />


    [dir] - инструкция создания папки
    [name="dir_name"] - имя создоваемой папки
    [distantion="path"] - полный путь, где будет создаваться папка
    permissions=[xxx] - права доступа (3 цифры, аналогично Linux)

    PHP
    <file name="file_name" distantion="/path/" permissions="644" />


    [file] - инструкция копирования файла
    [name="file_name"] - имя копируемого файла
    [distantion="/path/"] - полный путь, куда будет содаваться файл (обязательно на конце "/")
    [permissions="xxx"] - права доступа (3 цифры, аналогично Linux)

    PHP
    <configxml source="/tmp/install/emulist.xml" distantion="/var/tuxbox/config/emulist.xml" actions="set|add|del" />


    [configxml] - инструкция внесения изменений в xml файлы
    [source="/tmp/install/emulist.xml"] - исходный файл с шаблоном для добавления/замещения/удаления элемента xml файла, поддерживается только простейшие xml файлы, имеющее такую структуру:

    PHP
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <emulist>
       <element1 parametr1="" parametr2="" parametrN="" .../>
       <element2 parametr1="" parametr2="" parametrN="" .../>
       <elementN parametr1="" parametr2="" parametrN="" .../>
    </emulist>


    где для добавления/замещения/удаления используется секции element1-elementN
    [distantion="/var/tuxbox/config/emulist.xml"] - файл в котором делаются изменения
    [actions="set|add|del"] - тип изменений, можно указывать любое из трех значений set|add|del (добавить/заместить/удалить)

    PHP
    <configfile source="/tmp/install/config.cfg" distantion="/var/tuxbox/config/config.cfg" actions="set|add|del" />


    [configxml] - инструкция внесения изменений в простой текстовый файл
    [source="/tmp/install/config.cfg"] - исходный файл с шаблоном для добавления/замещения/удаления, данный файл может иметь несколько строк, каждая строка при этом обрабатывается отдельно:

    PHP
    строка1
    строка2
    строкаN


    [distantion="/var/tuxbox/config/config.cfg"] - файл в котором делаются изменения
    [actions="set|add|del"] - тип изменений, можно указывать любое из трех значений set|add|del (добавить/заместить/удалить)


    продолжение следует.....

  • PHP
    <registry name="key_name" value="string" actions="setKey|delKey" />


    [registry] - инструкция внесения изменений в файл реестра
    [name="key_name"] - ключь реестра
    [value="string"] - значение реестра (пока поддерживается только строковые значения!)
    [actions="setKey|delKey"] - тип изменений, можно указывать любое из двух значений setKey|delKey (установить/удалить)

    PHP
    <message text="blabla" helptext="blabla...." />


    [message] - инструкция выводящая сообщение при инсталяции
    [text="blabla"] - текст заголовка сообщения
    [helptext="blabla...."] - текст самого сообщения

    PHP
    <runscript name="" text="blabla" helptext="blabla...." />


    [runscript] - инструкция выполнения скрипта
    [name="script"] - текст скрипта или имя файла со скриптом
    [text="blabla"] - текст сообщения при ошибке выполнения скрипта (параметр не обязательный, при отсутствии ничего не выводиться)
    [helptext="blabla...."] - текст сообщения выводимого при успешном выполнении (параметр не обязательный, при отсутствии ничего не выводиться)

    PHP
    <exeplugin name="demo.cfg" />


    [exeplugin] - инструкция запуска plugin
    [name="demo.cfg"] - имя файла конфигурации plugin (указывать полный путь не нужно)

    PHP
    <reboot type="hard|full|hot" />


    [reboot] - инструкция перезагрузки DreamBox
    [type="hard|full|hot"] - тип перезагрузки, указывается один из трех вариантов hard|full|hot (без сохранения настроек|полная перезагрузка|перезагрузка только enigma)


    продолжение следует......

  • 7. Так же нужно заметить, что в файл install.xml нужно добавить инструкцию копирования файла для удаления дополнения ([pluginType_pluginName].xml), он должен быть скопирован в предопределенную папку:
    /var/uninstall/
    8. Если сценарий удаления будет использовать какие то дополнительные файлы (например для изменения xml файлов), то эти файлы рекомендуется копировать в папку:
    /var/uninstall/][pluginType_pluginName]/, где надо заметить, что ее нужно так же предварительно создать соответствующей инструкцией при установке
    (и не забыть удалить, при удалении приложения, включая сам файл [pluginType_pluginName].xml)
    9. Теперь собственно сборка самого пакета, для этого в папке [pluginType_pluginName] , нужно создать скрипт и выполнить его:


    ну вот вроде и все, если есть вопросы задавайте....

  • Такая вот конструкция:


    time_t now=time(0)+eDVB::getInstance()->time_difference;


    Но нифига не текущее время возвращается, а что-то странное... причем с очень странным смещением.


    Что делается не так?



  • Вот официальный список необходимых пакетов и их версий
    Пожалуйста зарегистрируйся для просмотра данной ссылки на страницу.


    - cvs
    - autoconf >= 2.52h
    - automake >= 1.7
    - libtool >= 1.4.2
    - gettext >= 0.12.1
    - make >= 3.79
    - makeinfo (texinfo)
    - tar
    - bunzip2 (bzip2)
    - gunzip (gzip)
    - patch
    - infocmp (ncurses-bin / ncurses-devel)
    - gcc 2.95 or >= 3.0
    - g++ 2.95 or >= 3.0
    - flex
    - bison
    - pkg-config
    - wget


    Для удобства проверки пакетов собрал вызовы версий пакетов в одном скрипте (сэнкс Alexvrs за идею)