Прошивка Bip | Приложения для BipOS ( elf )

MNVolkov

Разработчик
Команда форума
Сообщения
262
Реакции
1,981
Баллы
338
Ваше "умное" устройство
Amazfit Bip
  • Первое сообщение
  • #1
Приложения для BipOS (elf)

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

Тема по BipsOS: Прошивка - Bip | MNVolkov BipOS
Тема о разработке приложений для BipOS и инструкция по установке: Bip | Разработка приложений для BipOS ( SDK )
Архиватор ресурсов для добавления elf-приложений в файл ресурсов

Список приложений:
1. Калькулятор
2. Календарь
3. Редактор будильников
4. Фонарик
5. Демонстрация генератора случайных чисел
6. Демонстрация использования "собственных" ресурсов
7. Фитнес-таймер
8. Музыка
9. Пульс Демо
10. Notepad
11. График сердечного ритма (HR Chart)

Список игр:
1. Тетрис
2. FlappyBird
3. 2048
4. Sokoban
5. Ping-Pong
6. Breakout
7. DOOM Alpha
8. Snake

Список анимации:
1. Анимация Keanu (Cyberpunk 2077)
2. Steve WF
3. Mickey mouse
4. Abstract


IMG_20191230_012446.jpg
 
Последнее редактирование модератором:

en_rov

Друг форума
Сообщения
34
Реакции
100
Баллы
18
Ваше "умное" устройство
Amazfit Bip
Демонстрация кнопок BipUI 0.1

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


buttonsDemo1.png

English description in the spoiler below
В прошлом я жаловался на интерфейс приложения в BipOS и, наконец, решил упростить дизайн приложения,

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

, которую я буду называть BipUI. Это еще не закончено, но в то же время я создал эту демонстрацию, чтобы показать, что она может сделать в данный момент


Каркас позволяет определять кнопки_ как структуры и добавлять их в Layers_, которые, в свою очередь, являются структурами кнопок и других функций. Как только все это определено - см. Функцию layerButtonsConstructor() - слой должен быть обновлен, и все рисование происходит автоматически.

Но ждать! Есть еще кое-что: реакция на отводы также тривиальна при таком подходе. Для касаний у вас уже есть координаты ваших кнопок, сохраненные и доступные функцией processTap (), которая проверяет, находится ли касание внутри одной из кнопок. Если это так, вызывается callbackFunction () этой кнопки, которая выполняет то, что вы хотите, и возвращает, как подпрограмма обработки прерываний.

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

Это все на данный момент. Я буду продолжать улучшать и расширять рамки в будущем, если вы хотите внести свой вклад, вы более чем приветствуем.


РЕДАКТИРОВАТЬ: 1001-й пост. Как уместно.

BipUI Buttons Demo 0.1

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


buttonsDemo1.png

I have complained in the past about application UI on BipOS, and finally decided to make app design simpler creating a

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

I will be calling BipUI. It is not finished yet but in the meantime I created this demo to show off what it can do at this moment

The framework allows for buttons_ to be defined as structs and added to Layers_, which in turn are structs of buttons and other features. Once all this is defined - see function layersButtonsConstructor() - the layer is set to be refreshed and all the drawing happens automatically.

But wait! There's more: reacting to taps is also trivial with this approach. For taps, you already have coordinates of your buttons saved and accessible by the processTap() function, which checks if the tap is inside one of the buttons. If so, the callbackFunction() of that button is called, which performs what you want and returns, like an interrupt service routine.

In this case, the callbackfunction of each button is the same, printing the information of the button on screen and scheduling a refresh.

That's all for now. I will continue improving and expanding the framework in the future, if you wish to contribute you're more than welcome.


EDIT: 1001th post. How appropriate.
 

Вложения

Последнее редактирование:

Lan

Новичок
Сообщения
11
Реакции
6
Баллы
3
Ваше "умное" устройство
Amazfit Bip
Крестики-нолики уже в разработке, а вот что насчет других игрушек, сделать их конечно возможности есть, но вот как реализовать управление...
крестики нолики все еще в разработке?
 

en_rov

