Health Monitor Device Firmware
About the Client
Urban GmbH & Co. KG has been a top innovator of the agritech sector for decades now. One of their products is the award winning "Vitalcontrol", a handheld device for digital health monitoring

The Challenge
Somewhere along the way the client had lost control over firmware development. This became visible when the attempt to add new functionality failed. An assessment of the firmware revealed architectural shortcomings among others. We were brought on board to overhaul the firmware.
Delivered Value
We created a new build system, free of vendor specific tools, and a modular software architecture with clear responsibilities and dependencies. With this we have enabled the client to once again become creatively active. As usual we applied appropriate abstractions to separate implementation details from business logic. This will make all future development efforts easier.
The Product
Ported a legacy STM project to a modern GNU and CMake powered build system, thereby removing the dependency on vendor tools — Custom linker script to accommodate external RAM and Flash — Redesign and reimplementation of legacy firmware in modern C++ focusing on modularity and adaptability - Service based multithreading architecture based on FreeRTOS, prioritizing weak inter-dependencies between services — arena allocation from memory pools based on polymorphic resource allocators — custom device drivers for PMIC, LCD screen, haptic feedback, fuel gauge, addressable LEDs, RTC, ADC, NTC thermistor, RFID reader, SD card, barcode scanner, accelerometer, EEPROMs and WiFi module — FatFS integration — USB device driver — CDC/HID composite USB host driver — CDC based JSON backend with compile time performance enhancements — Serialization and Deserialization of SD card data — custom made Model-View-Controller style interaction with SD card data, for reading, writing, filtering etc.
- Embedded C++23
- STM32
- ARM Cortex-M
- FreeRTOS
- CMake
- UART
- I2C
- SPI
- USB
- WiFi
- BLE
- RFID
- Accelerometer
- Multithreading