Mengembangkan InfiniTime, Firmware Sumber Terbuka untuk PineTime

Postingan tamu Wawancara

Hari ini kita akan berbicara dengan Jean-François (JF) Milants, kontributor utama untuk proyek InfiniTime, firmware sumber terbuka untuk jam tangan pintar Pine64 PineTime.

Jean-Francois (JF) Milants

Kontributor utama untuk waktu tak terbatas proyek, firmware sumber terbuka untuk jam tangan pintar Pine64 PineTime.

Twitter: @codingfield

GitHub, Blog

Hai Jean-François, dapatkah Anda memberi tahu kami tentang proyek InfiniTime? Apa itu singkatnya? Bagaimana awalnya?

InfiniTime adalah firmware sumber terbuka untuk jam tangan pintar PineTime. Ini memberikan pemberitahuan, pengatur waktu, alarm, sensor detak jantung, penghitungan langkah, dan beberapa permainan.

Ini dimulai sebagai proyek pribadi ketika Pine64 mengumumkan niat mereka untuk meluncurkan perangkat baru, PineTime, sebagai proyek komunitas. Mereka mengirim kit pengembangan ke pengembang yang tertarik untuk membuat firmware sumber terbuka untuk jam tangan pintar baru ini. Karena bersemangat tentang pengembangan perangkat lunak tertanam, saya melamar dan dengan cepat menerima kit pengembangan PineTime saya.
Jam tangan

Pada awalnya, tujuan saya adalah bereksperimen dengan C++ pada sistem tertanam, dan saya menikmati peretasan dengan kit pengembangan, mencoba menerapkan driver tampilan tercepat dan integrasi dasar BLE (Bluetooth Low Energy).

Komunitas pengembang dan penggemar dengan cepat terbentuk di sekitar proyek PineTime. Kami membahas fungsionalitas, implementasi driver tingkat rendah, dan bootloader, dan kami bereksperimen dengan berbagai bahasa dan kerangka kerja. Saya membagikan kemajuan saya di ruang obrolan komunitas, di Twitter dan di Mastodon, dan banyak orang meminta saya untuk mempublikasikan proyek tersebut.

Banyak pengembang dengan cepat bergabung dengan proyek dan menyumbangkan fitur dan fungsi yang tak terhitung jumlahnya. InfiniTime sekarang menjadi proyek komunitas, dikelola oleh 6 pengembang inti dan lebih dari 100 kontributor dari seluruh dunia!

Pine64 mulai mengirimkan InfiniTime yang di-flash PineTime sekitar Juli 2020, dan kami merilis InfiniTime 1.0 pada April 2021.

Apakah ada komunitas besar yang secara teratur berkontribusi pada proyek?

Mempertimbangkan ceruk jam tangan pintar sumber terbuka yang relatif kecil, saya akan mengatakan bahwa komunitasnya cukup besar. Ini tentu saja cukup besar untuk memberi kami aliran permintaan fitur, ide, dan permintaan tarik yang konstan!

Proyek saat ini memiliki 100 kontributor, 589 garpu, 1.700 bintang Github, 77 PR terbuka, dan 192 masalah/permintaan fitur.

Saya melihat firmware menargetkan Jam tangan pintar PineTime platform. Apakah itu digunakan di tempat lain?

Memang, proyek dimulai sebagai firmware yang ditulis khusus untuk PineTime. Kolaborasi dengan Pine64 benar-benar hebat, karena mereka membuat perangkat keras tersedia dengan harga murah untuk pengembang dan memberikan bantuan dan dukungan kepada komunitas sehingga mereka dapat membangun proyek di sekitar perangkat mereka.

Sekarang, desain perangkat kerasnya sangat mirip dengan jam tangan pintar murah lainnya. Beberapa orang telah melakukan porting ke Colmi P8, misalnya, dan pekerjaan saat ini sedang berlangsung untuk mengintegrasikan perubahan tersebut di InfiniTime.

Ke depan, saya ingin InfiniTime lebih mudah dibawa-bawa di platform lain. Sebagai contoh, saya telah melakukan beberapa percobaan dengan mikrokontroler Bouffalo BL602 RISC-V. InfiniSim, simulator InfiniTime, juga akan mendapat manfaat dari lebih banyak abstraksi perangkat keras.

Smartwatch PineTime didasarkan pada Nordic Semiconductor nRF52832. Bisakah Anda memberi tahu kami tentang pengalaman Anda bekerja dengan platform ini? Mengapa dipilih? Manfaat apa yang dibawanya?

PineTime dibuat oleh Pine64, dan saya tidak terlibat dalam desain perangkat keras, tetapi saya kira nRF52832 dipilih karena sangat cocok untuk kasus penggunaan jam tangan pintar: Ini mengintegrasikan radio BLE, berdaya rendah, dan cukup CPU dan sumber daya memori.

Ini adalah pertama kalinya saya mengerjakan ekosistem nRF52, dan saya memiliki pengalaman yang sangat positif. Ini memiliki dokumentasi yang baik, ada banyak sumber daya dan informasi di web, tumpukan FOSS BLE (NimBLE) tersedia, SDK sangat lengkap, dan periferal relatif mudah digunakan dibandingkan dengan MCU yang lebih kompleks seperti STM32.

Apa batasan dan spesifikasi perangkat keras utama yang harus ditangani oleh firmware InfiniTime?

Penyimpanan! Saat InfiniTime tumbuh dan memperluas fungsinya, ia menggunakan lebih banyak memori (baik RAM dan flash), dan jumlah memori yang tersedia berkurang dengan sangat cepat. Kami sekarang memberikan banyak perhatian pada penggunaan memori dari fitur-fitur baru yang ditambahkan sehingga kami tetap dalam batas.

Batasan lainnya adalah kecepatan bus SPI (8 MHz) yang digunakan untuk menghubungkan layar. Ini membatasi kecepatan refresh tampilan hingga sekitar 10 fps, jadi kami harus menerapkan beberapa trik untuk “menyembunyikan” kelambatan ini. Misalnya, menyegarkan seluruh tampilan membutuhkan waktu sekitar 110 ms, yang sangat lama dan tidak terlihat bagus saat disegarkan dari atas ke bawah. Itu sebabnya kami menerapkan animasi vertikal ini berdasarkan fitur pengguliran vertikal dari pengontrol LCD. Itu membuat navigasi di UI jauh lebih lancar dan menyenangkan.

Halaman GitHub mengatakan proyek ini ditulis dalam C++ modern. Standar mana yang Anda gunakan? Fitur C++ modern mana yang aktif digunakan dalam proyek?

Proyek saat ini dibangun dengan C++14, tetapi tentu saja kami dapat memperbarui ke versi yang lebih baru bila diperlukan.

Seperti yang saya sebutkan sebelumnya, salah satu tujuan saya dengan InfiniTime adalah bereksperimen dengan C++ pada sistem tertanam. Saya mencoba merancang proyek dengan prinsip-prinsip OOP, menemukan abstraksi terbaik untuk menjaga agar kode tetap mudah dibaca dan dipelihara, dan memanfaatkan abstraksi nol-overhead sebanyak mungkin.

Jika Anda menelusuri kode, Anda akan melihat bahwa kami menggunakan constexpr, auto, kelas enum, semantik pemindahan, dan lambdas sebagai penunjuk fungsi untuk panggilan balik dari pustaka C.

Teknologi dan kerangka kerja lain apa yang Anda gunakan secara aktif untuk mengembangkan InfiniTime?

InfiniTime dibangun di sekitar beberapa proyek open-source: FreeRTOS (OS), LVGL (UI library), NimBLE (BLE stack), LittleFS (filesystem untuk embedded system), dan MCUBoot (bootloader). Kami juga telah membangun InfiniSim, simulator untuk InfiniTime yang juga berbasis LVGL.

Kemudian ada beberapa aplikasi pendamping yang berinteraksi dengan PineTime melalui koneksi BLE dan berjalan di Linux dan Mobile Linux (Siglo, Amazfish, ITD), Android (Gadgetbridge), iOS (InfiniLink), dan bahkan di browser (WebBleWatch).

Kami menggunakan BLE (Bluetooth Low Energy) untuk berkomunikasi dengan aplikasi pendamping tersebut. BLE adalah satu-satunya jenis media komunikasi yang tersedia di PineTime. Ini digunakan untuk menyinkronkan tanggal dan waktu, menerima pemberitahuan, mengekspos data detak jantung dan gerakan, dan memperbarui firmware.

Perkakas mana (IDE, kerangka pengujian, profiler, penganalisis, dll.) yang Anda dan kontributor lain gunakan secara aktif saat mengembangkan InfiniTime?

Saya tidak tahu banyak tentang pengaturan pengembang lain, tetapi saya kebanyakan menggunakan CLion di mesin pengembangan utama saya, dan VS Code di laptop ARM saya (tetapi saya berharap CLion juga dibuat untuk berjalan di ARM64!).

