Инструкция Bip | Разработка приложений для BipOS ( SDK )

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
  • Первое сообщение
  • #1
Разработка приложений для BipOS
Software Development Kit (SDK)
MNVolkov BipOS

Вводная часть
Начиная с версии 0.5 MNVolkov MOD полностью переработан код запуска приложений. Теперь каждое приложение - это отдельный файл, хранящийся в ресурсах. Формат исполняемых файлов Arm-elf (или просто "эльф"). Мод получил новое название BipOS. При запуске меню мода происходит сканирование ресурсов на наличие приложений. Для каждой прошивки разное количество ресурсов, а приложения всегда размещаются в конце. Поэтому загрузчик ищет ресурсы по сигнатуре Elf начиная с 930 ресурса. Из найденных приложений формируется список, который помещается в меню "приложения".
Для того чтобы повысить общее удобство и снизить количество несовместимостей разработана система "прошивконезависимых" приложений. Так один и тот же Калькулятор будет работать как на латин 1.1.5.12, так и на нелатин 1.1.2.05. без изменений (необходимо только разместить его в RES файле соответствующей версии). Независимость от прошивки удалось достигнуть за счет применения универсальной библиотеки libbip.a которая содержит адреса функций прошивки. После загрузки эльфа в оперативную память происходит пересчет внутренних адресов функций и переменных т.н. релокация, а так же подмена библиотечных адресов функций на реальные адреса функций в прошивке.

Среда разработки
Для разработки приложений понадобится среда разработки и компилятор. В качестве среды разработки я использую обычный Notepad++ . Наверное, можно настроить Code::Blocks или другую IDE я до этого не дошел, отложил на будущее. Установка специализированной IDE конечно повысит удобство разработки. На среде разработки останавливаться не буду.

Компилятор
Для сборки приложения я применяю GNU Embedded Toolchain for Arm. Для установки необходимо проделать следующие шаги:
  1. Скачать тулчейн можно тут:

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


    Качаем файл gcc-arm-none-eabi-8-2019-q3-update-win32-sha2.exe ( или более свежую редакцию) с таким описанием: Windows 32-bit Installer (Signed for Windows 7 and later)
  2. Можно все установить по умолчанию, в конце установки установить все галочки
  3. Рекомендуется добавить в системный (не пользовательский) PATH путь до папки bin компилятора
Библиотека
Библиотека включает в себя как адреса функций прошивки, так и некоторые функции, которые написаны для облегчения разработки пользовательских приложений, например функции работы с меню. Библиотеку необходимо распаковать в папку на одном уровне с папками приложений. Путь до этой папки будет указан в сценарии сборки.

Актуальная версия библиотеки на GitHub -

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



v.0.5.5
У вас нет разрешения на просмотр содержимого!



BipEmulator от @x27 - Эмулятор окружения BipOS для часов Amazfit Bip, предназначенный для написания и отладки приложений под управлением мода BipOS (0.5.X) в среде Microsoft Visual Studio 2019

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



Пример приложения
Специально для облегчения вхождения подготовлен пример приложения на языке СИ template_app. Функционал простой: создается рабочий экран приложения, при нажатии в центр экрана меняется цвет фона и надписи.
Этот пример можно использовать в качестве шаблона. Для этого нужно создать новую папку приложения и скопировать в неё файлы примера. Наименование папки приложения в скрипте сборки берется в качестве служебного имени приложения.
Отображаемое в списке приложений наименование необходимо внести в файл label.txt При этом после наименования не должно быть каких либо символов или перевода строки.
Для сборки приложения подготовлен bat файл. Сборка осуществляется путем запуска bat файла внутри папки без параметров. Все параметры компилятора и линковщика совместимые с загрузчиком BipOS внесены в этот скрипт.
Приложение-шаблон:
У вас нет разрешения на просмотр содержимого!

Исходники на GitHub

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



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



