The plumCore DAQ framework
A modular framework for data logging and remote data acquisition.
The name represents a seed found in a plum fruit - the “core” of the plum. Although not used in this manner it sounds sufficiently good to be used as a name for a totally unrelated project.
plumCore is a C framework using the microkernel/services pattern. FreeRTOS scheduler is used as the microkernel providing task scheduling and a basic IPC. All the rest is implemented as modular services. A plumCore service provides interfaces used by other services. Interface dependencies are either discovered in runtime (service locator pattern) or injected (dependency injection). Even the service locator is implemented as a service. Most of the code looks like and behaves in an OOP manner. As an user interface, a tree-structured CLI (command line interface) is available to configure the device.
plumCore use cases are various remotely operated measurement/DAQ systems with optional on-site data processing (edge computing). IoT and consumer hardware are not plumCore’s target applications.
- 1. Introduction
- 2. Concepts and design goals
- 2.1. Thin wrappers for external libraries
- 2.2. The less supported platforms and compilers, the better
- 2.3. Strict pattern usage
- 2.4. Strict coding style
- 2.5. Microkernel usage
- 2.6. Code and functionality organisation
- 2.7. Strict rules for passing dependencies
- 2.8. Message queue data passing
- 2.9. Selecting the best from all worlds
- 2.10. VCS and build system
- 3. Getting started
- 4. plumCore microkernel documentation
- 5. Services
- 5.1. Low level device drivers
- 5.1.1. STM32 12 bit SAR ADC driver
- 5.1.2. STM32 DAC driver
- 5.1.3. STM32G4 FDCAN peripheral driver
- 5.1.4. STM32 I2C peripheral driver
- 5.1.5. STM32L4 low-power MCU family power manager
- 5.1.6. STM32 QSPI flash memory driver
- 5.1.7. STM32 RTC peripheral clock driver
- 5.1.8. STM32 SPI peripheral driver
- 5.1.9. System clock implemented using STM32 timer
- 5.1.10. Capacitive sensing implemented using STM32 timer
- 5.1.11. STM32 UART driver
- 5.1.12. STM32 watchdog peripheral driver
- 5.2. High level (second level) device drivers
- 5.2.1. adc-sensor: Measuring a single analog sensor with an ADC input
- 5.2.2. bq35100: Primary cell gauging using a TI’s BQ35100 gauge
- 5.2.3. gps-ublox: A generic driver for u-blox based GNSS receivers
- 5.2.4. gsm-quectel: Service for accessing Quectel cellular modems
- 5.2.5. ICM-62688-P 3 axis accelerometer and 3 axis gyroscope driver
- 5.2.6. ADXL355 3 axis accelerometer
- 5.2.7. Si7002/7021 temperature and humidity sensor driver
- 5.3. DAQ and data processing services
- 5.4. Volume and filesystem access
- 5.4.1. fs-spiffs: SPIFFS filesystem library wrapper service
- 5.4.2. MIB stored in a flash device in a CBOR format
- 5.4.3. FIFO in a flash device
- 5.4.4. NVM (non-volatile memory) key-value store in a flash partition
- 5.4.5. Flash memory test suite
- 5.4.6. Flash volumes service (static configuration)
- 5.4.7. LoRa filesystem services
- 5.5. Communication protocols
- 5.6. Communication server/clients
- 5.7. User interface services
- 5.8. Generic system services
- 5.1. Low level device drivers
- 6. Interfaces
- 7. Applications
- 8. Applets
- 9. nwDAQ CAN communication protocol (nbus)
- 10. Ports
- 11. Conceptual
- 12. Code structure, contributing
- 13. Coding style guide
- 14. Enhancement proposals