вторник, 8 февраля 2011 г.

Программируем электронную книгу Qumo Libro

Недавно приобрел себе читалку Qumo Libro (писал об этом в Buzz'е), и был совершенно уверен, что программировать её нельзя, поскольку слово "прошивка" четко обозначало (раньше, как минимум) что-то, что заливается в ППЗУ и намертво.

И только после покупки набрел на форум сайта The-eBook.org, где обнаружилось, что писать программы для этой книжки можно, да к тому же не на какой-нибудь обрезанной Java, а на самом обычном C.

Ну, дернуло и меня этим заняться, особенно всвязи с тем, что в Libro НЕТ ШАХМАТ!! :( Но на то, чтобы подступиться к программированию, потратил кучу времени. Крупицы требуемых полезных сведений были разбросаны чуть ли не по всему форуму, и стоило большого труда всё это собрать воедино.

Между прочим, Qumo Libro программно совместима с Qumo Colibri, Digma e*, Gmini, Sibrary, и другими подобными электронными книгами, поэтому данное руководство и для вышеозначенных книг тоже должно подойти.

В общем, всвязи со всем этим, решил написать небольшую статью для тех, кто вдруг тоже купит себе читалку, совместимую с Qumo Libro, и захочет для этого девайса что-нибудь написать!

Итак, приступим! Для того, чтобы программировать под Qumo, нам понадобится 64-битный Linux. Дело в том, что китайцы написали SDK именно под эту систему, так что деваться некуда. Но при этом, я вас уверяю, работать с Linux уметь не требуется :) Смотрите сами ниже по тексту, совершенно ничего сложного.

В общем, первым делом, запускаем закачку следующих двух дистрибутивов:
  1. VirtualBox.
  2. Ubuntu x64 (не забудьте на странице загрузки выбрать именно 64-разрядную версию)
Кроме этого, нам потребуется обязательно то самое SDK, его можно стянуть с фтп китайцев:
Хост: 125.91.8.7
Пользователь: FTP_user6
Пароль: user123
Короткая ссылка: ftp://FTP_user6:user123@125.91.8.7/
Файл: sibrary_toolchain.tbz2 
У меня с этого сайта почему-то ОЧЕНЬ медленно качается и соединение рвется постоянно, поэтому когда все-таки удалось скачать, я переупаковал этот SDK в 7-zip, и разместил его на собственном хостинге:
http://files.paccbet.ru/sibrary_toolchain.tar.7z
Ждем, пока скачается, дальше последовательность действий такая:

Во-первых, устанавливаем VirtualBox, запускаем, создаем новую виртуальную машину, выбираем целевую ОС Ubuntu x64, памяти ставим хотя бы полгига, ну и напоследок создаем виртуальный жесткий диск на 6 гигабайт.

При попытке запуска вновь созданной виртуальной машины VirtualBox сама спросит, хотим ли мы подсунуть диск с операционкой, этого мы безусловно хотим, подсовываем им скачанный файлик ubuntu-10.10-desktop-amd64.iso в качестве диска, и дальше я даже комментировать не буду, на мой взгляд Ubuntu поставить это даже проще, чем Windows :)

Кстати, после того как поставили Ubuntu, можем скачать SDK прямо с виртуалки, это очень даже удобно (в комплекте с Ubuntu ведь сразу же идет FireFox):

Чтобы распаковать, быстренько ставим 7-zip через Центр приложений Ubuntu. Для этого выбираем в верхнем меню Приложения -> Центр приложений Ubuntu, там пишем в окошке поиска 7-zip, шмакаем по первому пакету в списке и устанавливаем его. Ну согласитесь, удобно, да?:)



СТОП! Нет, я тут не рекламирую Linux. Просто, действительно удобно сделали некоторые вещи. А для нас это прежде всего означает, что не будет проблем с использованием данной операционки для программирования интересующего нас Qumo Libro.

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


Теперь пора создавать собственно наше приложение!
Выбираем в меню Переход -> Домашний каталог, создаем новую папку (например test, я сделал для удобства две вложенные папки, qumolibro/test), создаем пустой файл, переименовываем его в test.c, и затем создаем еще один пустой файл, и его переименовываем в makefile.
Жмем на makefile дважды (открывается gedit, это убунтовский аналог блокнота), и копипастим туда следующий текст:
CC  = arm-ereader-linux-gnueabi-gcc
LD  = arm-ereader-linux-gnueabi-gcc

SRC = test.c
OBJ = $(SRC:.c=.o)
EXE = test

CFLAGS += -Wall -g `pkg-config --cflags gtk+-2.0` 
LDFLAGS += `pkg-config --libs gtk+-2.0`

all: $(OBJ)
  $(LD) -o $(EXE) $(OBJ) $(LDFLAGS)


Дальше открываем файл test.c, и копипастим туда вот такой код:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <gtk gtk.h>

// ----------------
// Работа с экраном
// ----------------

#define EPAPER_UPDATE_LOCAL 0x101
#define EPAPER_UPDATE_PART  0x102
#define EPAPER_UPDATE_FULL  0x103