Сборка RES файла и загрузка в часы
Для запуска эльфа необходимо загрузить его в часы. Для этого необходимо поместить его в RES файл. Для сборки RES файлов разработана специальная программа для ПК (Win32) с помощью которой можно добавить в ваш существующий RES файл необходимые приложения. ResPack.exe - это консольное приложение для выполнения простых операций с RES фалами Amazfit Bip: отображение содержимого с краткой информацией по каждому ресурсу, распаковка сырых данных ресурсов, выполнение выравнивания строковых ресурсов версии 61 и 69 для решения проблемы пропадания текста при загрузке кастомных ресурсов, а также добавления произвольных файлов в ресурсы.
Для добавления в существующий RES файл файлов приложений запускаем из командной строки:
Код:
ResPack -a <выходной_RES_файл> <входной_RES_файл> файлы которые надо добавить
Полученный RES файл прошивается в часы обычным способом, например, через GadgetBridge. Для обновления данных в оперативной памяти часы после обновления ресурсов необходимо перезагрузить. Сделать это можно либо через меню настроек выключив и включив часы.
У вас нет разрешения на просмотр содержимого!


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


Обсуждение процесса разработки ведется в этой теме.
 

Вложения

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

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
@maxgrom, хм, подумал вот сейчас... Возможно вы говорите о постоянной проверке состояния сенсора внутри программы, но по идее это реализовано внешними прерываниями - происходит касание сенсора = вызывается оьозначенная заранее функция, она обрабатывает касание, а после выполнение возвращается туда, где было выполнено прерывание. Еади это так, то не проще ли внутри мэйна проверять состояние определённых переменных, значение которых и будет задаваться при вызове сенсором оговоренной заранее функции? Это так, наброски, возможно натолкнут на правильный путь) Сам пока ничего не писал, успел только изучить пример, метод компиляции и работу с ресами...
Авто объединение сообщений:

Кстати, извиняюсь за скрины выше без спойлеров, совсем о них забыл ?
Пожалуй стоит пойти почитать правила форума ?
 
Последнее редактирование модератором:

kdchien

Участник
Сообщения
56
Реакции
14
Баллы
48
Ваше "умное" устройство
Amazfit Stratos
У меня ошибка при запуске командного файла build.bat: faltal ошибка: libbip.h: нет такого файла или каталога
#include <libbip.h>
Где я могу разместить каталог lipbip.h или libbip?
 

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
Тот же AmazfitBipTools после разбора видимо конвертирует вытащенное в png...
Да верно, я просто сырые данные вытаскиваю, не ставил себе целью полноценный редактор ресурсов делать, просто перепаковщик пока. Возможно доработаю потом.
А еще вопросик по ResPack - может ли он собирать папку в res? И если да, то как, вроде по аргументам нет такой функции
Ну или хотя бы заменять уже встроенный файл, а не добавлять новый...
Пока такой возможности нет.
мне надо использовать сенсор в int main(){}
Это противоречит модели работы. единственная цель функции main вызов show_screen. Никаких бесконечных циклов в ней запускать нельзя.
 

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
Начну небольшое описание работы операционной системы для общего понимания принципов работы.

Жизненный цикл экрана приложения
Часы работают под управленим операционной системы с вытесняющей многозадачностью. Т.е. одновременной в часах работают несколько процессов. Все экраны, вся видимая активность часов происходит в процессе DisplayTask. Запускаемый эльф работает в этом же процессе. Поэтому для обеспечения плавной работы, без лагов и жора батарейки необходимо соблюдать условие: все пользовательские функции должны как можно быстрее отработать и вернуть управление процессу DisplayTask. И уж тем более нельзя устраивать бесконечный цикл в функции main (как в Arduino).
Жизненный цикл экрана приложения начинается с передачи управления функции, создающей данный экран. Условно она называется void show_screen (void *param0) (здесь и далее буду использовать имена функций как в template_app.c). Функция выполняет свои действия и возвращает управление процессу. Ключевое действие для создания экрана вызов системной функции reg_menu c указателем на структуру экрана struct regmenu_. Данная структура содержит указатели на функции обработчики системных событий, таких как события тачскрина (нажатия, свайпы), нажатия на кнопку, долгое нажатие на кнопку, срабатывание таймера экрана, вызов экрана после работы оверлейного экрана.
Для сохранения данных нашего приложения имеются две глобальные переменные temp_buf_1 и temp_buf_2.

