BambuLed.A1M: progress-screen
Захотелось красот, и, следовательно всяческих иконок.
Немножко фотошопа, немножко кодинга...
Запускаем печать.
Кстати, тут сразу видно, какую пластину мы задали в слайсере. Периодически, при смене филаментов, по дефолту выставляется не то, что надо. Теперь - сразу видно что и где.
Принтер проходит просто через кучу промежуточных состояний.
Что-то греет постоянно, что-то остужает...
И чего-то ждёт...
Наконец-то печать!
Телеметрия чуть попроще, чем у Шаттла.
export const STG_CUR: Record<number, string> = {
[-1]: 'idle',
0: 'printing',
1: 'auto bed leveling',
2: 'heatBed preheating',
3: 'sweeping xy mech mode',
4: 'changing filament',
5: 'm400 pause',
6: 'paused filament runout',
7: 'heating hotEnd',
8: 'calibrating extrusion',
9: 'scanning bed surface',
10: 'inspecting first layer',
11: 'identifying build plate type',
12: 'calibrating micro lidar',
13: 'homing toolHead',
14: 'cleaning nozzle tip',
15: 'checking extruder temperature',
16: 'paused user',
17: 'paused front cover falling',
18: 'calibrating micro lidar',
19: 'calibrating extrusion flow',
20: 'paused nozzle temperature malfunction',
21: 'paused heat bed temperature malfunction',
22: 'filament unloading',
23: 'paused skipped step',
24: 'filament loading',
25: 'calibrating motor noise',
26: 'paused ams lost',
27: 'paused low fan speed heat break',
28: 'paused chamber temperature control error',
29: 'cooling chamber',
30: 'paused user gcode',
31: 'motor noise showoff',
32: 'paused nozzle filament covered detected',
33: 'paused cutter error',
34: 'paused first layer error',
35: 'paused nozzle clog',
255: 'idle',
};
Но пишет не про все состояния, почему-то... Многое остаётся где-то "за кадром".
Думаю, что еще через неделю-две у меня получится "коммерческий продукт"... А затевалось всё как "слепить за пару вечеров простенький монитор состояний"...
Самое забавное, что у принтера есть широчайший спектр всевозможных ошибок. Казалось бы: можно определить абсолютно всё, что с ним происходит в любой момент времени.
Периодически ищу эти коды и добавляю в базу. Сейчас есть около 6000 (шесть тысяч карл!) кодов ошибок и при этом в группах я каждый раз натыкаюсь на новые коды и на "Неизвестная ошибка".
Видимо, эта задача не решается в принципе. Бамбуки просто каждой ошибке присваивают очередной код и не парятся. Иначе я не могу понять, как это работает...
Троллинг какой-то.
BambuLed.A1M: idle-screen
Свободный объем диска
Уровень сигнала
Температура сопла-стола, скорость кулеров
Последний напечатанный файл
Тип филамента, диаметр сопла
Кол-во проектов, вес/длина филамента, суммарное время печати
Использованные типы пластиков
Постинг в ТГ выключен
Дисплей висит на COM5
Что бы посоветовали улучшить убрать добавить?
BambuLed.A1M: сбор статистики
Разрабатываю аппаратно-программный виджет для мониторинга состояний принтера. Подключается к компьютеру через USB и получается выделенный микро-монитор.
Одна из стадий проекта:
Чтение SD карты "Bambu Lab A1 mini" по локальной сетке через WiFi по FTP.
Первичный парсинг метаданных из .3mf файлов. Сбор начальной статистики.
В дальнейшем полученные значения с каждым новым файлом (печатью) будут аккумулироваться в базе данных.
Как создать скринмейт для андроид-смартфона в программе Android Studio? +виджет бонусом
UPD:
ВАЖНОЕ!
Все файлы и папки проекта, должны лежать в папке "personaz".
Если вы скачали архив проекта из ОблакоМэйл, то переименуйте папку "ulitka_widget"(в которой по умолчанию лежат файлы проекта) в папку "personaz"!
Т.е файл settings.gradle.kts, и все лежащие с ним файлы и папки, должны находиться в папке с названием "personaz".
Потом, папку "personaz" и надо открывать в AndroidStudio при нажатии "Open Project"
Иначе приложение будет иногда вызывать ошибки, и неправильно работать!
Как создать анимированный скринмейт для андроид-смартфона в программе Android Studio, используя готовый проект для программы (код и т.д уже есть там)?
В комплекте к скринмейту, идет виджет с его изображением, который по клику открывает меню настроек скринмейта.
Скринмейт-это персонаж, который ползает или стоит поверх интерфейса операционной системы и окон программ, а при нажатии на него проигрывается другая анимация, или даже звук и т.д.
Персонажа можно перемещать по экрану, зажав его пальцем пи перемести в в другую место экрана.
ИНСТРУКЦИЯ.
ПОДГОТОВКА:
Скачиваем программу разработки Android Studio:
https://developer.android.com/studio
Скачиваем с ГитХаб архив моего готового проекта:
https://github.com/agmioli/screenmate_android/
Или с ОблакоМэйл:
https://cloud.mail.ru/public/pGyG/ygz5sYfT7
Примечание!
Чтобы попасть быстро в папку проекта в Android Studio для создания или редактирования файлов, нужно:
- в правом верхнем углу выбрать вид Android.
- затем в нижней структуре кликнуть правой кнопкой на нужный файл или папку, и выбрать Open in - Explorer.
Как воспользоваться готовым проектом скринмейта для андроид-смартфона в AndroidStudio?
1. Распакуйте содержимое архива в отдельную папку.
Или скачиваете к себе на компьютер все эти файлы, в одну папку.
2. Запустите программу АndroidStudio , и там выберите пункт File-Open project
3. Заходите в папку, где лежат все эти файлы, и нажимаете Select folder
Обязательно ждите, смотря на них окна программы, чтобы все библиотеки т.д прогрузились, и процесс потом сам прекратился.
Иначе проект не сможет работать!
4. В папке по пути ulitka_widget\app\src\main\res\drawable замените графические файлы на свои.
5. Чтобы собрать установочный apk-файл для смартфона, выберите Build - Generate App Bundles or APKs - Generate APKs.
6. В нижнем правом углу появится уведомление, на котором надо успеть нажать на слово "Locale"
7. Откроется папка с apk-файлом, который можно запустить на смартфоне.
8. Запустите apk-файл на смартфоне, выбрав пункт "Все равно установить без проверки", развернув в меню проверки список.
9. Откроется Окно "Всегда сверху", поставьте там галочку напротив вашего приложения, чтобы приложение могло запустить персонажа поверх всех окон, получив разрешение от системы.
9. Когда установите приложение, запустите его. После запуска приложения появится персонаж в нижней части экрана.
10. Найдите значок установленного приложения в меню, и зажмите его.
11. Появится меню где можно выбрать пункт Настройки, чтобы повернуть, отразить, скрыть и показать персонажа, и задать его размер.
12. В этом же контекстном меню, есть слово "Виджет", нажмите на него. Из появившегося окна, перетащите изображение персонажа вне окна, на ваш рабочий стол.
13. Сам виджет можно перетаскивать на разные страницы вашего рабочего стола. Если кликнуть на виджет-он откроет то же меню "Настроек персонажа".
Сам виджет будет украшать ваш рабочий стол, даже когда сам персонаж будет вами скрыт.
ИЗМЕНЕНИЕ НАЗВАНИЯ ПРИЛОЖЕНИЯ!
Название приложения определяется в файле res/values/strings.xml (и возможно в локализованных версиях).
Найдите строку с именем app_name и измените её:
xml
<resources>
<string name="app_name">Новое имя приложения</string>
<!— остальные строки —>
</resources>
После этого в манифесте (AndroidManifest.xml) у тега <application> обычно стоит ссылка на эту строку:
xml
<application
android:label="@string/app_name"
... >
ИЗМЕНЕНИЕ ИКОНКИ/ЗНАЧКА ПРИЛОЖЕНИЯ
Шаг 1. Откройте мастер создания Image Asset
В Android Studio откройте ваш проект.
В левой панели Project выберите вид Android (обычно он выбран по умолчанию).
-Щёлкните правой кнопкой мыши по папке res.
-В контекстном меню выберите New → Image Asset.
-Откроется окно Configure Image Asset.
Шаг 2. Выберите тип иконки
В верхней части окна есть выпадающий список Icon Type. Для иконки приложения выберите:
Launcher Icons (Adaptive and Legacy) – рекомендуется для современных версий Android (8+). Создаёт и адаптивную иконку (слой фона и переднего плана), и обычную (legacy) для старых устройств.
Legacy Launcher Icons – только обычные PNG-иконки для старых версий (без адаптивности).
Если вы не уверены, оставьте первый вариант – он универсален.
Шаг 3. Укажите исходное изображение
В разделе Source Asset выберите, откуда взять картинку для иконки:
Image – выберите файл PNG, JPG или векторный XML на вашем компьютере (кнопка ... рядом с полем Path).
Шаг 5. Сгенерируйте иконки
Нажмите кнопку Next (если доступно) или Finish.
Android Studio создаст (или перезапишет) файлы в папках:
res/mipmap-hdpi/ic_launcher.png
res/mipmap-xhdpi/ic_launcher.png
res/mipmap-xxhdpi/ic_launcher.png
res/mipmap-xxxhdpi/ic_launcher.png
res/mipmap-anydpi-v26/ic_launcher.xml (адаптивная иконка)
аналогично для ic_launcher_round, если вы выбрали адаптивную.
Все старые файлы будут перезаписаны. Если у вас есть свои кастомные иконки с другими именами – они не тронуты.
Шаг 6. Проверьте манифест
Откройте AndroidManifest.xml и убедитесь, что у тега <application> прописаны:
xml
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
Если вы не меняли имя, то всё уже должно быть правильно.
Шаг 7. Соберите и установите приложение
Нажмите Build → Rebuild Project (или просто запустите приложение).
Удалите старую версию с устройства (чтобы точно обновить иконку на рабочем столе) и установите новую.
Теперь новая иконка будет отображаться в лаунчере.
ДОПОЛНЕНИЕ!
Еcли вы что-то не поняли, то вы можете в нейросети типа DeepSeek, напечатать свой запрос-вопрос, попросив в описании пошагово и подробно, вам расписать ответ или инструкцию.
В запросе указывайте версию AndroidStudio, чтобы нейросеть лучше могла понять среду разработки.
Сервис для общения: добавил отображение дат
Неделю не было новостей по сервису для общения. Пора это исправить!
В моих планах было перейти к обмену сообщениями: отправка, прием, запись в БД, отображение пришедшего сообщения. А еще была маленькая задачка - зафиксировать иконку даты в истории переписки. До этого я просто добавил даты и вроде как дело осталось за малым: просто зафиксировать одну из дат в верхней части истории. Ну и началось. Кто же знал что будет непросто 😂
Вот так в итоге работает отображение дат в окне переписки:
Что пришлось для этого сделать?
Вообще, в Flutter есть такая вещь как виджеты и благодаря им даже новички из коробки могут создавать достаточно сложные вещи в Flutter. Это что-то типа куба в Unity: открываешь сцену, кидаешь куб и думаешь, что сейчас как сделаешь супер-игру, как она всем понравится... А потом оказывается, что это была рекламная кампания и чтобы сделать действительно что-то производительное, придется в тонкостях разбираться что и как работает:
Это уже по опыту говорю, писал TotalReload, знаю как и что там работает:
Виджеты предоставляют широкий спектр возможностей и с их помощью можно было бы сделать систему дат, но с ограничениями. Есть такая вещь как Sliver, он позволяет удобно реализовывать сложные интерфейсы взаимодействия. Sliver-ов великое множество и вроде как они покрывают почти все потребности разработчиков.
Возникла проблема. Готового решения я не нашел. Да и нет его похоже. Пытался прикрутить имеющееся стандартное решение (помним, что визуально это не то, что нужно), но и готовое решение приколхозить нормально не получилось из-за имеющихся багов. Чтобы не быть голословным, вот:
Ссылка №1 на Git с багом
Ссылка №2 на Git с костылем
Ссылка №3: разработчики поднимают эту тему
Прозрачный AppBar и исправление бага - это уже уникальный интерфейс 😂😂😂
Про костыль: при открытии чата нужно пролистать список сообщений в самый низ. Понятно что список загружаю не весь, а только N последних сообщений. Вот их-то и требуется пролистать вниз.
Но из-за бага нельзя узнать сразу значение низа, то есть высоты всего списка. А получить его можно через кадр. В итоге разработчики сделали такой незаметный костыль: список пролистывается до максимального значения(но не до конца), а потом анимацией список докручивается до низа и по мере прокрутки Flutter обновляет максимальное значение для пролистывания. Чудо-код, который это умеет и работает стабильно:
Но это решение, очевидно, плохое. Открываешь чат, а он что-то листается куда-то... В итоге пришлось разбираться как решить эту проблему. Ведь если нельзя, но очень нужно, то все же что-то придумать можно 😂
А советчики этого костыля могут сами им и пользоваться:
Решение
Решение достаточно веселое. Flutter - это некая кроссплатформенная система рендера, которая управляет процессом отрисовки. Очень грубо, очень по рабоче-крестьянски, но в самом первом приближении это так. Система работает на основе деревьев. И на любой вопрос типа: почему используются деревья, зачем системе рендера кэш и границы, зачем система разделена на элементы и переиспользует их... ? На все это примерно один ответ - чтобы для пользователя интерфейс быстро работал.
Еще стоит отметить, что управлять тем, что выводится на экране можно с нескольких абстракций.
(1) Самый верхний уровень - виджеты. Это буквально готовые кирпичики, берешь и используешь. Глубокого погружения в тонкости рендера не требуется. Первое приложение можно написать ничего не зная.
(2) Далее идет CustomPaint. Это виджет, который умеет на себе рисовать. Что-то типа приложения Paint: берешь холст и рисуешь примитивы. Им отрисованы градиенты окошек сообщений. По сути это продвинутый виджет, сложность понимания принципа работы примерно как с виджетами.
(3) RenderObject - это уже интереснее, это то, как все рисуется в Flutter. И сложность понимания внезапно поднимается до "нужно понять как все тут устроено". Отмечу, виджеты уже сами в себе содержат механизм RenderObject, но от пользователей он скрыт. Если вдруг потребуется сделать такой виджет, которого нет среди стандартных виджетов, то придется разбираться, как устроена система рендера и используя ее собирать свой собственный виджет. Собственно этим я и занимался. Пришлось сделать виджет, который визуально умеет делать все то, что делает стандартный SliverStickyHeader от Flutter. Но важно: костыли нужно убрать, AppBar нужен прозрачный.
Теперь даты красиво ездят туда-сюда, вроде эстетично и глаз радуется :)
Далее работаю над отправкой и приемом сообщений.
--
По вечерам разрабатываю сервис для общения. Кому интересно, можете подписаться куда-нибудь на меня, попробуете его в числе первых.
Постепенно буду продолжать делиться успехами разработки сервиса.
Уникальные механики превращения из игр на Денди
Размышляя о разных любопытных механиках старых платформеров, меня почему-то зацепила механика превращения главного героя и то, как разработчики задействовали эти возможности для прохождения миссий. Вспоминая о своих любимых играх на Денди, я выделил 4 проекта, где механика превращения вызывала интерес и побуждала проходить миссии, используя разнообразные формы героя. Да, не во всех играх у нас был выбор форм, но практически во всех внешний облик героя позволял проходить уровень разными способами.
Felix the Cat
Игра по известному в США мультсериалу (хотя и у нас его крутили). Несмотря на то, что про Кота Феликса вышла всего одна игра на Денди, зато какая! Здесь ситуация схожая с Чёрным Плащом — вышла всего одна игра, но потрясающая. Felix the Cat — хирургически точно выверенный платформер с простой и понятной механикой, не имеющей ничего лишнего. Просто идеальная игра. В основе прохождения лежит превращение нашего кота в улучшенные версии себя для успешного преодоления препятствий. Можно, конечно, и не превращаться — не собирать заветные сердечки с буквой «М», но тогда спасение возлюбленной Китти может изрядно усложниться.
На суше Феликс начинает без всего, но с огромной боксёрской перчаткой, которой сбивает врагов в ближнем бою. Забавно, но в детстве я думал, что красный шар, которым Феликс бьёт врагов, — это огромный пузырь жвачки. Если присмотреться, кот и вправду что-то жуёт. Следующая стадия — фокусник. Феликс превращается в комедианта, который смеётся над своими шутками и распространяет вокруг себя звёздочки, калечащие врагов. Да, плохой юмор и вправду может причинять боль, ментальную. Следующая стадия, как сказал бы Якубович: «А-а-а-а-а-втомобиль!». Кот перестаёт быть пешеходом и садится в машину, и не смотрите, что у него лапки — водит получше людей. Кстати, эта форма мне нравится больше всего, потому что машинка стильная и удобно стреляет. Четвёртая форма — танкист — мне не очень нравилась из-за того, что снаряд танка стреляет по дуге и становится сложно попасть по монстрам вблизи, хотя он аннигилирует всех с одного выстрела.
В воздушной и водной стадии были свои формы, но на них не будем останавливаться.
В игре Felix the Cat нельзя сказать, что превращения героя — прям такая уникальная механика, но она вписана очень органично. В виде здоровья выступают формы кота — если вдруг какая птичка или ящерка вас куснёт, то Феликс не умирает сразу, а просто откатывается на следующую ступень формы, до самой первой. Причём вы можете даже специально не брать улучшения и проходить игру в той форме, которая вам нравится больше всего, если руки на месте — игра не сложная.
Super Mario Bros 3
Super Mario Bros. 3 — одна из самых революционных игр на Денди. Та, что, пожалуй, выжимает все соки из приставки, дарит нам огромный мир и его секреты. Только здесь мы покоряем гигантские летающие корабли, а в последнем мире сражаемся с милитаризованной армией Боузера, противопоставляя танкам, пушкам и артиллерии свои оранжевые огоньки.
В Super Mario Bros. 3 механика превращения крайне важна, потому что без неё адекватный игрок не станет проходить игру. Если в первой части у нас были в основном грибочек и цветочек для обретения новых сил героя, то здесь арсенал превращений заметно возрос на все случаи жизни, и более того, Марио и Луиджи теперь могут копить силы, чтобы воспользоваться ими перед миссией. Чувствуете, что впереди жара, — съедайте цветочек или, ещё того круче, примеряйте костюм ниндзя (это я так назвал Hammer Suit) и кидайте смертоносные молотки. Иногда имеет смысл даже просто пройти несколько миссий под одним грибом, чтобы не тратить другие усиления. Всё, что Марио накопит за игру, очень пригодится в последнем, адском мире, где огонь и взрывы гремят не замолкая.
В игре сокрыто множество секретов, которые раскрываются при повторном прохождении со специальными формами. Вообще, костюм енота — самый полезный, так как при разгоне он может взлетать на короткое время, взмахивая хвостиком, и занести вас в труднодоступные места и секреты на карте. Поэтому имеет смысл чаще всего путешествовать в виде енота, чтобы собирать больше монеток.
Widget
Про игру Виджит я уже писал. Но, всё-таки, здесь тоже есть превращения, и они филигранно вплетены в канву прохождения.
Наш фиолетовый инопланетянин любит, умеет и практикует превращаться во всяких странных существ — в этом его суперсила. Однако на старте есть условность, ограничивающая наши силы. Во-первых, превратиться в тираннозавра и прочих убийственных существ не получится, во-вторых, Виджит должен с кровью и потом отрывать новые формы у злых боссов, раскинутых по планете. Лишь пройдя все миссии, он откроет все пять форм и сможет использовать их на полную катушку для решения головоломок и поднятия всех бонусов на пройденных миссиях.
Именно перепрохождение миссий с уже открытыми формами и является интересной механикой игры, которая задействует силу превращений. Открыть все секреты и новую мощь оружия, протиснувшись вот в ту норку, — незабываемые ощущения.
Ninja Cat (Kyattou Ninden Teyandee)
Просто Коты-ниндзя. Несмотря на глупое название, игра захватывает практически сразу. Любопытно, что здесь нельзя погибнуть, свалившись в пропасть, — в игре нет смертельных ям, и любое падение просто ведёт на другой игровой экран.
В отличие от всех прочих перечисленных нами игр, где превращения набирались по ходу прохождения или открывались после победы над боссом, здесь превращения с нами всегда, и мы в любой момент можем обратиться другим вспомогательным котом помимо главного героя. Лишь главного героя нельзя сменить — его мы выбираем в начале миссии.
Во время игры мы можем неограниченное количество раз обернуться одним из четырёх помощников: отличным пловцом, летуном, бурильщиком тоннелей и камнедробителем. Как видно из их призвания, коты эти нужны в строго отведённое время для препятствий, которые не сможет преодолеть главный герой. Самым суровым выглядит тот, кто разбивает огромные булыжники, — попробуйте только заикнуться, что у него лапки. Помощники, в принципе, и сами драться могут, но не с таким огоньком, как главный убер-кот. Кстати, не забываем, что даже за простое задействование сил требуется энергия. И без энергии ваши помощники даже песчинку не сдвинут.
В итоге Ninja Cat прекрасен тем, что для преодоления препятствий мы задействуем или не задействуем свои превращения — можем, например, плавать топориком, но не превращаться. Правда, в некоторых местах всё же помощь будет необходима. Комбинируя силы разных котов, проходим уровни разными путями и разными кошачьими тропами. А может, чем чёрт не шутит — вообще пройдём игру вспомогательными котами, не превращаясь обратно в главного героя.
