// Низкоуровневая функция для обновления экрана
static void epaperUpdate(int ioctl_call)
{
    int fd = open("/dev/fb0", O_RDWR);
    if (fd >= 0)
    {
        ioctl(fd, ioctl_call);
        close(fd);
    }
}

// Обработчик события на перерисовку виджета GTK+
static gboolean onWidgetPaint(
 GtkWidget      *widget,
    GdkEventExpose *event,
    gpointer        data)
{
    epaperUpdate(EPAPER_UPDATE_PART);
    return FALSE;
}



// ------------
// Главное окно
// ------------

// При попытке закрыть окно
static gboolean onWindowClose(
 GtkWidget *widget,
    GdkEvent  *event,
    gpointer   data)
{
 return TRUE;
}

// Уничтожение окна
static void onWindowDestroy(GtkWidget *widget, gpointer   data )
{
    gtk_main_quit();
}

// Создание окна верхнего уровня
static GtkWidget *createMainWindow()
{
 // Создаем окно верхнего уровня
    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 // Подписываемся на события для этого окна
    g_signal_connect(window,
     "delete-event",
                     G_CALLBACK(onWindowClose), 
      NULL);
    g_signal_connect(window,
     "destroy",
                    G_CALLBACK(onWindowDestroy),
     NULL);
    g_signal_connect(window,
     "expose-event",
                     G_CALLBACK(onWidgetPaint),
      NULL);

    return window;
}