Друг форума
Сообщения
34
Реакции
100
Баллы
18
Ваше "умное" устройство
Amazfit Bip
На заметку: если вы разработчик Pebble, вы наверняка будете знакомы со схемой именования, которую я выбрал для типов данных, которые я создал. Если вы разрабатываете или планируете начать разработку приложений на этих часах, разработка приложений Pebble - это то, что нужно искать. Хотя вы, очевидно, не можете запустить приложение Pebble на Bip, именно это вдохновило меня на создание этого фреймворка. За ним легко следовать, и он учит хорошей практике программирования, что имеет решающее значение в средах с ограниченным объемом памяти, таких как эти умные часы. Если вы прочтете bipui.h после прочтения структуры приложения Pebble, у вас будет хорошее представление о том, что я собираюсь сделать с BipUI.


@MNVolkov Я уделяю внимание чтению свободной памяти во время разработки и вижу утечку памяти ~ 400b после открытия, использования и закрытия приложения. Это моя вина, что я не освободил память для данных приложения? Я не мог понять, как использовать функцию free () в libbip.h.

On a sidenote: if you're a Pebble developer, you will certainly be familiar with the naming scheme I chose for the data types I created. If you are developing or thinking of getting started with application development on this watch, the Pebble app development is what to search for. Even though you obviously can't run Pebble application on the Bip, it was what inspired me to create this framework. It is easy to follow and teaches good programming practice, which is crucial in memory constrained environments such as on this smartwatch. If you go through through bipui.h after reading the Pebble app structure you will have a good idea of what I'm going for with BipUI.

@MNVolkov I have been paying attention at the free memory reading while developing, and I see a ~400b memory leak after opening, using and closing the app. Is it my fault for not freeing the memory for the app data? I couldn't figure out how to use the free() function in libbip.h.
 
Последнее редактирование:

MNVolkov

Разработчик
Команда форума
Сообщения
262
Реакции
1,981
Баллы
338
Ваше "умное" устройство
Amazfit Bip
На заметку: если вы разработчик Pebble, вы наверняка будете знакомы со схемой именования, которую я выбрал для типов данных, которые я создал. Если вы разрабатываете или планируете начать разработку приложений на этих часах, разработка приложений Pebble - это то, что нужно искать. Хотя вы, очевидно, не можете запустить приложение Pebble на Bip, именно это вдохновило меня на создание этого фреймворка. За ним легко следовать, и он учит хорошей практике программирования, что имеет решающее значение в средах с ограниченным объемом памяти, таких как эти умные часы. Если вы прочтете bipui.h после прочтения структуры приложения Pebble, у вас будет хорошее представление о том, что я собираюсь сделать с BipUI.
@MNVolkov Я уделяю внимание чтению свободной памяти во время разработки и вижу утечку памяти ~ 400b после открытия, использования и закрытия приложения. Это моя вина, что я не освободил память для данных приложения? Я не мог понять, как использовать функцию free () в libbip.h.
Я благодарю Вас за качественную работу в копилку BipOS, благодаря таким разработчикам как Вы проект развивается и мы можем воплотить свои идеи.
Хочу, только предостеречь от избыточного использования вспомогательного кода, когда в этом нет необходимости. Поскольку метод запуска Elf файлов подразумевает хранение кода в ресурсах, последующую его загрузку в оперативную память целиком, размер свободной памяти должен позволить загрузить одним блоком весь Elf. Как правило объем свободной памяти не равен размеру наибольшего непрерывного блока свободной памяти, и из-за попытки выделить превышающий его размер блок раньше происходили перезагрузки часов, с выходом BipOS 0.5.2. выдается сообщение ошибки загрузки с кодом -9 . Таким образом, в условиях ограниченного объема ресурсов часов, возможно прийдется пожертвовать удобством программирования в пользу меньшего использования объема памяти.

Что касается утечки памяти, то при проверке механизма загрузки/выгрузки приложений я проверял на утечки и ничего не обнаружил. Возможно при стечении некоторых обстоятельств возможна утечка, этого я не исключаю. Контролировать объем свободной памяти можно в меню BipOS "Настройки"->"Информация"-"Free RAM".
 

en_rov

Друг форума
Сообщения
34
Реакции
100
Баллы
18
Ваше "умное" устройство
Amazfit Bip
Я благодарю Вас за качественную работу в копилку BipOS, благодаря таким разработчикам как Вы проект развивается и мы можем воплотить свои идеи.
Хочу, только предостеречь от избыточного использования вспомогательного кода, когда в этом нет необходимости. Поскольку метод запуска Elf файлов подразумевает хранение кода в ресурсах, последующую его загрузку в оперативную память целиком, размер свободной памяти должен позволить загрузить одним блоком весь Elf. Как правило объем свободной памяти не равен размеру наибольшего непрерывного блока свободной памяти, и из-за попытки выделить превышающий его размер блок раньше происходили перезагрузки часов, с выходом BipOS 0.5.2. выдается сообщение ошибки загрузки с кодом -9 . Таким образом, в условиях ограниченного объема ресурсов часов, возможно прийдется пожертвовать удобством программирования в пользу меньшего использования объема памяти.