temp_buf1 - используется только для временного хранения данных между колбэками экрана, при условии, что данные в указателе легко могут быть воссозданы функцией show_menu_... экрана. Могут быть уничтожены и память по данному указателю может быть высвобождена в любой момент при поступлении уведомления или звонка (reg_menu с параметром overlay 1). Можно использовать как переменные отображения текущего экрана, например позиция курсора, номер анимации для screen_job и т.д.

temp_buf2 - может использоваться как для хранения данных созданных в функции show_menu_... так и переданных от предыдущего экрана. Можно использовать для хранения данных с которыми работает данный экран: редактируемый будильник, набираемый текст и т.д. Здесь следует хранить данные приложения, включающие указатель на данные запущенного процесса. Вообще можно здесь хранить и те данные которые можно хранить в temp_buf_1 если удобно.
Необходимо помнить, что при вызове системной функции reg_menu высвобождается память по обоим указателям temp_buf_1 и temp_buf_2. Это позволяет избавиться от утечек памяти при переключении различных экранов меню часов.

Функция main
Назначение данной функции исключительно передача управления функции show_screen с сохранением всех параметров. Её по-хорошему не надо было использовать, но с её наличием просто меньше костылей, так мне было сделать проще.

Функция show_screen
Назначение функции show_screen подготовка данных экрана, выделение необходимых объемов памяти, построение графической части, настройка всех колбэков. Данная функция получает управление в двух случаях:
1. Когда она вызывается из другого экрана, например из меню "Приложения". В этом случае в качестве параметра param0 пердается указатель на структуру запущенного эльфа типа Elf_proc_
2. Когда она вызывается по окончании выполнения оверлейного экрана (такие как входящий звонок, уведомление, требование подвигаться и т.д.). Тогда в этом случае в качестве параметра передается указатель на выделенную память рассматриваемого экрана, содержащийся по адресу temp_buf_2.

В теле функции show_screen необходимо настроить обработчики создаваемого экрана при помощи функции reg_menu.

Функция dispatch_func
Эта функция является обработчиком событий тачскрина. Она вызывается операционной системой каждый раз когда происходит одно из следующих событий: нажатие на экран, один из четырех свайпов вверх, вниз, влево, вправо. Параметром функции является указатель на заполненную структуру данных типа struct gesture_. После обработки необходимо сделать возврат return. В случае прорисовки графических элементов экрана необходимо их копирование из видеопамяти в дисплей.

Функция key_press_func
То же что и dispatch_func но для события кратковременное нажатие на боковую кнопку. Функция не имеет параметров.

Функция long_key_press_func
То же что и dispatch_func но для события длительное нажатие на боковую кнопку. Функция не имеет параметров.

Функция screen_job
Эта функция является обработчиком срабатывания таймера экрана. Вызывется по истечении временного интервала таймера, длительность которого задается функцией set_update_period. Функция screen_job не имеет параметров. В случае прорисовки графических элементов экрана необходимо их копирование из видеопамяти в дисплей.

Всё вышеописанное реализовано в прилагаемом примере template_app. Данный пример содержит минимальный набор обработчиков событий, нужно его изучить, я постарался его прокомментировать.
 

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
Если доработаете - софтина будет единственно, которая спокойно будет позволять работать с рейсами версий выше 12))
Вы можете спокойно работать с ресурсами для прошивок 1.1.5.36 и 1.1.5.56 при помощи отличного софта AmazfitBipTools но после сборки RES-файла прогнать его через мой ResPack с ключом -f это восстановит совместимость строковых ресурсов.
 

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
@MNVolkov, шооо, вот это инфа, помню AmazfitBipTool не умел работать с 56,спасибо за наводку. Тогда даже можно скриптик для объединения двух этих софтин намутить, что бы проще было, да и постой выбор нужного функционала для работы с этим всем избегая прописывания в консоль сделать, пожалуй займусь этим, вы не против случаем?)
 

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
Вы можете спокойно работать с ресурсами для прошивок 1.1.5.36 и 1.1.5.56 при помощи отличного софта AmazfitBipTools
То ли вы чего-то не договариваете, то ли я чего-то не понимаю...