int main(int argc, char **argv)
{
    GtkWidget *window, *button;

    // Инициализируем библиотеку GTK+
 gtk_init(&argc, &argv);

 // Создаем главное окно
 window = createMainWindow();
 
 // Создаем кнопку с надписью Hello World
    button = gtk_button_new_with_label ("Hello World");
    
 // Подписываемся на события кнопки
    g_signal_connect_swapped(button,
        "clicked",
        G_CALLBACK (gtk_widget_destroy),
                             window);
        
    g_signal_connect(button,
     "expose-event",
                    G_CALLBACK(onWidgetPaint),
     NULL);


 // Добавляем кнопку в окно
    gtk_container_add(GTK_CONTAINER(window), button);

 // Запускаем на выполнение
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

Можете при желании поразбираться с кодом, вкратце скажу, на Qumo Libro используется GTK+ 2.0 (штука ужасная конечно, но придется идти на жертвы!), и еще некоторые хитрые способы для работы с E-Ink экраном.

Что же, код создан, осталось его скомпилировать. К делу!

Открываем Приложения -> Стандартные -> Терминал, и вводим следующие команды:

cd test/
source /usr/local/ereader/eabi-glibc/toolchain_setup
make

В итоге, должно отобразиться что-то типа такого:


Ура! Появился исполняемый файлик, все отлично. Теперь его можно закачивать на флэшку вашего Libro, запускать через Проводник, и увидеть заветный Hello World.

P. S. На всякий случай, упомяну еще одну небольшую закавыку, при создании Shared folder в Virtual Box (предварительно придется, естественно, поставить "Дополнения гостевой ОС"), сразу убунта его не увидит, придется зайти в терминал, и прописать следующие команды:

sudo mkdir /media/windows-share
sudo mount -t vboxsf <folder-name> /media/windows-share
, где <folder-name> нужно заменить на название Shared folder, указанного в Virtual box. После этих операций можно будет спокойно копировать файлы между Shared folder и Ubuntu.

29 комментариев:

  1. Мне сегодня какраз эту читалку подарили(на днюху), и тут подробнейшее howto для программирования под неё. Спасибо :)
    Долго не мог понять зачем virtualbox и ubuntu, только потом дошло, что большинство использует windows:)
    Интересно, у меня с 32 битной осью получится или придётся переползать на 64 бита? Скачается, узнаю.

    ОтветитьУдалить
  2. На форуме ребята говорят однозначно: пойдет только на 64 битах. Чтобы заработало на x86, нужно прилагать какие-то дополнительные усилия, но я в этом не силен, ничего конкретного порекомендовать не могу.

    Да, если кому-то потребуются более подробные примеры, я уже успел портировать следующие две игры: Пятнашки и Сокобан.

    По ссылкам - подробные описания игр, скриншоты, ссылки на бинарники и на исходники.

    ОтветитьУдалить
    Ответы
    1. Извините, у вас сдк не сохранился? Не могу нигде найти...

      Удалить
    2. К сожалению, нет. Файл уж больно здоровый, так что в определенный момент с хостинга его удалил, там места не хватало. И жесткий диск уже сменил с тех пор, давно дело было... Остались только исходники и бинарники для игр которые я написал.

      Удалить
    3. Вот уважаемый S-trace с форума http://www.the-ebook.org дал ссылку:
      https://cloud.mail.ru/public/E2Ko/dAGMM3rpv

      Удалить
  3. Ага, на 32 не идёт.
    Что-то не получается запустить сокобан: сделал всё по инструкции(тупо извлёк архив в корень флешки). Нажимаю на gsoko - ничего не происходит. Что я делаю неправильно?
    Вот как на флешке: http://pastebin.com/GcpS0m5S

    ОтветитьУдалить
  4. Прошу прощения, ошибочка обнаружилась!
    Спасибо, что сообщили.

    Нужно чтобы каталоги имели структуру:
    Data/gsoko/img
    Data/gsoko/levels
    , а сам исполняемый файл gsoko в любое удобное место можно положить

    сейчас перезалью архив, можете пока сами создать в папке Data каталог gsoko и переместить туда img и levels

    ОтветитьУдалить
  5. Архив перезалил. Должно заработать.

    ОтветитьУдалить
  6. Ага, отлично! Вечером залью версию с увеличенными в 2 раза картинками (на форуме ребята помогли).

    ОтветитьУдалить
  7. Ещё поправьте " Дальше открываем файл test.c, и копипастим туда вот такой код:"
    где #include воспринимается как html тег.

    Как поставлю 64 битную ось, надо будет попробовать читалку man'ов запилить:)

    ОтветитьУдалить
  8. На всякий случай сообщаю: на форуме выложил свежую версию Сокобана, вроде стало значительно лучше.

    ОтветитьУдалить
  9. 64 битная ось почти установлена, теперь буду мучать девайс:)
    зы /usr/bin/chess - это что-то типо крестики-нолики (запустить можно скриптом NAME.sh с содержимым:
    #!/bin/sh
    /usr/bin/chess
    )

    ОтветитьУдалить
  10. Запустил я у себя hello world:)
    Как ещё можно отключать usb-storage на либре? А то разъём долго не проживёт:) Идеально было-бы поднять сетевой интерфейс по узб, ну или компорт, тоже неплохо:)
    А насчёт gtk - его выкинуть и напрямую работать с фреймбуффером не получится?

    ОтветитьУдалить
  11. На оба вопроса могу сказать только, что я в вопросах, связанных с программированием под Linux, разбираюсь довольно плохо. Все, что на текущий момент известно, включая всякие примеры, можно найти на форуме в топике Первая программа для Qumo.

    Идеально было-бы поднять сетевой интерфейс по узб, ну или компорт, тоже неплохо:)
    Вот это очень актуальный вопрос! Знаю, что на Азбуке, к примеру, такое возможно.

    Что больше всего бесит, это что на книжке ничего нельзя делать, пока подключен usb storage... Хотя бы потестировать бы программу не вынимая шнурка, дак нельзя! :(

    ОтветитьУдалить
  12. как прикрутить папку в винде к убмунту на вертуалке? я не работал в этой среде...

    ОтветитьУдалить
  13. Андрей, прочитай конец сообщения как следует:))
    Там в P.S. как раз именно этот вопрос подробно расписан.

    ОтветитьУдалить
  14. Между прочим, на днях китайцы открыли SDK Sibrary и даже с возможностью создания собственных прошивок. Подробнее - на форуме The-Ebook.

    ОтветитьУдалить
  15. ЫЫЫЫ(извиняюсь за столь неинформативное сообщение, сейчас буду читать, пытаться собирать)

    ОтветитьУдалить
  16. Отлично! Я посмотрел sdk, в качестве оконного менеджера используется matchbox.. а GPE ктоньть пробовал собирать? ибо для него достаточно много всего..

    ОтветитьУдалить
  17. Камрад, а читалку еще не писал?

    ОтветитьУдалить
  18. Ребяты, я с Qumo Libro закончил, к сожалению - хрупкий экран очень, вот и продавили мне его случайно :(

    А т.к. у меня двое детей маленьких, то я предпочел пока к E-Ink не возвращаться, а приобрести что-то более прочное.

    Так что больше я не программирую под Qumo Libro, все что успел написать - Шахматы, Sokoban и Пятнашки - все есть на форуме The-Ebook. Обсуждение рекомендую перенести туда.

    ОтветитьУдалить
  19. Грустно:( У меня gmini m6, трясусь над ней, чтоб не угробить. А читалку хочется такую, чтоб часы не отображались... Придется вспоминать программирование:)

    ОтветитьУдалить
  20. А у тебя разве нет полноэкранного режима? На Qumo Libro точно был, в меню поищи.

    ОтветитьУдалить
  21. Полный экран есть, кнопкой ОК включается. Только я че-то не совсем уверен, что это помогает немного беречь заряд:)

    ОтветитьУдалить
  22. Андрей, скажите пожалуста: можно ли на нем (qumo libro) просто терминал запустить?

    ОтветитьУдалить
  23. Как я понял GTK это создание интерфейса, а на С программа.
    Вопрос, а на GTK к примеру таймер написать можно и вставить в читалку?

    ОтветитьУдалить
  24. Блин, а у меня даже 7 zip нормально не встал - только консольная версия, и та ошибку пишет - "Неподдерживаемый метод сжатия tar.gz". Ну.. это я к тому как "действительно удобно делать некоторые вещи" :)

    За мануальчик спасибо!

    ОтветитьУдалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.

Примечание. Отправлять комментарии могут только участники этого блога.