Что касается утечки памяти, то при проверке механизма загрузки/выгрузки приложений я проверял на утечки и ничего не обнаружил. Возможно при стечении некоторых обстоятельств возможна утечка, этого я не исключаю. Контролировать объем свободной памяти можно в меню BipOS "Настройки"->"Информация"-"Free RAM".
Спасибо за добрые слова. Хотя теория сильна, у меня нет большого опыта во встроенном C, поэтому моё определение «необходимых» вспомогательных функций может быть неверным. Возвращаясь к Pebble, я думаю, что его процветание было связано с простотой как пользовательского интерфейса, так и разработки приложений, и поэтому, на мой взгляд, цель создания приложения должна быть максимально простой и понятной. Кроме того, если вам нужна пара кнопок и текст, вам не нужно беспокоиться о том, что происходит под капотом.

При этом у меня есть несколько сомнений по поводу нескольких вещей:

- Просто чтобы нам было понятно - вы предостерегаете от размера программы или использования оперативной памяти? К сожалению, я не могу дать никаких оценок ни по одному из них, поэтому остановлюсь и подумаю над тем, что делать, когда достигну предела ресурсов. Моя идея

- Показания свободной памяти в меню Alipay совпадают с возвращаемым значением get_var_free_ram()? Это максимальный непрерывный размер или общий объем свободной памяти? Или вам нужно перемещаться по возвращаемому значению get_ptr_free_list()?

- Допустим, я хочу открыть меню menu_struct из кнопки. Нужно ли передавать указатель на show_screen () моего приложения в качестве параметра ret_f ()?

Наконец, вы упоминаете фоновые процессы

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

:

C:
typedef struct

{                                      // structure of the running process

    unsigned int process_id;           // process identifier assigned by the loader

    int index_listed;                  // elf index in the bootloader list

    void *base;                        // pointer to the memory allocated for the process

    unsigned int size;                 // amount of memory allocated for the process

    void *ret_f;                       // process return point

    unsigned int ret_param0;           // return function parameter

    void (*elf_finish)(void *param0);  // pointer to the elf completion procedure, here you need to pass

    void (*entry_point)(void *param0); // pointer to the elf launch procedure, entry point. Param0 = pointer to the proc structure of the running process

    void *param;                       // user parameter, you can store anything, for example pointers instead of temp_buf_2 for background processes

    int argc;                          // number of parameters when running the elf

    void **argv;                       // parameters when starting the elf

} Elf_proc_;

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

РЕДАКТИРОВАТЬ: я забыл самую важную часть! Как посмотреть журнал устройства? Я вижу, у вас есть отладочные отпечатки в исходном коде приложения календаря, но вы не можете понять, как их использовать.
Кроме того, спасибо @AlexJey для LikeApp, до сих пор мне это очень понравилось.

Thanks for the kind words. Though the theory is strong, I do not have much hands on experience in embedded C, so my definition of "necessary" auxiliary functions may be wrong. Going back to the Pebble, I think what made it flourish was the simplicity of both user interface and app development, and therefore the aim for app creation should be as simple and straighforward as possible in my opinion. Also, if all you need is a couple of buttons and some text, you shouldn't have to worry about what goes on under the hood.

That being said, I have a few doubts on a couple of things:

- Just so that we are clear - you warn against program size or RAM memory usage? I can't make any estimates on neither of those, unfortunately, so I will stop and think on what to do when I reach the resource limit. My idea is
- Is the free memory reading in the Alipay menu the same as get_var_free_ram() return value? Is that the max continuous size or the total amount of free memory? Or you have to navigate the return value of get_ptr_free_list()?
- Let's say I want to open a menu_struct menu from a button, would I need to pass the pointer to my application's show_screen() as the ret_f() parameter?

Lastly, you mention background processes

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

:

C:
typedef struct