AmazfitBipTools последнее обновление получил в августе 18ого года, и даже найденная на данном форуме модификация от @Schakal никак не решает проблему - софт не умеет разбирать сток 56 ресы, так как в них вроде сменили сигнатуры, в общем постоянно пишет это в логи:
Trace|Image 993 offset is 378296...
Debug|Reading image 993...
Fatal|System.ArgumentException: Image signature doesn't match.
Resources.Image.Reader.Read()​
Resources.Reader.Read(UInt32 imagesTableLength)​
Resources.FileReader.Read(Stream stream)​
WatchFace.Program.UnpackResources(String inputFileName)​
WatchFace.Program.Main(String[] args)​

Но допустим вы правы, потому пойду искать рабочую версию, что ли...
Авто объединение сообщений:

Окей, как оказалось видимо проект жив, просто компил последний висит за август 18ого, а значит придется или разбираться как собрать рабочий AmazfitBipTools, или найти уже готовый, просто но битбаккет конечно на дебри какие то похож .-.
Авто объединение сообщений:

К большому сожалению, на текущий момент, в общем доступе нет AmazfitBipTools, который может работать с ресурсами прошивок версий 1.1.5.36 и выше (((
Ооооо, нашел этот пост, да, он от 14 июля, но нигде на форумах ничего дельного нет, может лично у вас просто имеется та самая рабочая версия AmazfitBipTools без общего доступа? XD

Видимо придется собирать из исходников...
Авто объединение сообщений:

Да, а на 12 слезать почему то не охота, хочется новее версию, да и раз вы говорите, что можно - будем пробовать)
 
Последнее редактирование:

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
ЕЕЕЕЕ, так, много черной магии, скроллинга интернетов и отожранные последние гиги на жестком дали свой результат - я собрал нужный AmazfitBipTools из исходников.
Да, вот он теперь может спокойно работать с 56, но встает вопрос - а им теперь можно делиться? Вообще можно ли такое рассказывать? ?:confused::confused: Ибо нигде никто не писал, что если нужен рабочий AmazfitBipTools для версий выше 12 - скачай там то или иди и сам собирай из исходников...

Оффтоп Хотя сейчас есть некая детская радость, влез в дебри языка и софта, которые не знаю - получил результат, класс)


Кстати, он спокойно разбирает и ресы от BipOS с приложениями, просто выкидывает их в ту же папку в виде dat

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

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
Оффтоп Так, все работает. Теперь, пожалуй, пока только для себя, займусь скриптом для объединения ResPack и AmazfitBipTools.
Ну и постараюсь задать вопрос на счет обновления AmazfitBipTools автору.


Но все же интересует - как он у вас, уважаемый @MNVolkov, изначально рабочий с версиями выше 12 появился, не поделитесь секретом?)
 

Alur

Друг форума
Сообщения
46
Реакции
66
Баллы
58
Ваше "умное" устройство
Amazfit Bip
Зачем у автора спрашивать? Это ж опенсорс. Держите.
Уверены? Я то его уже даже в exe-шник собрал, но просто все как то странно, хотелось бы личного одобрения)

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

Авто объединение сообщений:

Это ж опенсорс.
Ладно, пожалуй это самый удобный для нас всех вариант)
Оффтоп Да и с автором видимо сложно связаться, хотя в ВК я все же написал


Тогда прикрепляю стоковый и рабочий AmazfitBipTools с последними обновлениями от 11.05.19
⚠ Замечу, файл "PreviewStates.json" был взят из модификации от @Schaka
Авто объединение сообщений:

Все же хочу попросить вас, @MNVolkov, не игнорировать данную информацию, видимо одному человеку она уже помогла...

