Interview with JF, InfiniTime's creator

April 05, 2021 — Nico Cartron

In this article, I am interviewing JF, who is working on the PineTime firmware since October 2019.

JF walks us through InfiniTime, from the first developments, up to the latest ones, which I have been documenting on this blog.

About you

Nico: Hi JF, it's a pleasure doing this interview with you!
For those who don't know you, could you introduce yourself?

JF: Hi, I'm JF, you may know me as JF002 on Github and Mastodon or Codingfield on Twitter.
I'm passionate about open source software and hardware, and I enjoy working on various projects based on SBCs, microcontrollers and sensors!
I started working on my open source firmware project (which became InfiniTime) for the PineTime in October 2019, and I've never stopped since then!


Nico: Right, so as this article is possibly going to be read by people who don't know Pine64, maybe we should start by explaining who they are and what they do?

JF: Pine64 is a company like none other. Basically, they design, build and sell hardware and work together with a large community of developers, hobbyists, open-source enthousiasts and users to develop the software.
This is not a one-way collaboration : the community has the opportunity to actively participate in all the steps of the products design. Pine64 communicates really early on the devices they are working on, and takes all the feedbacks into account. When prototypes are ready, they send them to developers from the community so that they can work on the software (porting the kernel, writing device drivers and firmware, building distributions,...).
The community also plays an important role in the infrastructure (web site, forum, chat rooms,...).
I really appreciate this community driven philosophy!

Nico: And of course, as part of all the stuff that Pine64 is doing, we find the PineTime.
When I first stumbled upon it (I think it was early 2020), what amazed me was the price tag, which was really low (around 30€), without sacrificing features - I mean it has almost everything you could expect from a smartwatch (touch screen, accelerometer, heart-rate sensor, vibrator and of course Bluetooth) and is just lacking a GPS chip.
Was PineTime your first "contact" with Pine64? And what made you jump onboard the dev boat?

JF: Before I learnt about the PineTime, I knew Pine64 as a company that builds ARM-based SBCs, and I was really interested in the outcome of the PinebookPro and the PinePhone, which looked very promising.

One day, probably in September 2019, I saw an article or a tweet about the PineTime, an open-source smartwatch, and they were looking for developers to build a software running on it.
There was not much details, but the article said that we could send an email if we had knowledge in embedded development.
As I really enjoyed embedded software development, and already owned some equipment like a debugger, I decided to send an email, explaining that I was really interested in the project, that I had professional and personal experience in embedded systems, and I provided the link to my Github account and to one of my most "advanced" projects (JFBrew, a temperature controller for a fermentation chamber to brew my own beer), and I asked how I could buy the devkit so that I could experiment with it.

I was surprised when I received the answer : they just asked for my postal address so they could send me the devkit! They weren't asking for more information, for posts on social media, for some kind of promise I would do something useful : they would just send me the devkit and I would do whatever I want with it!

I received the devkit a few weeks later and have been working on it since then!

Nico: What were the initial challenges that you faced? And how did you deal with them?

JF: I think I was one of the first persons to receive the PineTime devkit and, at that time, there was close to no information available about it. The wiki page only contained the datasheets of the components and the schematics and that's it : no example code, no documentation on how to get started, nothing!

At that time, we were a few people in the community chat room working on several projects based on multiple RTOS and frameworks : Arduino, RioT, MynewT, FreeRTOS, embedded Rust,... And we were exchanging a lot of information on our achievements and experiments. That was really fun and interesting!

Slowly but surely we put together our projects, wrote documentation, wiki pages, blog articles,... and our projects were progressing faster and faster, from the first "led blink" project to a first "Hello world" on the display, to a BLE connection with a phone,...

Starting the project was a first challenge. Another technical challenge was BLE: while I was comfortable with low-level aspect of the CPU and its peripherals, I knew nothing about Bluetooth and Bluetooth Low Energy (BLE).
I had to learn how it works, and how to integrate it in an embedded project from scratch.

But the biggest challenge, and the most interesting one was not technical, but rather human : it was the first time I was working on a personal project in an open source community.
I'm used to working with people sitting in the same room as me, but working with people from all around the world, living in multiple timezones, speaking many languages and with different backgrounds is all new to me! That's really exciting!
We exchange our ideas and visions of the project, we share our knowledge, and we build the project together - I'm really happy and proud to be part of it!

Nico: Between the very first developments, and the release of version 0.7.1 (which marks a stability since it's the version embedded in the PineTime being shipped now), could you walk us through the different releases, things you added, things which didn't work initially, ...?

JF: When I look at the list of releases on GitHub, I'm really amazed by the amount of work I did, alone at first, and with many other contributors later on!

  • The first release, version 0.1.0 already provided basic functionalities : display the time, BLE connection and time synchronization. There was no touch interface, the UI was slow and basic.
  • Version 0.2.2 was the first release that received contributions from other developpers. I was really amazed to see other people contributing to the project!
  • In version 0.3, I decided to switch from a custom graphics library to LittleVGL, a light and versatile graphics library for embedded systems. It's easy to use and it provides everything you need to design nice UIs : support for display and touch interfaces, many widgets (buttons, dial, progress bar,...) and themes.
    I think this was a wise choice since I'm not good at all at designing UIs!
  • Version 0.5 was a nice release too: in this release, I decided to change the BLE stack used in the project. Initially, the BLE connectivity was managed using the NRF SoftDevice, the BLE stack from Nordic Semiconductor.
    Don't get me wrong: SoftDevice is nice, is well documented and works very well but... it's closed source software! One of my goals with this project was to build a 100% open source project and for that, I couldn't keep SoftDevice.
    Fortunately, there is an alternative BLE stack compatible with the NRF52 MCU which is open source : NimBLE. It's part of the Mynewt project, but it can be integrated as a standalone library in projects that are not based on this RTOS.
    The other achievement from version 0.5 is that it's the first version to be supported by a companion app : Amazfish! Thanks again to Adam, its creator, for integrating my project in Amazfish and for helping me design the BLE interface!
  • Version 0.6 brought the OTA functionality, allowing users to upgrade the firmare over-the-air, using their smartphone and BLE connectivity!
  • And finally comes version 0.7, which brought improvements, optimisations...
    At that time, Pine64 asked the community to choose and send a firmware for the next production batch, and I'm really proud we chose Pinetime-JF, which was renamed InfiniTime soon after.
    Fun fact: Just a few days before sending the 0.7 files to the factory, some users noticed that the touch panel would not work correctly from time to time, after a reset. We quickly fixed that bug in version 0.7.1 which made its way up to the PineTime factory!

Initial release / 0.7.1

Nico: Someone who buys a PineTime today (actually 3, since we can only buy a 3-pack, unless you want an unsealed, dev kit) will start with a super basic firmware, but doing an OTA upgrade to the latest one (0.15.0 as of writing this article) will give a much better experience.
Now, can I ask how the project is handled? Like which features should be added, when a release shall be pushed? Is that like a "typical" open-source project, using Github's issues, Pull Requests, and so on?

JF: To be honest, reading your article about InfiniTime firmwares history helped me realise what a long way we had come!
The UI has improved a lot, there are 2 games, a music control application, a navigation application, more integration with multiple companion apps, ... That's amazing!

Every project is different, but I guess we can say that InfiniTime is handled like many other projects on GitHub : people report bugs, ask for new features, suggest new ideas, create pull request to fix bugs, add features and improvements.
They also participate to the review of other contributors PRs,... I'm always thrilled to see the project continues to live even when I'm sleeping!

In the end, as the creator of the project, I'm the one who has the final word : I decide if and when a PR can be merged, I am the one who publishes the releases, I am the one who takes the decisions when several opinion diverge,...
Said like that, it looks like I'm a dictator who does what he wants. It's true, but believe me, I do my best to help contributors with their PRs, to answer to bug reports and feature requests, and to take the ideas and opinions of everyone into account! That's not an easy work, but it's very rewarding to see the project evolving day after day!

Nico: The project has now grown and there are more and more contributors, as well as interested users, who not only buy the watch, but also actually use it on a daily basis (me included ;)
Were there some "show stoppers" where you thought "wow, this one's really tough, not sure we can carry on" ?

JF: Since the beginning, we (the PineTime community) want the whole PineTime project to be as open and as inclusive as possible, meaning that there would probably be more than one firmware available, and we wanted the users to be able to easily and safely install the firmware of their choice.

This goal is rather easy to reach on higher-level platforms like a computer, or a Linux phone like the Pinephone as there are standardised bootloaders (BIOS, EFI), or they are equipped with removable storage.
On an embedded platform like the PineTime, you don't have all these functionalities that make the "installation" of a firmware easy: the firmware has to initialize the whole CPU, setup the interrupt vector, configure the peripherals and devices,... and there is no standardised hardware abstraction layer between the software and the hardware.
The problem is that every developer wants to use the language, platform, framework, RTOS, libraries, stacks,... they want. They don't want to be "forced" to use a specific BLE stack because that's the only one supported by the bootloader, for example.

That's when we were thinking about the bootloader and the OTA procedure : what would be the responsabilities of the bootloader? Should it include the BLE stack to provide the OTA functionality? Or should it only take care of the update of the firmware, leaving the responsability of the download of the firmware over BLE to the application?
We also had to think about a specific memory map every developer would have to agree,...

There were a lot of discussions, brainstorming, thinking and sometimes arguments. I can't thank Lup Yuen enough for his work on this part of the project : he spent a lot of time documenting his vision on the bootloader, how it works, how the memory could be segmented and of course, building the very first open source bootloader for the PineTime, based on MCUBoot.
We still use this bootloader to this day, and even the new version I'm working on is still based on his original work!

Nico: Again, looking back at all the releases delivered, can you tell us what you're the most proud of, and why?

JF: I'm very proud I managed to build this project from scratch, from a simple "Hello world" to a nearly fully functional application firmware for a smartwatch I can use every day.
I'm also proud that InfiniTime was chosen as the first FOSS firmware to be flashed at factory on the PineTime.

But what I'm most proud of is the fact that InfiniTime has become a community project : I'm not the only one to work on the code anymore.
More and more users and developers are actively working on the project : reporting issue, suggesting features and improvements, reviewing code, adding features, fixing bugs, helping with the project "administration", and also helping other users and newcomers, communicating about it on social medias and even help building a whole ecosystem around the PineTime (companion apps for Linux and Android, tools, scripts, watchface projects, forks of InfiniTime,...).

The Future

Nico: I know it's always tough to try predicting the future, but let's pretend we have a crystal ball - where do you think the project will be by the end of 2021?
I mean, you and I were discussing FOSDEM 2022, and how cool it would be to showcase PineTime - I'm curious and would like your take - what do you think we'll show to the crowd in Brussels?

JF: I would like to write a roadmap to InfiniTime 1.0.0 and try to achieve it in the next 6-9 months, and I really hope we'll be able to meet in person at FOSDEM 2022 and to showcase the PineTime along with other products from Pine64 !

Tags: PineTime, English

Comments? Tweet