{                                      // structure of the running process

    unsigned int process_id;           // process identifier assigned by the loader

    int index_listed;                  // elf index in the bootloader list

    void *base;                        // pointer to the memory allocated for the process

    unsigned int size;                 // amount of memory allocated for the process

    void *ret_f;                       // process return point

    unsigned int ret_param0;           // return function parameter

    void (*elf_finish)(void *param0);  // pointer to the elf completion procedure, here you need to pass

    void (*entry_point)(void *param0); // pointer to the elf launch procedure, entry point. Param0 = pointer to the proc structure of the running process

    void *param;                       // user parameter, you can store anything, for example pointers instead of temp_buf_2 for background processes

    int argc;                          // number of parameters when running the elf

    void **argv;                       // parameters when starting the elf

} Elf_proc_;
Can one launch a function as a separate application? You could have a sort of "daemon" with less resources running in the background (hourly vibration, phone status request.. ) and communicating with a "launcher" GUI.

EDIT: I forgot the most important part! How do I see the device log? I see you have some debug prints in the source code of the calendar app, but couldn't figure out how to use them.

Also, kudos to @AlexJey for LikeApp, it served me well so far.
 

MNVolkov

Разработчик
Команда форума
Сообщения
262
Реакции
1,981
Баллы
338
Ваше "умное" устройство
Amazfit Bip
вы предостерегаете от размера программы или использования оперативной памяти?
Размер исполняемого кода (секции PT_LOAD в elf файле) очень важен, поскольку при подготовке к запуску приложения выделяется память в объеме, достаточном для загрузки секций, содержащих данные и код, затем данные секции полностью загружаются в оперативную память. Память, выделенная для загрузки приложения, высвобождается автоматически после завершения приложения в функции elf_finish().
Отдельные функции приложения загрузить в память и исполнить пока нельзя.
При этом, если приложение использует дополнительную память (указатель на который получен через функцию pvPortMalloc() ) необходимо следить за её своевременным высвобождением через vPortFree().


Показания свободной памяти в меню Alipay совпадают с возвращаемым значением get_var_free_ram()? Это максимальный непрерывный размер или общий объем свободной памяти? Или вам нужно перемещаться по возвращаемому значению get_ptr_free_list()?
Да, значение свободной памяти в меню BipOS - результат функции get_var_free_ram(). Вы верно предположили, что для получения списка блоков свободной памяти необходимо перемещаться по цепочке указателей начиная с указателя, возвращаемого get_var_free_ram()
Однако, самостоятельно искать блоки памяти нет необходимости, если блока не хватит функция pvPortMalloc() вернет NULL , перезагрузки не будет.

Допустим, я хочу открыть меню menu_struct из кнопки. Нужно ли передавать указатель на show_screen () моего приложения в качестве параметра ret_f ()?
При запуске приложения в процедуру по указателю
Код:
entry_point
передается в качестве единственного параметра указатель на структуру процесса
Код:
Elf_proc_
Данная структура содержит в себе заполненные поля, такие как
Код:
elf_finish
- указатель на функцию завершения приложения и
Код:
ret_f
- указатель на функцию, получающую управление после окончания работы приложения, например, циферблат или меню приложений BipOS. Для работы на протяжении всего жизненного цикла приложения эти параметры скорее всего не понадобятся, пока вы не решите выйти из приложения.
Для открытия нового экрана внутри своего приложения
Код:
ret_f
передавать никуда не надо. Вы должны только позаботиться об указателях выделенной ранее памяти, хранящихся по адресам, возвращаемым
Код:
get_ptr_temp_buf_2()
и
Код:
get_ptr_temp_buf_1()
, поскольку при вызове
Код:
show_screen()
эта память будет высвобождена. Если по этим указателям будут хранится другие данные (не указатели на выделенную ранее память) скорее всего часы будут перезагружены - такова особенность заводской прошивки.

Наконец, вы упоминаете фоновые процессы

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

:
Пока фоновые процессы недоступны, однако я старался делать структуру BipOS совместимой с будущей возможностью работы фоновых процессов.

Можно ли запустить функцию как отдельное приложение? Вы можете иметь своего рода «демон» с меньшим количеством ресурсов, работающих в фоновом режиме (ежечасная вибрация, запрос статуса телефона ...) и взаимодействующих с «лаунчером» GUI.
Пока такой возможности нет, но я планирую это сделать.