В итоге с батником для работоспособности сделал это:
1.На 12 строке заменил путь до компилятора;​
2.Вместо энтера между строками 63 и 62 поставил пробел;​
4.Батник не терпит пробелов и кириллицы в пути к компилятору и папке эльфа (ну это нормальное явление);​
@MNVolkov, приложенный в примере build.bat кидает ошибки из-за пункта 2 выше - так ли это у всех? Если да, то думаю стоит перезалить build.bat в примере приложения.
Ну и отдельно стоит отметить где-то в топике инфу про пункты 1 и 4 выше, вещи понятные, но не каждый до них сразу дойдет ¯\_(ツ)_/¯
 

Вложения

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

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
Уверены? Я то его уже даже в exe-шник собрал, но просто все как то странно, хотелось бы личного одобрения)

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

Авто объединение сообщений:


Ладно, пожалуй это самый удобный для нас всех вариант)
Оффтоп Да и с автором видимо сложно связаться, хотя в ВК я все же написал


Тогда прикрепляю стоковый и рабочий AmazfitBipTools с последними обновлениями от 11.05.19
⚠ Замечу, файл "PreviewStates.json" был взят из модификации от @Schaka
Авто объединение сообщений:

Все же хочу попросить вас, @MNVolkov, не игнорировать данную информацию, видимо одному человеку она уже помогла...
Да вы правы необходимо либо правильно указывать путь к компилятору, либо вообще его убрать из батника, при условии что он прописан в PATH.
Вечером попробую батник переделать и перезалить архив.
 
  •  Мне нравится
Реакции: Alur

Rainberd

Новичок
Сообщения
8
Реакции
18
Баллы
23
Ваше "умное" устройство
Amazfit Bip
@MNVolkov, 2 вопроса по SDK:
1. планируется ли дать доступ к функциям FreeRTOS (пока интересуют xTask*/vTask* и xTimer*/vTimer*)?
2. есть ли возможность произвести инициализацию приложения при старте часов, а не при запуске из меню? Чтобы настроить и запустить собственный таймер ОС. Я так понимаю, с этим могут быть сложности, т.к. приложение должно находиться в памяти, а не грузиться по требованию. Если нет - планируется ли такая возможность?
 

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
@MNVolkov, 2 вопроса по SDK:
1. планируется ли дать доступ к функциям FreeRTOS (пока интересуют xTask*/vTask* и xTimer*/vTimer*)?
2. есть ли возможность произвести инициализацию приложения при старте часов, а не при запуске из меню? Чтобы настроить и запустить собственный таймер ОС. Я так понимаю, с этим могут быть сложности, т.к. приложение должно находиться в памяти, а не грузиться по требованию. Если нет - планируется ли такая возможность?
1. Напишите какие функции нужны, постараюсь добавить, не все они уже найдены, но многие.
2. Автозапуск приложений пока не реализован, но в планах есть. Да вы правы если приложение будет запускаться при загрузке часов его необходимо держать постоянно в памяти. Оперативной памяти в часах перед запуском первого приложения, доступной pvPortMalloc около 30кб, каждое приложение отъедает примерно 4-6к (размер сегмента PT_LOAD elf файла). На текущий момент реализована возможность запуска до 5 приложений одновременно. Но практически без функций xTask*/vTask* и xTimer*/vTimer* сделать фоновое приложение невозможно.
 

VitalyK.

Участник
Сообщения
2
Реакции
0
Баллы
41
Тогда прикрепляю стоковый и рабочий AmazfitBipTools с последними обновлениями от 11.05.19
По-моему, не вполне рабочий. Для проверки я разобрал с помощью этого AmazfitBipTools файл MOD_by_trace_1.1.5.36.res.latin из темы Прошивка - Bip | MNVolkov BipOS и потом (ничего не меняя в ресурсах), снова собрал. Файл получился другого размера.
 

MNVolkov

Разработчик
Команда форума
Сообщения
417
Реакции
2,803
Баллы
483
Ваше "умное" устройство
Amazfit Bip
  •  Мне нравится
Реакции: RAA

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу