Skip to content

Input/Output Streams

lbuild module: modm:io

The modm::IOStream class contains efficient formatting that supports both C++ std::basic_ostream-like formatting via operator << as well as implementing printf via the modm:printf module.

modm::IOStream stream(device);
stream << "format number 8: " << uint8_t(8) << " or as signed -100: " << int8_t(-100);
stream << modm::endl;

stream.printf("format number 8: %u or as signed -100: %d", 8, -100);

AVR supported features

All expensive features including printf are disabled by default to reduce firmware size! Please check the options.

modm::endl does NOT implicitly flush!

Flushing is extremely expensive on embedded systems, therefore modm::endl does not implicitly flush the stream. Please call modm::flush explicitly.

Redirecting IOStreams

The modm::IODeviceWrapper transforms any peripheral device that provides static write() and read() functions into an IODevice:

// configure a UART
using Uart = Uart0;

// wrap it into an IODevice
modm::IODeviceWrapper<Uart, modm::IOBuffer::BlockIfFull> device;

// use this device to print a message
device.write("Hello");

// or create a IOStream and use the stream to print something
modm::IOStream stream(device);
stream << " World!";

IODevice Buffer Behavior

The modm::IODeviceWrapper can be configured to discard or block in case the device is full. Discarding data is always non-blocking, however, blocking on write involves waiting in a loop until the device has space. This can cause a deadlock when called inside an interrupt!

If compiled with the modm:processing:fiber module, the blocking behavior allows the fiber to yield while waiting for the device. To prevent interlaced output from different fibers, the write(char) function is protected by a mutex that releases when a newline character \n is written. The flush() function is also mutex protected to allow one fiber to reliably flush the stream without having other fibers push data into the device.

Options

with_float

Support for floating point formatting

On AVRs floating point values can be printed, however, the formatting cannot be specified and all values are printed as scientific-notation exponential floating point

Default: no avr
Default: yes hosted, rp, sam, stm32
Inputs: [yes, no]

with_long_long

Support for 64-bit integer formatting

Default: no avr
Default: yes hosted, rp, sam, stm32
Inputs: [yes, no]
Input Dependency: yes -> modm:printf

with_printf

Support for printf-style formatting

Default: no avr
Default: yes hosted, rp, sam, stm32
Inputs: [yes, no]
Input Dependency: yes -> modm:printf

Dependencies

modm:io modm_io modm: io modm_architecture_accessor modm: architecture: accessor modm_io->modm_architecture_accessor modm_architecture_fiber modm: architecture: fiber modm_io->modm_architecture_fiber modm_math_utils modm: math: utils modm_io->modm_math_utils modm_printf modm: printf modm_io->modm_printf