Kami juga membutuhkan probe SWD untuk mem-flash dan men-debug firmware di MCU. Saya kebanyakan menggunakan adaptor JLink saya, tetapi probe lain seperti STLinkV2, BlackMagicProbe, dan bahkan RaspberryPi biasanya digunakan, bersama dengan OpenOCD.

Proyek ini juga menyediakan file konfigurasi untuk clang-format dan clang-tidy. Ada juga wadah Docker yang berisi semua yang diperlukan untuk membangun proyek dengan mudah.

Sejauh yang kami tahu, Anda telah menemukan integrasi FreeRTOS di CLion cukup berguna. Bisakah Anda membagikan kasus penggunaan Anda dan bagaimana Anda mendapat manfaat dari CLion?

Saya sangat senang ketika JetBrains merilis integrasi FreeRTOS di CLion. Ini memungkinkan Anda untuk dengan cepat mendapatkan gambaran umum yang bagus tentang sistem, termasuk penggunaan memori, penggunaan tumpukan, antrian, mutex, dan banyak lagi.

Tampilan tumpukan
Tampilan objek
Ini cukup membantu saat men-debug dan mengoptimalkan penggunaan memori, dan ini jauh lebih praktis daripada metode “printf debugging” yang saya gunakan sebelum integrasi tersedia! Saya juga berencana untuk menyatukan beberapa “tumpukan” (dari LVGL dan NimBLE) menjadi satu tumpukan yang dikelola oleh FreeRTOS, dan kemungkinan besar saya akan menggunakan integrasi ini untuk memeriksa apakah semuanya berjalan sebagaimana mestinya.

Bersama dengan server GDB tertanam dan fitur OpenOCD, integrasi ini membuat flashing dan debugging lanjutan menjadi lebih nyaman.

Anda merilis IntiniTime 1.0 lebih dari setahun yang lalu. Bagaimana proyek berkembang sejak saat itu?

Kami merilis InfiniTime 1.0 ketika kami berpikir bahwa proyek ini cukup stabil dan menyediakan serangkaian fitur minimal untuk dapat digunakan tidak hanya oleh pengembang tetapi juga oleh pengguna akhir yang sebenarnya. Ini menyediakan 2 tampilan jam, beberapa aplikasi, beberapa pengaturan pengguna, pemantauan detak jantung, penghitungan langkah dan konektivitas BLE untuk pemberitahuan, pengaturan tanggal / waktu, dan pembaruan OTA (pembaruan firmware melalui BLE).

Sejak itu, dan berkat kontribusi banyak pengembang, stabilitas firmware dan konektivitas BLE telah sangat meningkat, UI telah disempurnakan, aplikasi dan tampilan jam baru telah ditambahkan (Timer, Alarm, Metronom, Stopwatch, dan lainnya ), dan beberapa fitur baru telah terintegrasi (pemasangan aman BLE, bangun dengan mengangkat pergelangan tangan, sasaran langkah, dan lonceng, antara lain).

Dan kami tidak berhenti di situ! Masih banyak hal yang ingin kami tambahkan dan perbaiki di InfiniTime.

Apakah Anda terlibat dalam proyek pengembangan tertanam lainnya?

Saya juga bekerja sama erat dengan pengembang aplikasi pendamping yang mengintegrasikan dukungan untuk InfiniTime, termasuk Amazfish, Gadgetbridge, Siglo, dan ITD, terutama saat membangun fitur baru yang dapat diakses melalui BLE, untuk mendapatkan informasi tentang bagaimana fitur tersebut dapat terintegrasi di InfiniTime dan aplikasi pendamping. Saya bahkan berkontribusi pada peningkatan manajemen notifikasi di Gadgetbridge, aplikasi pendamping Android!

InfiniTime sejauh ini adalah proyek yang paling banyak saya selesaikan, tetapi saya juga telah menerbitkan beberapa proyek lain di akun Github dan Codeberg saya, seperti JFBrew, pengontrol suhu untuk ruang fermentasi bir DIY saya, dan driver untuk perangkat LoRa dari Pine64.

Terima kasih atas wawancaranya, Jean-François!

Saya ingin mengucapkan terima kasih kepada semua orang yang berpartisipasi dalam beberapa cara dalam proyek ini. InfiniTime tidak akan ada di sini tanpa mereka!

Dan saya juga ingin berterima kasih kepada JetBrains karena mendukung komunitas sumber terbuka dengan memberikan lisensi gratis untuk proyek sumber terbuka!

Pemrograman