Как посмотреть журнал устройства? Я вижу, у вас есть отладочные отпечатки в исходном коде приложения календаря, но вы не можете понять, как их использовать.
Кроме того, спасибо @AlexJey для LikeApp, до сих пор мне это очень понравилось.
Журнал часов можно загрузить при помощи LikeApp в меню Отладка - кнопка "Fetch device debug log", затем файл логов будет доступен в вашем телефоне Карта памяти/Android/data/org.likeapp.likeapp/files

@AlexJey молодец, мне тоже нравится LikeApp 😉
 

en_rov

Друг форума
Сообщения
34
Реакции
100
Баллы
18
Ваше "умное" устройство
Amazfit Bip
Спасибо, @MNVolkov. Я вернусь с дополнительными вопросами, когда вернусь к расширению библиотеки. Также я хотел предупредить других о следующем:

Вот что происходит, когда вы просто перезагружаете часы, открываете приложение и рисуете текст с помощью text_out_center () без предварительного вызова load_font (). Я предполагаю, что ОС автоматически загружает шрифт при открытии уведомления, но только частично - первая запись была URL-адресом, который не содержал букв, которые могли быть причиной сбоя. У меня не было возможности измерить оперативную память до и после выдачи команды, было бы интересно и, возможно, полезно выгрузить шрифт, чтобы было больше места для графических операций. В какой-то момент я планирую наложить слои, так что это может помочь в играх с динамически прорисованной графикой, а не на ресурсной основе, как это может быть в Sokoban. К сожалению, у нас нет исходного кода, поэтому мы не можем сказать.

Я хотел бы создать игру, чтобы продемонстрировать потенциал моей платформы. С чего начать? Я принимаю и спрашиваю предложения.

- Крестики-нолики (2 игрока / процессор)
- Подключите четыре
- Тамагочи / Pixel Miner - мне нужны люди, чтобы помочь мне в этом.

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

Thank you, @MNVolkov. I will be back with more questions when I will get back to expanding the library. Also I wanted to warn others about the following:

Here is what happens when you have just rebooted the watch, you open the application, draw text with text_out_center() without calling load_font() first. I guess the OS automatically loads the font when opening a notification, but only partially - the first entry was an URL which didn't contain letters, which could be the cause of the glitch. I did not have the chance to measure RAM before and after the command is issued, it would be interesting and maybe useful to unload the font to have more space for graphics operations. I plan on having layer stacking at some point, so this could help in games with dynamically drawn graphics and not resource-based as Sokoban may be. Unfortunately, we don't have the source code, so we can't tell.

I would like to create a game to show off the potential of my framework. Where do I start? I accept and ask for suggestions.

- Tic Tac Toe (2 player/CPU)
- Connect Four
- Tamagotchi/Pixel Miner - I need people to help me for these.
 

Вложения

Последнее редактирование:

en_rov

Друг форума
Сообщения
34
Реакции
100
Баллы
18
Ваше "умное" устройство
Amazfit Bip
Для того, чтобы все было в движении, я на прототипе печатал на бумаге метод ввода дерева типа третичного текста.

Не обращайте внимания на часть перевода приложения, третичный текст - это метод ввода с открытым исходным кодом (

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

) для часов Pebble, который используется приложением в видео.

Вот что у меня так далеко:

1585428749440.png

Здесь с 4 кнопками:

1585429378916.png

Или вы можете иметь 6 кнопок, как с демо. Я не знаю, что ты думаешь? С 6 кнопками это два нажатия на букву, с другой вам нужен дополнительный кран.

1585430199002.png

Keeping things moving, I've been prototyping on paper a Tertiary Text-like tree input method. Here is what I have so far:

Ignore the translation part of the app, tertiary text is the open source (

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

) input method for Pebble watches that the app in the video uses.


1585428749440.png

Here with 4 buttons:

1585429378916.png

Or you could have the 6 buttons as with the demo. I don't know, what do you think? With 6 buttons it's two taps per letter, with the other you need an additional tap.
1585430206548.png
 
Последнее редактирование:

General1111

Участник
Сообщения
83
Реакции
85
Баллы
33
I would like to create a game to show off the potential of my framework. Where do I start? I accept and ask for suggestions.

- Tic Tac Toe (2 player/CPU)
- Connect Four
- Tamagotchi/Pixel miner
Крестики-нолики самая простая игра,
Четыре в ряд наверное сложно будет попадать в ячейки 6*7,
Pixel miner наверное самая интересная будет...
 

Пользователи, просматривающие эту тему

Сверху Снизу