What’s new in Pigweed#

Talk to the team at Pigweed Live#

Our next Pigweed Live is Mon Jul 29, 2024 1PM (PDT). Please join us to discuss what’s new in Pigweed and anything else Pigweed-related.

Jul 25, 2024#

Highlights (Jul 12, 2024 to Jul 25, 2024):

  • Extensive Bazel support in the Pigweed extension for VS Code: See pw_ide for the full story.

  • Bazel module support: Upstream Pigweed is now usable as a Bazel module dependency.

  • Trapping backend for pw_assert: pw_assert_trap is a new backend for pw_assert that calls __builtin_trap() when an assert is triggered.

  • Crash handling in async pw_system: Crash snapshots can be downloaded from pw_console by calling device.get_crash_snapshots() in the REPL.

Build systems#

Bazel#

Toolchain registration moved from WORKSPACE to MODULE.bazel, making it possible for downstream projects to use upstream Pigweed’s toolchains directly. Pigweed is now usable as a Bazel module dependency. Pigweed now provides an example .bazelrc at //pw_build/pigweed.bazelrc that downstream users can copy into their own projects.

Docs#

The fonts on pigweed.dev have been updated.

Modules#

pw_assert_trap#

pw_assert_trap is a new backend for pw_assert that calls __builtin_trap() when an assert is triggered.

pw_async2#

The new pw::async2::CoroOrElseTask class lets you run a coroutine in a task and invokes a handler function on error. The new pw::async2::Task::IsRegistered() method checks if a task is currently registered with a dispatcher. The new pw::async2::Coro::Empty() method creates an empty, invalid coroutine object. The new pw::async2::Task::Deregister() method unlinks a task from a dispatcher and any associated waker values.

pw_async2_epoll#

pw_bluetooth#

pw_bluetooth_proxy#

pw_bluetooth_sapphire#

The latest pw_bluetooth_sapphire commits were brought into Pigweed from the Fuchsia repository.

pw_build#

pw_py_binary is a new wrapper for py_binary that provides some defaults, such as marking all Python binaries as incompatible with MCUs.

pw_channel#

The new pw::channel::StreamChannel adapter makes it easier for a channel to interact with an underlying reader and writer stream.

pw_chrono_freertos#

pw_chrono_stl#

pw_console#

Typing out RPCs to invoke from the web console REPL should now autocomplete as expected. The web console log viewer now has a default config, defined at //pw_console/py/pw_console/html/defaultconfig.json. A new boolean config option, recolor_log_lines_to_match_level, has been added to allow users to control whether log messages should be restyled to match their severity level.

pw_cpu_exception_cortex_m#

The new PW_CPU_EXCEPTION_CORTEX_M_CRASH_ANALYSIS_INCLUDE_PC_LR option lets you control whether PC and LR register values are included in the AnalyzeCpuStateAndCrash() analysis.

pw_crypto#

pw_env_setup#

pw_grpc#

pw_ide#

General updates: pw_ide now detects Bazel projects based on the presence of MODULE.bazel files. The pw_ide docs have been revamped. Shared VS Code settings can now be stored in .vscode/settings.shared.json. The extension no longer attempts to infer the working directory if a project root isn’t explicitly provided; instead it prompts users to manually specify the project root. The VS Code extension now has better support for Fish terminals.

VS Code extension updates related to code intelligence in Bazel-based projects: The new Pigweed: Select Code Analysis Target command controls which Bazel target in your project to use for code intelligence. The new Pigweed: Refresh Compile Commands command lets you manually refresh code intelligence data. There’s also a Pigweed: Refresh Compile Commands and Select Code Analysis Target that combines these two steps. In the VS Code status bar there’s a new icon to indicate whether clangd code intelligence is on or off. Code intelligence data compilation output is now streamed so that you can monitor the progress of the tool in real-time. The easiest way to access these logs is by running the new Pigweed: Open Output Panel command. The extension now supports a .clangd.shared file that can be used to control project-wide clangd settings.

VS Code extension updates related to other Bazel tools: The extension now bundles Bazelisk and Buildifier. These bundled versions get updated when the extension itself updates. The extension recommends users to use these bundled versions by default. You can use the new Activate Bazelisk in Terminal command to manually specify which Bazelisk version to use.

pw_kvs#

pw_libcxx#

pw_libcxx now has support for the new operator.

pw_log#

pw_multibuf#

pw_presubmit#

pw_presubmit.inclusive_language.check_file now accepts an optional check_path argument which controls whether to check the path for non-inclusive language.

pw_result#

pw_rpc#

Soong proto building is now more flexible; genrules can now have protos from different sources. .option files can now be used in Soong genrules sources.

pw_rpc_transport#

pw_sensor#

pw_stream#

pw_stream_uart_mcuxpresso#

pw_string#

The new pw::utf8::ReadCodePoint(), pw::utf8::EncodeCodePoint(), and pw::utf8::WriteCodePoint() methods provide basic UTF-8 decoding and encoding.

pw_sync#

The condition variable interface has been deprecated. See Condition Variables.

pw_system#

Async pw_system now supports a crash handling service. When a crash snapshot is available, pw_system now logs instructions on how to download it. The pw_system console API now accepts an optional device_connection object, allowing for more flexible connection management. Device class creation has been refactored to make it easier for Python scripts to setup connections to devices in the same way that the pw_system console does. As part of this refactor the --output and --proto-globs flags were removed from the pw_system console.

pw_target_runner#

pw_thread#

The new pw::thread::TestThreadContext() interface makes it easier to create threads for unit tests.

pw_tokenizer#

pw_toolchain#

The new minimum_cxx_20() Bazel helper can be used with target_compatible_with attributes to express that a target requires C++20 or newer.

pw_trace_tokenized#

pw_transfer#

The new PW_TRANSFER_EVENT_PROCESSING_TIMEOUT_MS lets you control how long incoming transfer events should block on the previous event being processed before dropping the new event.

pw_unit_test#

pw_web#

The REPL in the web console now provides a welcome message that lists commonly used keyboard shortcuts. The log viewer UI is now more dense. The REPL is now positioned on the left by default. Pressing Shift+Enter in the REPL now goes to a new line rather than evaluating.

Third-party software#

Emboss#

Emboss was updated to v2024.0718.173957. Emboss build steps that involve Python now use an optimized version of Python, resulting in a 15% speedup.

Go#

Miscellaneous#

Rolls#

FreeRTOS was updated to version 10.5.1.bcr.2. CMake was bumped to version 3@3.30.1.chromium.8. Rust was updated to Git revision 73a228116ae8c8ce73e309eee8c730ce90feac78.

Targets#

RP2040#

Jul 11, 2024#

Highlights (Jun 28, 2024 to Jul 11, 2024):

  • Bazel 8 pre-release: Upstream Pigweed is now using a pre-release version of Bazel 8, the first version to include platform-based flags.

  • ARMv6-M support: pw_cpu_exception_cortex_m now supports ARMv6-M cores.

  • Browser-based pw_system console: The new --browser option lets you start a pw_system console in a web browser rather than the default Python-based terminal console.

  • Updated pw_rpc docs: The pw_rpc docs have been revamped to make getting started easier and to provide more Bazel guidance.

Build systems#

Bazel#

Pigweed is now using version 8.0.0-pre.20240618.2 of Bazel, the first version to include platform-based flags. Some backend collection targets are now being provided as dictionaries to enable downstream projects to use the pattern described in Provide default backend collections as dicts. The incompatible_with_mcu Bazel helper has been introduced to help express whether a target is only compatible with platforms that have a full-featured OS.

Docs#

Modules#

pw_allocator#

A bug was fixed that caused builds to break when -Wmissing-template-arg-list-after-template-kw is turned on.

pw_assert#

Downstream projects using Bazel now need to set the new backend label flags @pigweed//pw_assert:check_backend and @pigweed//pw_assert:check_backend_impl and include them in their link deps.

pw_async2#

pw_async2_epoll#

pw_async_basic#

pw_bluetooth#

pw_bluetooth_proxy#

pw::bluetooth::proxy::sendGattNotify() (lowercase first letter) has been removed; use pw::bluetooth::proxy::SendGattNotify() (uppercase first letter) instead. The new pw::bluetooth::proxy::GetNumSimultaneousAclSendsSupported() function returns the max number of LE ACL sends that can be in-flight at one time. The new pw::bluetooth::proxy::AclDataChannel::Reset() and pw::bluetooth::proxy::ProxyHost::Reset() methods let you reset the internal state of those classes.

pw_bluetooth_sapphire#

pw_build#

The new macros in //pw_build:merge_flags.bzl help with using platform-based flags.

pw_cli#

pw_cli has increased support for letting users select from interactive prompts. The RP2040 flasher utility uses the new interactive prompting features to let users select which detected device to flash.

pw_console#

pw_cpu_exception#

pw_cpu_exception_cortex_m#

pw_cpu_exception_cortex_m now supports ARMv6-M cores.

pw_digital_io_rp2040#

The new enable_pull_up and enable_pull_down fields in the pw::digital_io::Rp2040Config struct let you configure whether resistors should be pulled up or down.

pw_env_setup#

pw_function#

pw_log_string#

pw_malloc_freertos#

pw_presubmit#

pw_rpc#

The pw_rpc docs have been revamped to make getting started easier and to provide more Bazel guidance.

pw_stream_uart_mcuxpresso#

pw_sys_io#

pw_sys_io_baremetal_stm32f429#

Bazel projects should now set the --@pigweed//pw_sys_io:backend label flag to @pigweed//pw_sys_io_baremetal_stm32f429 and add the @pigweed//pw_sys_io_baremetal_stm32f429:compatible constraint to their platform to indicate that the platform is compatible with pw_sys_io_baremetal_stm32f429.

pw_sys_io_stm32cube#

pw_system#

The new --browser option lets you start a browser-based pw_system console instead of a terminal-based one.Thread stack sizes for the new async version of pw_system can now be configured with PW_SYSTEM_ASYNC_LOG_THREAD_STACK_SIZE_BYTES, PW_SYSTEM_ASYNC_RPC_THREAD_STACK_SIZE_BYTES, PW_SYSTEM_ASYNC_TRANSFER_THREAD_STACK_SIZE_BYTES, and PW_SYSTEM_ASYNC_DISPATCHER_THREAD_STACK_SIZE_BYTES. The new pw::system::AsyncCore::RunOnce() method provides a way to run a function once on a separate thread. The --ipython option has been removed from the pw_system console. See Embeddeding other interpreters for guidance on how to embed IPython.

pw_thread#

pw_thread_stl#

The pw::thread::Thread::native_handle() method now returns a pointer to the underlying thread object instead of a reference and the docs have been updated to make it clear that using this is inherently non-portable.

pw_toolchain#

Go binaries have been updated to no longer link with position-independent executables (PIE) on Linux.

pw_toolchain_bazel#

pw_trace#

pw_transfer#

pw_unit_test#

pw_web#

Upstream Pigweed protos are now provided alongside downstream project protos.

Rolls#

Pigweed is now using version 8.0.0-pre.20240618.2 of Bazel, the first version to include platform-based flags. Go was updated to version 3@1.22.5. CMake was updated to version 3@3.30.0.chromium.8.

Targets#

RP2040#

The RP2040 flasher now provides more feedback when a board has been successfully flashed.

Third-party software#

Emboss#

Emboss was updated to version 2024.0702.215418.

FreeRTOS#

GoogleTest#

ICU#

Mbed TLS#

Miscellaneous#

GitHub#

dotfiles#

Jun 27, 2024#

Highlights (Jun 14, 2024 to Jun 27, 2024):

  • RP2040 implementation for pw_channel: pw::channel::Rp2StdioChannelInit() is a new pw_channel implementation that reads from and writes to RP2040’s stdio.

  • Bazel compatibility patterns guide: The new Bazel build compatibility patterns guide describes the Bazel patterns that Pigweed uses to express that a build target is compatible with a platform.

  • Hex dump helper: The new pw::dump::LogBytes() helper makes it easier to log binary data as human-readable hex dumps. The number of input bytes to display per line can be configured via the kBytesPerLine template parameter.

Build systems#

Bazel#

The obsolete testonly_freertos platform has been removed.

Docs#

The new Bazel installation guide provides Pigweed’s recommendations on how to install Bazel. The Set up GitHub Actions for a Pigweed project guide was updated. The new Bazel build compatibility patterns guide describes the Bazel patterns that Pigweed uses to express that a build target is compatible with a platform.

Modules#

pw_allocator#

The //pw_allocator:block_allocator target has been removed. Consumers are now expected to depend on and include individual block allocator targets.

pw_assert#

pw_bluetooth#

New Emboss structs added: NumberOfCompletedPacketsEvent, WritePinTypeCommandCompleteEvent, PinCodeRequestNegativeReplyCommandCompleteEvent, ReadPinTypeCommandCompleteEvent, PinCodeRequestEvent, PinCodeRequestReplyCommandCompleteEvent, WritePinTypeCommand, ReadPinTypeCommand, PinCodeRequestNegativeReplyCommand, PinCodeRequestReplyCommand.

pw_bluetooth_proxy#

The new pw::bluetooth::proxy::AclDataChannel::ProcessDisconnectionCompleteEvent() method frees up resources when a connection is removed. The new pw::bluetooth::proxy::AclDataChannel::ProcessNumberOfCompletedPacketsEvent() method removes completed packets as necessary to reclaim LE ACL credits. The new pw::bluetooth::proxy::ProxyHost::sendGattNotify() method is a simple implementation of sending a GATT notification to a connected peer.

pw_bluetooth_sapphire#

pw_boot#

pw_build#

The BuildCommand Python class now has an optional working_dir argument that allows you to specify the working directory in which a build command should be executed. The new boolean_constraint_value syntactic sugar macro makes it easier to declare a constraint setting with just two possible constraint values.

pw_build_android#

Dynamic allocation for pw::Function is now always enabled in Android builds to allow pw::Function to exceed the inline size limit.

pw_build_info#

The new //pw_build_info:git_build_info Bazel rule lets you embed which Git commit your binary was built from.

pw_build_mcuxpresso#

The type for the include parameter in the pw_build_mcuxpresso.components.Project Python class constructor changed from list[str] to Collection[str] and the type for the exclude parameter changed from list[str] to Container[str]. pw_build_mcuxpresso.bazel.bazel_output() now accepts an optional extra_args argument, which is a dictionary of additional arguments to be added to the generated Bazel target.

pw_channel#

pw::channel::Rp2StdioChannelInit() is a new pw_channel implementation that reads from and writes to RP2040’s stdio.

pw_chrono#

The new pw_targets_FREERTOS_BACKEND_GROUP GN rule sets FreeRTOS backends for pw_chrono, pw_sync, and pw_thread in one go. Each backend can be individually overridden if needed.

pw_cli#

pw_clock_tree#

The new pw::clock_tree::ClockTree::AcquireWith() method lets you acquire a clock tree element while enabling another one.

pw_clock_tree_mcuxpresso#

AcquireWith() should now be used when enabling clock tree elements that are sourced from the audio PLL or SYS PLL.

pw_cpu_exception_cortex_m#

pw_docgen#

pw_emu#

pw_emu now supports Bazel.

pw_env_setup#

The version of cffi that pw_env_setup uses was updated to 1.16.0 to fix Windows failures. The “fatal error” that pw_env_setup used to log when running from a directory that’s outside of a Git repo has been suppressed.

pw_format#

pw_grpc#

The C++ module now handles corrupt frames more gracefully.

pw_hex_dump#

The pw_log_bytes target has been renamed to log_bytes. The new pw::dump::LogBytes() helper makes it easier to log binary data as human-readable hex dumps. The number of input bytes to display per line can be configured via the kBytesPerLine template parameter.

pw_i2c#

pw_ide#

A --process-files (-P) flag was added to pw ide cpp to process compilation databases at the provided paths. Bazel support for pw_ide has started. pw_ide now explicitly runs all commands from the PW_PROJECT_ROOT directory.

pw_log#

pw_malloc#

pw_multibuf#

pw_preprocessor#

pw_presubmit#

pw_rpc#

pw_rust#

pw_spi_mcuxpresso#

pw_sync#

The new pw_targets_FREERTOS_BACKEND_GROUP GN rule sets FreeRTOS backends for pw_chrono, pw_sync, and pw_thread in one go. Each backend can be individually overridden if needed.

pw_system#

pw_system:async is a new version of pw_system based on pw_async2. The pw_system console now has a --device-tracing flag to turn device tracing on or off.

pw_target_runner#

The pw_target_runner client in Go now supports a server_suggestion flag, which allows specifying a command to suggest to the user if the server is unavailable. The Go client’s RunBinary method can now accept a binary as a byte array instead of a file path.

pw_thread#

The new pw_targets_FREERTOS_BACKEND_GROUP GN rule sets FreeRTOS backends for pw_chrono, pw_sync, and pw_thread in one go. Each backend can be individually overridden if needed.

pw_toolchain#

Compiler diagnostics colors are now enabled in Bazel.

pw_transfer#

pw_watch#

pw_watch now ignores bazel-* directories.

pw_web#

The function signature for createLogViewer changed to createLogViewer(logSource, root, { columnOrder }). The columnOrder field in the optional third parameter lets you control the ordering of columns in the log viewer.The new useShoelaceFeatures boolean lets you control whether the log viewer uses Shoelace components. The log viewer’s toolbar is now responsive.

Languages#

Python#

Rust#

Miscellaneous#

OWNERS#

Targets#

References to configGENERATE_RUN_TIME_STATS have been removed because the implementations are incomplete.

RP2040#

The new flash_rp2040 rule makes it easier to flash Raspberry Pi RP2040s in Bazel.The new flash Bazel rule makes it easier to flash RP2040s from a Python script.

Third-party#

FreeRTOS#

configUSE_MALLOC_FAILED_HOOK can now be enabled to detect out-of-memory errors when using FreeRTOS’s heap implementation.

Nanopb#

Pico SDK#

Jun 13, 2024#

Highlights (May 30, 2024 to Jun 13, 2024):

  • pw_allocator support in pw_mallc: pw_malloc now supports pw_allocator-based backends.

  • New pw_build Bazel rules: pw_py_test rule wraps py_test, pw_elf_to_dump takes a binary executable and produces a text file containing the full binary layout, and pw_elf_to_bin rule takes a binary executable and produces a file with all ELF headers removed.

  • Improved Fish shell support: The pw and pw build commands now support Fish shell completion. The new bootstrap.fish script demonstrates how to bootstrap a Pigweed project from a Fish shell and makes it easier for Fish users to contribute to upstream Pigweed.

  • More informative modules index: The modules index now shoes useful metadata for each module, such as a summary of the module’s purpose and the programming languages that the module supports.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

The pw::allocator::Layout constructor is now marked explicit to ensure that functions that take Layout instances as arguments don’t silently accept and convert other types. The pw::allocator::FreeList and pw::allocator::FreeListHeap interfaces have been removed.

pw_analog#

pw_android_toolchain#

pw_arduino_build#

pw_assert#

pw_async#

pw_async2#

pw_base64#

pw_bloat#

pw_blob_store#

pw_bluetooth#

pw_bluetooth_hci#

pw_bluetooth_profiles#

pw_bluetooth_proxy#

The new pw::bluetooth::proxy::HasSendAclCapability() function indicates whether the proxy has the capability to send ACL packets.

pw_boot_cortex_m#

pw_build#

The new pw_py_test rule wraps py_test and defaults to setting target_compatible_with to host only. The new pw_elf_to_dump rule takes a binary executable and produces a text file containing the full binary layout. The new pw_elf_to_bin rule takes a binary executable and produces a file with all ELF headers removed.

pw_build_info#

pw_build_mcuxpresso#

pw_bytes#

pw_channel#

pw_checksum#

pw_chre#

pw_chrono#

libc time wrappers are now provided to improve compatibility with software not written for embedded systems that depends on gettimeofday and time from POSIX.

pw_cli#

The pw and pw build commands now support Fish shell completion.

pw_clock_tree#

The new pw::clock_tree::ClockSourceNoOp class can be used to satisfy the dependency of a source clock tree element for other clock source classes. The new pw::clock_tree::ElementController class provides easier integration of optional clock tree logic into existing drivers.

pw_clock_tree_mcuxpresso#

pw_console#

Theme colors are now correctly applied when running pw console with the --config-file option.

pw_containers#

The pw::Vector::at() function signature was changed to take size_t instead of size_type. The new pw::InlineVarLenEntryQueue::try_push() function is similar to pw::InlineVarLenEntryQueue::push_overwrite() but it drops entries instead of overwriting old ones. The new pw::InlineVarLenEntryQueue::max_size() function returns the maximum number of empty entries.

pw_digital_io#

pw_digital_io_linux#

pw_digital_io_linux now supports input interrupts. The new watch command in the CLI tool configures a GPIO line as an input and watches for interrupt events.

pw_docgen#

pw_env_setup#

The new bootstrap.fish script demonstrates how to bootstrap a Pigweed project from a Fish shell and makes it easier for Fish users to contribute to upstream Pigweed.

pw_grpc#

pw_ide#

pw_log#

pw_log_string#

pw_malloc#

pw_malloc now supports pw_allocator-based backends.

pw_multibuf#

The new pw::multibuf::MultiBuf::IsContiguous() method checks if a multibuf is contiguous and the new pw::multibuf::MultiBuf::ContiguousSpan() method provides a way to access contiguous data as a span. The new CopyTo(), CopyFrom(), and CopyFromAndTruncate() methods also simplify interactions with contiguous byte spans.

pw_multisink#

The new pw::multisink::MultiSink::GetUnreadEntriesSize() and pw::multisink::MultiSink::UnsafeGetUnreadEntriesSize() methods implement 0124: Interfaces for Retrieving Size Information from Multisink. The new PW_MULTISINK_CONFIG_LOCK_TYPE macro configures the underlying lock that’s used to guard multisink reads or writes.

pw_presubmit#

pw_protobuf#

pw_ring_buffer#

pw_router#

pw_rpc#

The Python client API now uses positional-only arguments.

pw_sensor#

pw_spi#

pw_spi_rp2040#

pw_stream#

pw_stream_uart_mcuxpresso#

pw_sync#

The new pw_targets_FREERTOS_BACKEND_GROUP GN rule sets up multiple modules to use FreeRTOS backends.

pw_system#

pw-system-console now connects to the first detected port if --device isn’t provided and only one port is detected or it shows an interactive prompt if multiple ports are detected. Building and running the demo now shows how to run pw-system-console with host_device_simulator in Bazel-based projects.

pw_target_runner#

pw_thread#

pw_thread_freertos#

pw_toolchain#

pw_toolchain_bazel#

pw_transfer#

pw_uart#

pw_varint#

pw_watch#

Watching now works in directories other than PW_ROOT.

pw_web#

Build systems#

Bazel#

Hardware targets#

host_device_simulator#

rp2040#

stm32f429i#

OS support#

Zephyr#

FreeRTOS#

FreeRTOS application function implementations like vApplicationStackOverflowHook() are now shared between multiple hardware targets.

Docs#

The modules index now includes metadata for each module such as a summary of each module and what languages each module supports. The pigweed.dev sitenav was simplified. Pigweed Eng Blog #2: Feature flags in Bazel builds was published. A “skip to main content” accessibility feature was added to pigweed.dev.

Third-party software support#

mimxrt595#

GitHub#

io_bazel_rules_go#

pigweed.json#

May 30, 2024#

Highlights (May 17, 2024 to May 30, 2024):

  • Clock management: The new pw_clock_tree module manages generic clock tree elements such as clocks, clock selectors, and clock dividers.

  • GitHub Actions: The new Set up GitHub Actions for a Pigweed project guide shows you how to set up GitHub Actions to build and test a Bazel-based Pigweed project when a pull request is received.

  • pw_system and Bazel: pw_system usage in Bazel has been simplified by gathering all required pw_system components into one target and providing label flags that can set platform-dependent dependencies.

  • Channels and Linux Epoll: The new pw::channel::EpollChannel class sends and receives data through a file descriptor, with read and write notifications backed by Linux’s epoll system.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

pw_assert#

pw_build#

The new PW_MUST_PLACE macro ensures that linker script inputs are non-zero sized.

pw_channel#

The new pw::channel::EpollChannel class sends and receives data through a file descriptor, with read and write notifications backed by Linux’s epoll system.

pw_chre#

pw_clock_tree#

The new pw_clock_tree module manages generic clock tree elements such as clocks, clock selectors, and clock dividers.

pw_clock_tree_mcuxpresso#

The new pw_clock_tree_mcuxpresso module is an NXP MCUXPresso backend for pw_clock_tree.

pw_config_loader#

pw_cpu_exception_cortex_m#

The new crash analysis API provides data about CPU state during exceptions. See Crash Facade Setup.

pw_emu#

pw_env_setup#

pw_grpc#

pw_hex_dump#

pw_libcxx#

pw_log_basic#

pw_multisink#

pw_preprocessor#

pw_rpc#

pw_spi_mcuxpresso#

pw_stream_uart_mcuxpresso#

pw_system#

pw_system usage in Bazel has been simplified by gathering all required pw_system components into one target and providing label flags that can set platform-dependent dependencies.

pw_thread#

pw_toolchain#

pw_transfer#

pw_uart#

pw_unit_test#

pw_web#

Build#

Bazel#

Clang’s AddressSanitizer is now supported. See Clang sanitizers.

Targets#

rp2040#

OS support#

freertos#

Docs#

The new Set up GitHub Actions for a Pigweed project guide shows you how to set up GitHub Actions to build and test a Pigweed project when a pull request is received.

Miscellaneous#

May 16, 2024#

Highlights (May 2, 2024 to May 16, 2024):

  • Coroutines: You can now create asynchronous tasks using C++20 coroutines.

  • Rust with Bazel: The Rust toolchain can now be used by downstream projects using Bazel.

  • More MCUXpresso support: Several modules have additional support for projects built using the NXP MCUXpresso SDK, including multiple core support in pw_build_mcuxpresso, a new initiator in pw_i2c_mcuxpresso, a new responder in pw_spi_mcuxpresso, and a new pw_dma_mcuxpresso module.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

pw_assert#

pw_async2#

C++20 users can now define asynchronous tasks using Coroutines.

pw_bloat#

Padding is now included as part of utilization in code size reports. This allows developers to monitor changes in application size that smaller than the used space alignment defined in the linker script.

pw_bluetooth#

pw_bluetooth_proxy#

pw_boot_cortex_m#

pw_build#

pw_build_mcuxpresso#

pw_build_mcuxpresso now can support multiple device cores.

pw_config_loader#

pw_cpu_exception_cortex_m#

pw_digital_io_linux#

pw_dma_mcuxpresso#

pw_dma_mcuxpresso is a new module for working with an MCUXpresso DMA controller.

pw_docs#

pw_env_setup#

pw_format#

pw_i2c#

pw_i2c_mcuxpresso#

The new I3cMcuxpressoInitiator implements the pw_i2c initiator interface using the MCUXpresso I3C driver, allowing normal I2C API’s to work after setup.

pw_ide#

pw_libcxx#

Added initial support for using LLVM’s libcxx as a standard C++ library implementation.

pw_log#

Logging messages with untyped string arguments is now supported in the Rust implementation.

pw_multibuf#

pw_package#

pw_presubmit#

pw_proto#

pw_protobuf#

pw_protobuf_compiler#

pw_result#

pw_rpc#

pw_spi_mcuxpresso#

The pw_spi_mcuxpresso module now includes an McuxpressoResponder useing the SPI and DMA drivers from the NXP MCUXpresso SDK.

pw_stm32cube_build#

pw_sys_io_rp2040#

pw_sys_io_stdio#

pw_sys_io_stm32cube#

pw_tokenizer#

pw_toolchain#

Pigweed’s Rust toolchain can now be used by downstream projects.

pw_trace_tokenized#

pw_transfer#

The transfer service now ends active transfers when the underlying stream changes, avoiding a case where a transfer could become stuck.

pw_unit_test#

Build#

bazel#

Targets#

targets/rp2040#

Docs#

SEEDs#

SEED-0116#

Third party#

third_party/emboss#

third_party/freertos#

third_party/perfetto#

Miscellaneous#

May 1, 2024#

Highlights (Apr 19, 2024 to May 1, 2024):

  • Thread kickoff via pw::Function: Revamped the Thread API to use pw::Function. The original Thread API was created before pw::Function was stable; this change modernizes and increases usability of the Thread API.

  • Thread creation SEED: Creating threads in Pigweed is difficult due to our strict adherence to portability. We’re considering creating an additional API that is more usable but less portable than the current approach.

  • Transfer: Adaptive windowing got a Java implementation, and improvements to adaptive windowing in C++.

  • Bluetooth: Initial CLs towards a Bluetooth proxy.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

Added two new allocators: BuddyAlloctor and BumpAllocator (also known as an arena allocator). Various cleanups and fixes, including splitting the Block-based allocators to their own files.

pw_assert#

pw_async#

pw_bluetooth#

Continue filling out Bluetooth packet definitions; as well as some API extensions for e.g. RSSI control.

pw_bluetooth_*#

pw_bluetooth_proxy#

Start building the Bluetooth proxy subsystem.

pw_build#

pw_build_info#

pw_cli#

New SEED creation tool reduces the burden to create SEEDs. This will open the door to more contributors creating SEEDs for Pigweed changes and enhancements.

pw_containers#

pw_cpu_exception_cortex_m#

pw_digital_io_linux#

pw_env_setup#

pw_format#

pw_grpc#

pw_module#

pw_presubmit#

pw_protobuf#

pw_rpc#

Enhancements in pw_rpc to better integrate with pw_grpc.

pw_rust#

pw_sensors#

Sensors subsystem continues moving along; note that most of the discussion and development is happening in the SEEDs.

pw_snapshot#

pw_spi_mcuxpresso#

pw_stream_uart_mcuxpresso#

pw_string#

pw_thread#

API change to bring pw_thread up to date with pw::Function; see overview.

pw_thread_threadx#

pw_tls_client#

pw_tokenizer#

Enhance the C++ host-side decoder to better handle the full suite of capabilities, in particulaur, recursive decoding; also some build fixes.

pw_toolchain#

pw_transfer#

Adaptive windowing improvements, including C++ enhancementsn to better handle small window sizes, as well as adding a Java implementation.

pw_unit_test#

pw_web#

Docs#

docs#

SEEDs#

Miscellaneous#

.bazelversion#

Third party#

Apr 18, 2024#

Highlights (Apr 4, 2024 to Apr 18, 2024):

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

The new pw::allocator::TypedPool class is a slab allocator that can allocate a specific object with very low overhead. pw::allocator::TypedPool is implemented using the new pw::allocator::Pool interface. pw::allocator::TrackingAllocatorImpl was renamed to pw::allocator::TrackingAllocator.

pw_async2#

The new pw::async2::PendableAsTask class is a Task that delegates to a type with a Pend method.

pw_blob_store#

The pw_add_library() call for the pw_blob_store target now compiles as STATIC instead of INTERFACE to be more in line with the Bazel build.

pw_bluetooth#

pw_bluetooth_sapphire#

In CIPD bt-host artifacts are now uploaded to fuchsia/prebuilt/bt-host.

pw_build#

pw_build_android#

pw_build_info#

pw_cli#

The following interfaces were moved from pw_presubmit to pw_cli to make them more widely available: pw_cli.file_filter.FileFilter, pw_cli.git_repo, and pw_cli.tool_runner.ToolRunner. The new pw_cli.decorators.deprecated() decorator emits a deprecation warning when the annotated function is used.

pw_containers#

pw_cpu_exception_risc_v#

The new pw_cpu_exception_risc_v backend lays the foundation for RISC-V CPU exception handling.

pw_env_setup#

pw_hdlc#

pw_ide#

pw_kvs#

pw_log_zephyr#

pw_presubmit#

The following interfaces were moved from pw_presubmit to pw_cli to make them more widely available: pw_cli.file_filter.FileFilter, pw_cli.git_repo, and pw_cli.tool_runner.ToolRunner.

pw_protobuf#

pw_rpc#

The new pw::rpc::ChangeEncodedChannelId() function lets you rewrite an encoded packet’s channel ID in place. See Remapping channels.

pw_rpc_transport#

pw_sensor#

The new pw_sensor module is the start of the implementation of SEED 0119: Sensors.

pw_snapshot#

pw_spi_linux#

pw_spi_linux now has a basic Command-line interface that lets you read from and write to devices.

pw_thread_freertos#

pw_tls_client#

pw_transfer#

The Python and C++ interfaces now support adaptive windowing.

pw_web#

Build#

Bazel#

Docs#

The new Zephyr quickstart shows you how to set up a C++-based Zephyr project that’s ready to use Pigweed. The API references for all functions or methods that return a set of pw_status codes have been refactored for consistency. The Doxygen style guide has been revamped.

SEEDs#

Miscellaneous#

Apr 4, 2024#

Highlights (Mar 21, 2024 to Apr 4, 2024):

  • New modules: pw_i2c_rp2040 is a Pico SDK implementation of the pw_i2c interface, pw_async2_epoll is an epoll-based backend for pw_async2, pw_spi_linux is a Linux backend for pw_spi, pw_uart provides core methods for UART communication, and pw_bluetooth_proxy provides a lightweight proxy host that can be placed between a Bluetooth host and a Bluetooth controller to add functionality or inspection.

  • Docs updates: Pigweed’s main docs builder now builds the examples repo; the examples will be available at https://pigweed.dev/examples. An experimental complete Doxygen API reference is now being published to https://pigweed.dev/doxygen. The pw_i2c docs, reStructuredText style guide, and docs contributors homepage have been revamped.

  • Android platform updates: Many modules were refactored to follow the guidance in pw_build_android to make it easier to build them in Soong.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

The new Capabilities API lets derived allocators describe what optional features they support. pw::Allocator::GetLayout() has begun to be deprecated and replaced by pw::Allocator::GetRequestedLayout, pw::Allocator::GetUsableLayout(), and pw::Allocator::GetAllocatedLayout() to make it easier to distinguish between requested memory, usable memory, and already used memory. Methods that took Layout arguments, such as pw::Allocator::GetRequestedLayout(), have been deprecated.

pw_assert_log#

pw_async2#

The new pw::async2::PendFuncTask class delegates a task to a provided function.

pw_async2_epoll#

The new pw_async2_epoll module is an epoll-based backend for pw_async2.

pw_bluetooth#

The Usage section now shows CMake usage and the new Contributing section shows how to contribute Emboss code.

pw_bluetooth_proxy#

The new pw_bluetooth_proxy module provides a lightweight proxy host that can be placed between a Bluetooth host and a Bluetooth controller to add functionality or inspection.

pw_bluetooth_sapphire#

pw_bluetooth_sapphire now supports emulation, Fuchsia unit testing, and ARM64 build targets.

pw_build#

Modules can now be nested in subdirectories, which paves the way for refactoring how modules are organized in the upstream Pigweed repo. Project Builder is a new lightweight build command for projects that need to run multiple commands to perform a build.

pw_build_android#

pw_build_info#

The new pw::build_info::LogBuildId() function lets you print a GNU build ID as hex.

pw_bytes#

pw_channel#

The new pw::channel::LoopbackDatagramChannel and pw::channel::LoopbackByteChannel aliases provide channel implementations that read their own writes. The new pw::channel::ForwardingChannelPair class lets you connect two subsystems with datagram channels without implementing a custom channel.

pw_chrono#

pw_cli#

The new pw_cli.alias Python module lets you create pw subcommands that are effectively command line aliases. See Defining a simple alias.

pw_digital_io#

pw_emu#

pw_env_setup#

pw_function#

pw_hdlc#

The new pw::hdlc::Router class is an experimental async HDLC router that uses pw_channel.

pw_i2c#

The pw_i2c docs have been revamped.

pw_i2c_rp2040#

The new pw_i2c_rp2040 module implements the pw_i2c interface using the Raspberry Pi Pico SDK.

pw_ide#

pw_ide.settings.PigweedIdeSettings.compdb_searchpaths() now accepts globs. The new pw_ide.settings.PigweedIdeSettings.targets_exclude() method lets you specify a list of GN targets that code analysis should ignore.

pw_libc#

pw_log#

pw_log_basic#

pw_log_null#

pw_log_tokenized#

pw_minimal_cpp_stdlib#

pw_module#

pw_multibuf#

pw_polyfill#

pw_preprocessor#

pw_presubmit#

Pigweed’s main docs builder now builds the examples repo; the examples will be available at https://pigweed.dev/examples. An experimental complete Doxygen API reference is now being published to https://pigweed.dev/doxygen.

pw_protobuf#

pw_python#

pw_result#

pw_router#

pw_rpc#

pw_rpc_transport#

pw_span#

pw_spi#

pw_spi_linux#

Linux functionality that was previously in pw_spi has been moved to its own module, pw_spi_linux.

pw_status#

The new pw::StatusWithSize::size_or() convenience method lets you return a default size in place of pw::StatusWithSize::size() when the status is not OK.

pw_stream_shmem_mcuxpresso#

pw_sync#

pw_sys_io#

pw_thread#

pw_toolchain#

pw_trace_tokenized#

pw_transfer#

New pw_transfer macros: PW_TRANSFER_LOG_DEFAULT_CHUNKS_BEFORE_RATE_LIMIT, PW_TRANSFER_LOG_DEFAULT_RATE_PERIOD_MS, PW_TRANSFER_CONFIG_LOG_LEVEL, and PW_TRANSFER_CONFIG_DEBUG_DATA_CHUNKS.

pw_uart#

The new pw_uart module defines core methods for UART communication.

pw_unit_test#

pw_web#

Build#

Bazel#

Docs#

SEEDs#

Third party#

Miscellaneous#

Mar 22, 2024#

Highlights (Mar 7, 2024 to Mar 22, 2024):

  • Pigweed’s minimum supported Python version was changed to 3.10.

  • Setting the new pw_build_TEST_TRANSITIVE_PYTHON_DEPS flag to false in your project’s .gn file turns off testing and linting of transitive dependencies in pw_python_package rules, which can speed up build times significantly.

  • The new pw_log_android module is a pw_log backend for Android and the new pw_build_android module provides tools to help build Pigweed in Android platform applications.

  • 0120: Sensor Configuration introduces pw_sensor, a module that will handle Pigweed’s upcoming sensor framework.

  • The new PW_LOG_EVERY_N and PW_LOG_EVERY_N_DURATION macros provide rate-limited logging.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

The pw_allocator docs have been revamped. Code examples from the docs are now extracted from complete examples that are built and tested alongside the rest of the main Pigweed repo; see //pw_allocator/examples.

pw_assert#

pw_assert_basic#

pw_bluetooth#

pw_bluetooth_sapphire#

pw_build#

Setting the new pw_build_TEST_TRANSITIVE_PYTHON_DEPS flag to false in your project’s .gn file turns off testing and linting of transitive dependencies in pw_python_package rules, which can speed up build times significantly.

pw_build_android#

The new pw_build_android module provides tools to help build Pigweed in Android platform applications.

pw_bytes#

The new pw::bytes::ExtractBits() helper extracts bits between specified left bit and right bit positions. New Rust helpers were added; see Crate pw_bytes.

pw_channel#

Datagram-to-byte conversions must now be explicit.

pw_checksum#

pw_chre#

pw_containers#

pw_digital_io_linux#

The new pw_digital_io_linux CLI tool lets you configure a GPIO line as an input and gets its value, or configure a line as an output and set its value.

pw_docgen#

pw_env_setup#

Pigweed’s minimum supported Python version was changed to 3.10.

pw_format#

Initital support for untyped specifiers (%v) was added.

pw_hdlc#

The newly public pw::hdlc::Encoder class supports gradually encoding frames without ever holding an entire frame in memory at once.

pw_hex_dump#

CMake support was added.

pw_json#

pw_libc#

pw_log#

The new PW_LOG_EVERY_N and PW_LOG_EVERY_N_DURATION macros provide rate-limited logging.

pw_log_android#

The new pw_log_android module is a pw_log backend for Android.

pw_malloc#

pw_multibuf#

pw::multibuf::Stream is a new multibuf-backed pw_stream implementation that can read from and write to a multibuf. pw::multibuf::SimpleAllocator is a simple, first-fit variant of pw::multibuf::MultiBufAllocator.

pw_package#

pw_polyfill#

pw_presubmit#

pw_rpc#

pw_rust#

pw_sensor#

0120: Sensor Configuration introduces pw_sensor, a module that will handle Pigweed’s upcoming sensor framework.

pw_spi#

pw_stream_shmem_mcuxpresso#

pw_sync_stl#

pw_sys_io#

pw_sys_io_rp2040#

pw_sys_io_stm32cube#

pw_thread_zephyr#

pw_tokenizer#

The Rust library’s hashing code was updated to support multi-input hashing.

pw_transfer#

The TypeScript client now has an abort() method for ending a transfer without a completion chunk and a terminate() method for ending a transfer with a completion chunk.

pw_unit_test#

The new pw::unit_test::TestRecordEventHandler class is a predefined event handler that outputs a test summary in Chromium JSON Test Results format.

pw_watch#

Changes to Emboss files now trigger rebuilds.

pw_web#

Build#

Bazel#

The new pw_facade Bazel macro makes it easier to create a facade.

Language support#

Python#

OS support#

Zephyr#

Docs#

The new CLI style guide outlines how CLI utilities in upstream Pigweed should behave.

Third party#

Mar 7, 2024#

Highlights (Feb 22, 2024 to Mar 7, 2024):

  • The new pw_digital_io_linux module is a pw_digital_io backend for Linux userspace.

  • pw::multibuf::MultiBufAllocator class is a new interface for allocating pw::multibuf::MultiBuf objects.

  • The pw_web log viewer now captures browser console logs. It also now supports creating log stores and downloading logs from stores.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

pw_assert_log#

pw_async2#

pw_blob_store#

pw_bluetooth#

pw_build#

pw_config_loader#

pw_containers#

pw_digital_io_linux#

The new pw_digital_io_linux module is a pw_digital_io backend for Linux userspace.

pw_json#

pw_libc#

pw_log#

pw_module#

pw_multibuf#

The new pw::multibuf::MultiBufAllocator class is an interface for allocating pw::multibuf::MultiBuf objects.

pw_presubmit#

pw_proto_compiler#

pw_result#

pw_rpc#

The newly public pw::rpc::CloseAndWaitForCallbacks function abandons an RPC and blocks on the completion of any running callbacks.

pw_rpc_transport#

pw_rust#

pw_stream_uart_mcuxpresso#

pw_stream_uart_mcuxpresso now supports direct memory access reads and writes.

pw_string#

pw::InlineByteString is a new alias of pw::InlineBasicString<std::byte> that can be used as a simple and efficient byte container.

pw_sync#

pw_tokenizer#

pw_toolchain_bazel#

pw_transfer#

pw_unit_test#

The pw_unit_test docs have been revamped. Using the full upstream GoogleTest backend with simple_printing_main in Bazel has been fixed.

pw_watch#

pw_watch now rebuilds when Bazel files are changed.

pw_web#

The pw_web log viewer now captures browser console logs. It also now supports creating log stores and downloading logs from stores.

Bazel#

Docs#

The new protobuf style guide describes how protobufs should be styled throughout Pigweed.

Third party#

Miscellaneous#

Feb 23, 2024#

Highlights (Feb 9, 2024 to Feb 23, 2024):

  • The new pw_json module provides classes for serializing JSON.

  • Raspberry Pi RP2040 support was expanded, including a new pw::digital_io::Rp2040Config struct enables you to configure polarity for RP2040 GPIO pins, and a new pw::spi::Rp2040Initiator class which is a Pico SDK userspace implementation of Pigweed’s SPI Initiator class.

  • The new pw::spi::DigitalOutChipSelector class sets the state of a pw_digital_io output when activated.

  • The pw_kvs docs were overhauled.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

pw_assert#

pw_assert_log#

pw_bluetooth#

pw_build#

pw_bytes#

pw_chrono_rp2040#

pw_cli#

pw_config_loader#

The new skip_files__without_sections option enables you to just move on to the next file rather than raise an exception if a relevant section doesn’t exist in a config file.

pw_containers#

pw_digital_io_rp2040#

The new pw::digital_io::Rp2040Config struct enables you to configure polarity for RP2040 GPIO pins.

pw_env_setup#

pw_function#

The new //third_party/fuchsia:fit label flag enables Bazel-based projects to provide an alternate implementation for fit() when needed.

pw_fuzzer#

pw_grpc#

pw_hdlc#

pw_i2c#

The API reference for pw::i2c::RegisterDevice is now published on pigweed.dev.

pw_ide#

pw_json#

The new pw_json module provides classes for serializing JSON.

pw_kvs#

The pw_kvs docs were overhauled.

pw_log#

pw_log_android#

pw_metric#

pw_module#

pw_multibuf#

pw_package#

pw_preprocessor#

The pw_preprocessor reference is now being generated via Doxygen.

pw_presubmit#

pw_rpc#

pw_rpc clients will once again accept unsolicited responses from pw_rpc servers that were built prior to September 2022. Unsolicited responses, also known as “open” requests, let a server send a message to a client prior to the client sending a request. This change fixed an incompatibility in which pw_rpc clients built after September 2022 would not accept unsolicited responses from servers built before September 2022 (specifically, change #109077).

pw_software_update#

pw_spi#

The new pw::spi::DigitalOutChipSelector class is an implementation of pw::spi::ChipSelector that sets the state of a pw_digital_io output when activated.

pw_spi_rp2040#

The new pw::spi::Rp2040Initiator class is a Pico SDK userspace implementation of Pigweed’s SPI Initiator class.

pw_stream#

pw_string#

Debug error messages for assertions containing std::optional types have been improved.

pw_sync#

pw_tokenizer#

The pw_tokenizer and pw_snapshot Python libraries can now be used from Bazel as a result of the proto migration. See issue #322850978).

pw_toolchain#

pw_toolchain_bazel#

pw_transfer#

pw_watch#

pw_web#

The log viewer now supports multiple log sources.

Build#

Bazel#

Targets#

OS support#

Docs#

Breadcrumbs are now shown at the top of all docs pages except the homepage.

SEEDs#

Third party#

Miscellaneous#

Feb 9, 2024#

Highlights (Jan 26, 2024 to Feb 9, 2024):

  • The new pw_grpc module provides classes that map between pw_rpc packets and HTTP/2 gRPC frames, allowing pw_rpc services to be exposed as gRPC services.

  • A lot of the remaining pw_toolchain_bazel feature work from 0113: Add modular Bazel C/C++ toolchain API was finished and rough edges were polished up.

  • The new generic pw::allocator::BlockAllocator interface supported several derived types that enable fine-grained control over how a block satisfies an allocation request.

  • pw_transfer now supports resumable transfers.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_alignment#

pw_allocator#

The new generic pw::allocator::BlockAllocator interface supports several derived types that enable fine-grained control over how a block satisfies an allocation request. The new pw::allocator::GetLayout() method retrieves the layout that was used to allocate a given pointer. The new pw::allocator::AllocatorSyncProxy interface synchronizes access to another allocator, allowing it to be used by multiple threads.

pw_assert#

pw_async_basic#

pw_bloat#

The new boolean argument ignore_unused_labels for pw_size_report() enables you to remove labels from the JSON size report that have a size of 0.

pw_bluetooth#

pw_boot#

pw_build#

The new PW_USE_COLOR, NO_COLOR, and CLICOLOR_FORCE OS environment variables enable you to control whether output in CI/CQ is color formatted.

pw_bytes#

pw_channel#

The initial pw::channel::Channel class from 0114: Channels has been introduced but it is experimental and should not be used yet.

pw_cli#

pw_compilation_testing#

pw_config_loader#

The code from pw_cli related to looking up user-specific configuration files has been moved to this separate module.

pw_cpu_exception_cortex_m#

pw_digital_io#

pw_env_setup#

pw_format#

pw_function#

pw_fuzzer#

pw_grpc#

The new pw_grpc module is an implementation of the gRPC HTTP/2 protocol. It provides classes that map between pw_rpc packets and pw_grpc HTTP/2 frames, allowing pw_rpc services to be exposed as gRPC services.

pw_ide#

pw_presubmit#

Color formatting in CI/CQ has been improved for readability.

pw_protobuf#

pw_random#

pw_result#

pw_rpc#

pw_stream#

pw_target_runner#

pw_thread#

pw_tokenizer#

Troubleshooting docs were added that explain how to workaround GCC’s template function tokenization bug in GCC releases prior to 14.

pw_toolchain#

pw_toolchain_bazel#

A lot of the remaining pw_toolchain_bazel feature work from 0113: Add modular Bazel C/C++ toolchain API was finished and rough edges were polished up.

pw_transfer#

pw_transfer now supports resumable transfers.

pw_unit_test#

Build#

OS support#

Docs#

SEEDs#

Miscellaneous#

Jan 26, 2024#

Highlights (Jan 12, 2024 to Jan 26, 2024):

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

pw_bluetooth#

pw_build#

The new pw_cc_binary_with_map Bazel rule enables you to generate a .map file when building a binary.

pw_bytes#

The pw::ByteBuilder API reference is now being auto-generated via Doxygen. The new pw::bytes::SignExtend() template enables expanding the nth bit to the left up to the size of the destination type.

pw_compilation_testing#

pw_console#

pw_containers#

The destructors for pw::InlineQueue, pw::InlineDeque, and pw::Vector are now protected to prevent use with delete or std::unique_ptr and to prevent unusable declarations.

pw_digital_io#

The private virtual API requirements for pw::digital_io::DigitalIoOptional are now documented because they are needed when implementing concrete backends for pw_digital_io.

pw_doctor#

pw_env_setup#

pw_hdlc#

pw_ide#

pw_kvs#

The new pw::kvs::FlashMemory::EndOfWrittenData() method returns the first byte of erased flash that has no more written bytes.

pw_persistent_ram#

pw_polyfill#

pw_polyfill/static_assert.h now provides a C23-style static_assert(). See static_assert.

pw_preprocessor#

The new PW_ADD_OVERFLOW, PW_SUB_OVERFLOW, and PW_MUL_OVERFLOW macros can be used to check for integer overflows.

pw_presubmit#

pw_protobuf#

pw_thread#

pw_tokenizer#

A longstanding GCC bug that caused tokenized logging within a function template to not work has been fixed.

pw_tool#

This incomplete module has been deleted.

pw_toolchain_bazel#

The //pw_toolchain_bazel directory is now configured to be compiled as a standalone Bazel module. Initial support for pw_cc_feature has been added, which completes the initial set of rules required for building toolchains with pw_toolchain_bazel.

pw_transfer#

The C++ client for pw_transfer now uses handles for cancellation.

pw_web#

Build#

Targets#

host_device_simulator#

Docs#

SEEDs#

Miscellaneous#

Jan 12, 2024#

Highlights (Dec 29, 2023 to Jan 12, 2024):

  • pw_allocator added parameter to make it easier to work with allocation metadata in a block’s header and made it easier to omit flag-related code for blocks.

  • pw_cc_library has been replaced with the Bazel-native cc_library.

  • pw_thread_stl disallowed std::thread::detach() on Windows because it’s known to randomly hang indefinitely.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

A new template parameter, kNumExtraBytes, was added to Block. This parameter reserves space in the block’s header for storing and fetching allocation metadata.

The kMaxSize parameter was removed from Block and replaced by kNumFlags to make it easier to omit flag-related code when not needed and define fewer block types rather than one for each allocation pool size.

pw_bluetooth_sapphire#

pw_containers#

pw_doctor#

pw_emu#

pw_env_setup#

pw_ide#

The new pigweed.enforceExtensionRecommendations configuration option for VS Code makes extension recommendation enforcement optional. When you set this flag to true in your project’s extension.json, recommended extensions will need to be installed and non-recommended extensions will need to be disabled.

You can now submit Pigweed issues through VS Code. Open the Command Palette and type Pigweed: File Bug.

pw_log#

The Python API of the log decoder now accepts a logging.Logger or logging.LoggerAdapter instance as the default device logger. Previously it only accepted logging.Logger.

pw_log_zephyr#

pw_multibuf#

pw_protobuf#

pw_rpc#

The new PW_RPC_METHOD_STORES_TYPE config option provides a way at runtime to determine a method’s type. This is useful when implementing a translation layer from another RPC system. Most Pigweed projects won’t need this feature so it’s disabled by default.

pw_stream#

pw_system#

See pw_log.

pw_thread_stl#

Using std::thread::detach() on Windows has been disallowed. When compiling with MinGW on Windows, std::thread::detach() is known to randomly hang indefinitely.

pw_tokenizer#

pw_toolchain#

pw_toolchain now adds -fno-ms-compatibility to cflags on Windows. When building with clang on Windows targeting msvc, clang previously enabled a ms-compatibility mode that broke Pigweed’s macro magic.

pw_unit_test#

pw_web#

Build#

Bazel#

All modules now support the injection of module configuration via label_flags.

pw_cc_library has been replaced with the Bazel-native cc_library.

OS support#

Zephyr#

You can now enable the pw_thread/sleep.h library in your Zephyr project by setting CONFIG_PIGWEED_THREAD_SLEEP=Y in your Kconfig.

Docs#

SEEDs#

Dec 29, 2023#

Highlights (Dec 15, 2023 to Dec 29, 2023):

  • The new pw::allocator::MultiplexAllocator abstract class makes it easier to dispatch between allocators depending on an app-specific request type ID.

  • pw_base64 now has initial Rust support.

  • pw_malloc_freertos, a new FreeRTOS backend for pw_malloc, was added.

  • The new pw::digital_io::Polarity helper enum makes it easier for backends to map logical levels to physical levels.

  • The Rust macro tokenize_to_buffer! in the pw_tokenizer Rust crate now supports concatenation of format strings via the PW_FMT_CONCAT operator.

  • The pw_hdlc and pw_result docs were updated to follow our latest Module docs contributor guidelines.

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_allocator#

The new pw::allocator::MultiplexAllocator abstract class makes it easier to dispatch between allocators depending on an app-specific request type ID.

pw_base64#

pw_base64 now has initial Rust support. See Crate pw_base64.

pw_containers#

pw_digital_io#

pw::digital_io::Polarity was added to make it easier for backends to map logical levels to physical levels.

pw_emu#

pw_hdlc#

pw_malloc#

pw_malloc_freertos, a FreeRTOS backend for pw_malloc was added.

pw_presubmit#

pw_result#

pw_rpc#

pw_snapshot#

pw_thread_stl#

pw_tokenizer#

The Rust macro tokenize_to_buffer! now supports concatenation of format strings via the PW_FMT_CONCAT operator.

pw_toolchain#

The need to provide an unknown value for various pw_cc_toolchain fields has been removed.

pw_transfer#

pw_unit_test#

pw_watch#

pw_web#

SEEDs#

Dec 15, 2023#

Highlights (Dec 1, 2023 to Dec 15, 2023):

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_alignment#

pw_allocator#

pw_analog#

pw_async2#

We started implementing our new async API, pw_async2.

pw_base64#

pw_blob_store#

pw_bluetooth#

pw_bluetooth_sapphire#

pw_build#

pw_bytes#

pw_checksum#

pw_chrono#

pw_cli#

You can now disable the printing of the banner by setting PW_ENVSETUP_QUIET or PW_ENVSETUP_NO_BANNER.

pw_console#

pw_containers#

pw_digital_io#

pw_docgen#

We updated the docs server to use native hot reloading.

pw_emu#

We’re handling QEMU startup errors more gracefully now.

pw_env_setup#

The upstream Pigweed bootstrap script now runs npm install. We worked on native macOS support that doesn’t rely on Rosetta. Use the --disable-rosetta flag to try it out. Note that the work isn’t complete yet.

pw_file#

pw_format#

Format strings can now be built by macros at compile-time by specifying the format string as a set of string literals separated by the custom PW_FMT_CONCAT keyword.

pw_fuzzer#

pw_hdlc#

pw_hex_dump#

pw_i2c#

pw_ide#

pw_ide now handles additional clang toolchains if your project specifies one that’s different from the one provided by Pigweed. We also shipped several UX improvements to the Visual Studio Code extension.

pw_kvs#

pw_libc#

pw_log#

pw_malloc#

pw_metric#

pw_perf_test#

pw_presubmit#

pw_random#

pw_result#

pw_rust#

pw_snapshot#

pw_status#

pw_string#

pw_symbolizer#

pw_system#

We added an extra logging channel.

pw_thread#

pw_tls_client#

pw_tokenizer#

pw_toolchain#

The Arm GCC toolchain now uses pw_toolchain_bazel.

pw_toolchain_bazel#

Support for additional_files was added to reduce *_files boilerplate. We added a new get started guide.

pw_trace#

pw_transfer#

We added support for setting different timeouts for clients and servers. See PW_TRANSFER_DEFAULT_MAX_CLIENT_RETRIES and PW_TRANSFER_DEFAULT_MAX_SERVER_RETRIES in Module Configuration Options.

pw_unit_test#

We deprecated use of gtest/gtest.h header paths for tests intended to build against pw_unit_test. Historically, we supported using the gtest/gtest.h include path to support compiling a test as either a pw_unit_test or with the full GoogleTest on larger targets like desktop. However, this created a problem since pw_unit_test only implements a subset of the GoogleTest API. With the new approach, we require tests that are intended to compile on devices to directly include pw_unit_test/framework.h. In cases where GoogleTest is available, that header will redirect to GoogleTest.

pw_varint#

pw_web#

Build#

Targets#

Language support#

OS support#

Docs#

SEEDs#

Miscellaneous#

Dec 1, 2023#

Highlights (Nov 17, 2023 to Dec 1, 2023):

Active SEEDs#

Help shape the future of Pigweed! Please visit SEED Index and leave feedback on the RFCs (i.e. SEEDs) marked Open for Comments.

Modules#

pw_alignment#

The docs were updated to follow our new Module docs contributor guidelines.

pw_allocator#

Utilities were added that make it easier to write tests for custom allocator implementations. The metric collection API was refactored. CMake support for heap poisoning was added.

pw_bluetooth#

pw_bluetooth_sapphire#

Migration of pw_bluetooth_sapphire into Pigweed has begun.

pw_build_info#

pw_containers#

A warning was added about pw::Vector being unsafe with non-trivially-destructible, self-referencing types. See b/313899658.

pw_format#

A core::fmt macro helper was added.

pw_log#

An initial Rust API has been added.

pw_multibuf#

pw_package#

pw_perf_test#

The docs have been refactored.

pw_presubmit#

pw_protobuf#

pw_rpc#

pw_rpc_transport#

pw_sensor#

pw_status#

The docs have been refactored to follow our latest Module docs contributor guidelines.

pw_string#

pw_system#

pw_tokenizer#

pw_toolchain#

The Arm toolchain has been updated to use the new toolchain specified in 0113: Add modular Bazel C/C++ toolchain API. A helper for registering C/C++ toolchains in Bazel was added to enable upstream Pigweed to make changes without needing to manually update downstream projects. See Upstream Pigweed Toolchains.

pw_toolchain/arm_clang#

pw_toolchain_bazel#

Support for binding tools to toolchains was added. See pw_cc_tool and pw_cc_action_config. Support for featureless sysroots was added. See pw_cc_toolchain.builtin_sysroot and pw_cc_toolchain.cxx_builtin_include_directories.

pw_transfer#

Commands in the integration test docs were updated and docs were added that explain how to run more than one instance of tests in parallel.

pw_unit_test#

pw_web#

Build#

Bazel#

More Bazel information has been added to Module Structure.

Docs#

The tool that we use to semi-automate these changelog updates has been added to the main Pigweed repository. Try out the tool on Changelog updates and see //docs/_static/js/changelog.js to view its implementation.

SEEDs#

We now have an auto-generated SEED Index that shows you the current status of all SEEDs.

Third party#

Nov 15, 2023#

Highlights (Nov 02, 2023 to Nov 15, 2023):

  • The API for writing proc macros with pw_format was simplified.

  • pw_emu added a command for resuming the execution of paused emulators and now has limited support for inserting environment variables into configuration entries.

  • pw_ide can now output logs to files.

  • pw_unit_test added support for GoogleTest’s ASSERT_OK_AND_ASSIGN, StatusIs, and IsOkAndHolds.

  • Pigweed’s Mission & philosophies are now documented.

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_allocator#

The ...Unchecked methods have been removed from the pw::allocator::Allocator interface and the NVI-style Do... methods have been modified to take Layout parameters.

pw_analog#

pw_console#

SocketClient has been updated to support both IPv4 and IPv6 addresses in addition to Unix sockets.

pw_emu#

There is now limited supported for inserting environment variable values into configuration entries. A command for resuming the execution of a paused emulator was added.

pw_env_setup#

pw_format#

The API for writing proc macros that take format strings and arguments was simplified.

pw_fuzzer#

pw_i2c#

pw_ide#

Logs can now be output to files.

pw_perf_test#

pw_presubmit#

pw_stream#

pw_system#

pw_system_demo#

pw_tokenizer#

pw_toolchain#

pw_toolchain_bazel#

Core building blocks from the 0113: Add modular Bazel C/C++ toolchain API plan were implemented: pw_cc_flag_set and pw_cc_flag_group.

pw_trace_tokenized#

pw_transfer#

There’s been a concerted effort to reduce pw_transfer test flakiness.

pw_unit_test#

The Expectations and Assertions APIs were documented. Support for GoogleTest’s ASSERT_OK_AND_ASSIGN, StatusIs, and IsOkAndHolds was added.

pw_watch#

Support for httpwatcher was removed because it’s not supported on modern versions of Python.

pw_web#

The log viewer has been polished and testing has been enhanced.

Build#

Bazel#

Targets#

Language support#

Docs#

A document about Pigweed’s Mission & philosophies was added. The style guide was split into multiple pages.

SEEDs#

Nov 3, 2023#

Highlights (Oct 19, 2023 to Nov 3, 2023):

  • A lot more of the pw::multibuf::Chunk API was implemented.

  • pw_format is a new module dedicated to Rust format string parsing.

  • The tokenizer prefix is now configurable via PW_TOKENIZER_NESTED_PREFIX_STR.

  • References to C++14 have been removed throughout the codebase. Pigweed no longer supports C++14; C++17 or newer is required.

  • The upstream Pigweed GN build is now more isolated so that downstream projects have less conflicts when importing Pigweed into their existing GN build.

  • Build configuration is moving away from Bazel macros like pw_cc_library and towards the toolchain configuration so that downstream projects can have full control over how Pigweed libraries are built.

  • New guidelines for authoring module docs have been published at Module docs contributor guidelines. pw_string is now an example of a “golden” module docs set that follows the new guidelines. Please leave feedback on the new guidelines (and module docs updated to follow the guidelines) in issue #309123039.

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_allocator#

The docs now have an auto-generated size report. pw::allocator::SplitFreeListAllocator has a new blocks() method for getting the range of blocks being tracked. The class was also refactored to use the existing Block API. The Block API itself was refactored to encode offsets and flags into fields.

pw_arduino_build#

pw_assert#

pw_bluetooth#

More Emboss definitions were added.

pw_build#

Pigweed used to inject a selection of recommended configs into every pw_* C/C++ target in the GN build. These were previously only possible to remove with the remove_configs argument. These configs are now bundled with toolchains instead, and if you don’t use a Pigweed-style toolchain you’ll no longer need to find ways to strip the default configs from Pigweed build rules. More importantly, this changes makes Pigweed’s recommended configs behave identically to other toolchain configs, and they’re now more clearly part of GN toolchain definitions. This change is transparent to most projects, but some Pigweed customers have been asking for this for a while.

The empty_cc_library Bazel utility was added.

pw_bytes#

A new _b literal was added to make it easier to create bytes for tests and constants.

pw_containers#

The reference docs for the variable length entry queue API in C and Python were updated.

pw_digital_io_mcuxpresso#

pw_doctor#

pw_emu#

pw_env_setup#

pip has been pinned to 23.2.1 and pip-tools to 7.3.0 to prevent dependency resolution problems.

pw_format#

pw_format is a new module dedicated to Rust format string parsing.

pw_fuzzer#

pw_hdlc#

Using read callbacks in RpcClient is no longer accepted and the use of CancellableReader is now enforced because it provides a safe and clean shutdown process.

pw_libcxx#

pw_libcxx is a new module that provides libcxx symbols and will eventually facilitate pulling in headers as well.

pw_log#

A Bazel label flag was added to Bazel to avoid circular dependencies.

pw_multibuf#

A lot more of the pw::multibuf::Chunk API was implemented.

pw_package#

pw_presubmit#

A CSS formatter was added.

pw_protobuf#

pw_rpc#

pw::rpc::SynchronousCallFor() now supports DynamicClient.

pw_string#

The docs were updated to match the new Module docs contributor guidelines.

pw_sys_io#

Backends that depend on default_putget_bytes were updated to express the dependency.

pw_system#

See pw_hdlc for an explanation of the CancellableReader change.

pw_tls_client#

pw_tokenizer#

The tokenizer prefix is now configurable via PW_TOKENIZER_NESTED_PREFIX_STR.

pw_toolchain#

You can now set the dir_pw_third_party_builtins GN var to your compiler-rt/builtins checkout to enable buildings LLVM builtins from source instead of relying on a shipped libgcc.

pw_unit_test#

pw_web#

Build#

References to C++14 have been removed throughout the codebase. Pigweed no longer supports C++14; C++17 or newer is required.

Bazel#

Build configuration is moving away from Bazel macros like pw_cc_library and towards the toolchain configuration so that downstream projects can have full control over how Pigweed libraries are built.

Targets#

pw_assert_BACKEND for host was set to print_and_abort_check_backend to enable compatibility with GoogleTest death tests.

OS support#

Docs#

New guidelines for authoring module docs have been published at Module docs contributor guidelines. pw_string is now an example of a “golden” module docs set that follows the new guidelines. Please leave feedback on the new guidelines (and module docs updated to follow the guidelines) in issue #309123039.

There’s now a definition for Facade in the glossary.

SEEDs#

Third party#

Oct 20, 2023#

Highlights (Oct 5, 2023 to Oct 20, 2023):

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_allocator#

The new pw::allocator::UniquePtr class offers a safer, simpler RAII API for allocating individual values within an allocator.

pw_async#

pw_async_basic#

pw_bluetooth#

pw_build#

pw_linker_script now describes how to work with linker scripts.

pw_chre#

pw_cli#

pw_digital_io#

pw_emu#

The module has launched! Check out pw_emu to get started.

pw_env_setup#

pw_function#

pw_hdlc#

RPC now has much more information on how to use pw_hdlc for RPC in Python.

pw_i2c#

pw_kvs#

The new FlashPartitionWithLogicalSectors variant of FlashPartition supports combining multiple physical FlashMemory sectors into a single logical FlashPartition sector.

pw_log_tokenized#

Tokenized log arguments are now supported. See 0105: Nested Tokens and Tokenized Log Arguments for background.

pw_log_zephyr#

pw_minimal_cpp_stdlib#

pw_package#

pw_presubmit#

Presubmit checks has more guidance on when to use --base and --full.

pw_snapshot#

pw_spi#

pw_sync_zephyr#

pw_system#

The Device class’s constructor now accepts a logger argument that enables you to specify which logger should be used.

pw_third_party_freertos#

pw_thread#

pw_thread_freertos#

pw_tokenizer#

Integrating with Bazel / GN / CMake projects has new guidance around configuring linker scripts in Bazel.

pw_toolchain#

pw_transfer#

pw_web#

Build#

Bazel#

Targets#

OS support#

Docs#

SEEDs#

A few SEEDs were accepted and a few more started.

Third party#

Miscellaneous#

Oct 6, 2023#

Highlights (Sep 21, 2023 to Oct 6, 2023):

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_allocator#

We added a bunch of new allocator APIs! AllocatorMetricProxy is a wrapper for Allocator that tracks the number and total of current memory allocations as well as peak memory usage. LibCAllocator is an allocator that uses malloc() and free(). NullAllocator is an allocator that always fails which is useful for disallowing memory allocations under certain circumstances. SplitFreeListAllocator uses a free list to reduce fragmentation. FallbackAllocator enables you to specify primary and secondary allocators.

pw_analog#

pw_async#

pw_bloat#

pw_size_report() has a new json_key_prefix argument which is an optional prefix for key names in JSON size reports and a new full_json_summary argument which provides more control over how much detail is provided in a JSON size report.

pw_bluetooth#

pw_build#

pw_chre#

pw_chrono#

pw_chrono_rp2040#

This module is a new pw::chrono::SystemClock backend for RP2040.

pw_cli#

pw_containers#

There’s a new C implementation for VariableLengthEntryDeque which is a double-ended queue buffer that stores variable-length entries inline in a circular (ring) buffer. The old VariableLengthEntryDeque was renamed to VariableLengthEntryQueue.

pw_digital_io_rp2040#

This module is a new RP2040 backend for pw_digital_io.

pw_env_setup#

We made the Pigweed bootstrap process on Windows more robust.

pw_hdlc#

The new CancellableReader class is a new interface for receiving RPC packets that guarantees its read process can be stopped.

pw_i2c#

pw_kvs#

The new FlashPartitionWithLogicalSectors C++ class supports combining multiple physical FlashMemory sectors into a single logical FlashPartition sector.

pw_libc#

pw_metric#

pw_minimal_cpp_stdlib#

pw_perf_test#

pw_presubmit#

pw_ring_buffer#

pw_rpc#

If dynamic allocation is enabled via PW_RPC_DYNAMIC_ALLOCATION a new DynamicClient is now generated which dynamically allocates the call object with PW_RPC_MAKE_UNIQUE_PTR.

pw_rpc_transport#

pw_stream#

pw_stream now has initial support for winsock2.

pw_sys_io_rp2040#

pw_tokenizer#

The Python backend now supports nested hashing tokenization. See Tokenize nested arguments.

pw_toolchain#

pw_transfer#

pw_unit_test#

pw_watch#

pw_web#

Build#

Bazel#

Docs#

We started a glossary and added new docs about rollers and CI/CQ.

SEEDs#

Miscellaneous#

pigweed.json#

Sep 22, 2023#

Highlights (Sep 07, 2023 to Sep 22, 2023):

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw function#

pw perf_test#

pw_analog#

pw_async#

The Run*() methods of FakeDispatcher now return a boolean that indicates whether any tasks were invoked.

pw_async_basic#

release() is now only called outside of locked contexts to prevent an issue where the thread wakes up and then immediately goes back to sleep. An unnecessary 5-second wakeup has been removed from BasicDispatcher.

pw_base64#

The new pw::base64::IsValidChar() method can help you determine if a character is valid Base64.

pw_bluetooth#

More Emboss definitions were added.

pw_build#

pw_bytes#

The AlignDown(), AlignUp(), and Padding() methods of pw_kvs have moved to pw_bytes to enable pw_allocator to use them without taking a dependency on pw_kvs.

pw_checksum#

pw_chre#

The implementation of a module that will enable to work more seamlessly with Android’s Context Hub Runtime Environment has begun.

pw_console#

When invoking pw_console directly from Python, you can now provide arguments through an argparse.Namespace instead of messing with sys.argv or forking another process.

pw_containers#

MemorySanitizer has been disabled in some of the InlineDeque implementation to prevent some false positive detections of uninitialized memory reads.

pw_env_setup#

Work continues on making the Windows bootstrap process more robust.

pw_function#

The documentation has been updated for accuracy.

pw_fuzzer#

Conditional logic around fuzzing support has been refactored to allow for dedicated targets based on specific conditions and to make it clearer exactly what configurations and dependencies are being used.

pw_ide#

pw_libc#

The initial implementation work continues.

pw_log#

The implementation work continues to enable an Android component to read logs from a component running the pw_log_rpc service.

pw_log_string#

pw_package#

Mirrors are now being used for various third-party dependencies.

pw_polyfill#

pw_presubmit#

A new JSON formatting check has been added. The missing newline check has been made more robust.

pw_protobuf#

pw_rpc#

pw::rpc::SynchronousCall now supports the use of custom response message classes that set field callbacks in their constructor. See Client synchronous call wrappers.

pw_stream#

pw_string#

pw_system#

pw_thread#

pw_tokenizer#

pw::tokenizer::Detokenizer has new DetokenizeBase64Message() and DetokenizeBase64() methods for detokenizing Base64-encoded strings. The new pw_tokenizer_EncodeInt() and pw_tokenizer_EncodeInt64() functions in the C API make it easier to manually encode tokenized messages with integers from C.

pw_toolchain#

arm_gcc now supports Cortex-M33.

pw_toolchain_bazel#

pw_varint#

The C encoding functions now have an output size argument, making them much easier to use. There’s a new macro for calculating the encoded size of an integer in a C constant expression. Incremental versions of the encode and decode functions have been exposed to support in-place encoding and decoding with non-contiguous buffers.

pw_web#

The ProgressStats and ProgressCallback types are now exported. Styling and scrolling behavior in the log viewer has been improved.

pw_work_queue#

Build#

Bazel#

Targets#

Docs#

The new Code review guidelines document outlines the upstream Pigweed code review process.

SEEDs#

Third party#

third_party/fuchsia#

third_party/pico_sdk#

Miscellaneous#

Sep 8, 2023#

Highlights (Aug 25, 2023 to Sep 8, 2023):

  • SEED 0107: Pigweed Communications has been approved! Pigweed will adopt a new sockets API as its primary networking abstraction. The sockets API will be backed by a new, lightweight embedded-focused network protocol stack inspired by TCP/IP.

  • SEED 0108: Emulators Frontend has also been approved! Coming soon, the new pw_emu module will make it easier to work with emulators.

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_assert#

We fixed circular dependencies in Bazel.

pw_bluetooth#

We added Emboss definitions.

pw_build#

pw_build_mcuxpresso#

pw_cpu_exception#

We added Bazel support.

pw_crypto#

The complete pw_crypto API reference is now documented on pw_crypto.

pw_env_setup#

Banners should not print correctly on Windows.

pw_file#

pw_function#

The pw::bind_member() template is now exposed in the public API. bind_member() is useful for binding the this argument of a callable. We added a section to the docs explaining why pw::Function is not a literal.

pw_fuzzer#

We refactored pw_fuzzer logic to be more robust and expanded the pw_fuzzer: Using OSS-Fuzz doc.

pw_i2c#

pw_kvs#

We are discouraging the use of the shorter macros because they collide with Abseil’s logging API.

pw_libc#

snprintf() support was added.

pw_log_string#

We added more detail to pw_log_string.

pw_log_zephyr#

It’s now possible to define pw_log_tokenized_HandleLog() outside of Pigweed so that Zephyr projects have more flexibility around how they capture tokenized logs.

pw_package#

pw_persistent_ram#

pw_presubmit#

We added a reStructuredText formatter.

pw_protobuf#

max_size and max_count are now exposed in generated headers. The new proto_message_field_props() helper function makes it easier to iterate through a messages fields and properties.

pw_random#

We’re now auto-generating the XorShiftStarRng64 API reference via Doxygen.

pw_rpc#

The new request_completion() method in Python enables you to send a completion packet for server streaming calls.

pw_spi#

pw_symbolizer#

The LlvmSymbolizer Python class has a new close() method to deterministically close the background process.

pw_sync#

We added GenericBasicLockable.

pw_system#

pw_system now supports different channels for primary and logging RPC.

pw_thread_freertos#

pw_tokenizer#

We added PW_TOKENIZE_FORMAT_STRING_ANY_ARG_COUNT and PW_TOKENIZER_REPLACE_FORMAT_STRING. We refactored the docs so that you don’t have to jump around the docs as much when learning about key topics like tokenization and token databases. Database loads now happen in a separate thread to avoid blocking the main thread. Change detection for directory databases now works more as expected. The config API is now exposed in the API reference.

pw_unit_test#

We added testing::Test::HasFailure(), FRIEND_TEST, and << messages to improve gTest compatibility.

pw_varint#

pw_varint now has a C-only API.

pw_web#

Logs can now be downloaded as plaintext.

Build#

Bazel#

Docs#

SEEDs#

Third party#

Miscellaneous#

mimxrt595_evk_freertos#

Aug 25, 2023#

Highlights (Aug 11, 2023 to Aug 25, 2023):

  • pw_tokenizer now has Rust support.

  • The pw_web log viewer now has advanced filtering and a jump-to-bottom button.

  • The run_tests() method of pw_unit_test now returns a new TestRecord dataclass which provides more detailed information about the test run.

  • A new Ambiq Apollo4 target that uses the Ambiq Suite SDK and FreeRTOS has been added.

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_bloat#

pw_bluetooth#

The Emboss files were refactored.

pw_build#

The pw_build docs were split up so that each build system has its own page now. The new output_logs flag enables you to not output logs for pw_python_venv.

pw_cli#

pw_console#

pw_containers#

pw_docgen#

Docs builds should be faster now because Sphinx has been configured to use all available cores.

pw_env_setup#

Sphinx was updated from v5.3.0 to v7.1.2. We switched back to the upstream Furo theme and updated to v2023.8.19. The content of pigweed_environment.gni now gets logged. There was an update to ensure that arm-none-eabi-gdb errors propagate correctly. There is now a way to override Bazel build files for CIPD repos.

pw_function#

pw_fuzzer#

pw_hdlc#

A new close() method was added to HdlcRpcClient to signal to the thread to stop.

pw_ide#

A new --install-editable flag was added to install Pigweed Python modules in editable mode so that code changes are instantly realized.

pw_perf_test#

pw_presubmit#

pw_presubmit now has an ESLint check for linting and a Prettier check for formatting JavaScript and TypeScript files.

pw_rpc#

A request_completion() method was added to the ServerStreamingCall Python API. A bug was fixed related to encoding failures when dynamic buffers are enabled.

pw_rpc_transport#

pw_rust#

pw_stm32cube_build#

pw_stream#

Error codes were updated to be more accurate and descriptive.

pw_stream_uart_linux#

Common baud rates such as 9600, 19200, and so on are now supported.

pw_sync#

Tests were added to make sure that pw::sync::Borrowable works with lock annotations.

pw_system#

The pw_system.device.Device Python class can now be used as a context manager.

pw_tokenizer#

pw_tokenizer now has Rust support. The pw_tokenizer C++ config API is now documented at Configuration and the C++ token database API is now documented at Token databases. When creating a token database, parent directories are now automatically created if they don’t already exist. PrefixedMessageDecoder has been renamed to NestedMessageDecoder.

pw_toolchain#

A new Linux host toolchain built using pw_toolchain_bazel has been started. CIPD-provided Rust toolchains are now being used.

pw_unit_test#

run_tests() now returns the new TestRecord dataclass which provides more detailed information about the test run. SetUpTestSuit() and TearDownTestSuite() were added to improve GoogleTest compatibility.

pw_web#

Log viewers are now drawn every 100 milliseconds at most to prevent crashes when many logs arrive simultaneously. The log viewer now has a jump-to-bottom button. Advanced filtering has been added.

Targets#

targets#

A new Ambiq Apollo4 target that uses the Ambiq Suite SDK and FreeRTOS has been added.

Language support#

Python#

Docs#

Doxygen-generated function signatures now present each argument on a separate line. Tabbed content looks visually different than before.

SEEDs#

SEED-0107 (Pigweed Communications) was accepted and SEED-0109 (Communication Buffers) was started.

Miscellaneous#

Build#

soong#

Aug 11, 2023#

Highlights (Jul 27, 2023 to Aug 11, 2023):

  • We’re prototyping a Pigweed extension for VS Code. Learn more at Visual Studio Code.

  • We added pw_toolchain_bazel, a new LLVM toolchain for building with Bazel on macOS.

  • We are working on many docs improvements in parallel: auto-generating rustdocs for modules that support Rust (example), refactoring the pw_tokenizer docs, migrating API references to Doxygen, fixing longstanding docs site UI issues, and more.

Active SEEDs#

Help shape the future of Pigweed! Please leave feedback on the following active RFCs (SEEDs):

Modules#

pw_alignment#

pw_analog#

Long-term, all of our API references will be generated from header comments via Doxygen. Short-term, we are starting to show header files directly within the docs as a stopgap solution for helping Pigweed users get a sense of each module’s API. See pw_analog for an example.

pw_base64#

We finished migrating the pw_random API reference to Doxygen.

pw_boot_cortex_m#

pw_build#

We added a log_build_steps option to ProjectBuilder that enables you to log all build step lines to your screen and logfiles.

pw_cli#

We polished tab completion support.

pw_console#

We made copy-to-clipboard functionality more robust when running pw_console over SSH.

pw_containers#

We updated filteredview constructors and migrated the FilteredView API reference to Doxygen.

pw_docgen#

At the top of pages like pw_tokenizer there is a UI widget that provides information about the module. Previously, this UI widget had links to all the module’s docs. This is no longer needed now that the site nav automatically scrolls to the page you’re on, which allows you to see the module’s other docs.

pw_env_setup#

We made Python setup more flexible.

pw_ide#

We are prototyping a pw_ide extension for VS Code.

pw_interrupt#

We added a backend for Xtensa processors.

pw_log_zephyr#

We encoded tokenized messages to pw::InlineString so that the output is always null-terminated.

pw_presubmit#

We increased LUCI support and updated the #pragma once check to look for matching #ifndef and #define lines.

pw_protobuf_compiler#

We continued work to ensure that the Python environment in Bazel is hermetic.

pw_python#

We fixed bugs related to requirements.txt files not getting found.

pw_random#

We continued migrating the pw_random API reference to Doxygen.

pw_rpc#

We made the Java client more robust.

pw_spi#

We continued work on implementing a SPI responder interface.

pw_status#

We fixed the nesting on a documentation section.

pw_stream#

We added remaining(), len(), and position() methods to the Cursor wrapping in Rust.

pw_stream_shmem_mcuxpresso#

We added the pw_stream_shmem_mcuxpresso backend for pw_stream.

pw_sync_freertos#

pw_thread#

pw_tokenizer#

We added support for unaligned token databases and continued the 0102: Consistent Module Documentation update of the pw_tokenizer docs.

pw_toolchain#

We fixed a regression that made it harder to use Pigweed in an environment where pw_env_setup has not been run and fixed a bug related to incorrect Clang linking.

pw_toolchain_bazel#

We added a an LLVM toolchain for building with Bazel on macOS.

pw_trace_tokenized#

We made tracing more robust.

pw_transfer#

We made integration tests more robust.

pw_web#

We added support for storing user preferences in localStorage.

Build#

We made the Bazel system more hermetic and fixed an error related to not finding the Java runtime.

Docs#

We created a new doc that explains how to improve Pigweed support in various IDEs. We standardized how we present call-to-action buttons on module homepages. See pw_tokenizer for an example. We fixed a longstanding UI issue around the site nav not scrolling to the page that you’re currently on.

SEEDs#

We created a UI widget to standardize how we present SEED status information. See the start of 0102: Consistent Module Documentation for an example.

Third party#

third_party/mbedtls#

Miscellaneous#

OWNERS#

Jul 28, 2023#

Highlights (Jul 13, 2023 to Jul 28, 2023):

  • SEED-0107: Pigweed Communications, a proposal for an embedded-focused network protocol stack, is under discussion. Please review and provide your input!

  • pw_cli now supports tab completion!

  • A new UART Linux backend for pw_stream was added (pw_stream_uart_linux).

Active SEEDs#

Modules#

pw_allocator#

We started migrating the pw_allocator API reference to Doxygen.

pw_async#

We increased Bazel support.

pw_async_basic#

We reduced logging noisiness.

pw_base64#

We continued migrating the pw_base64 API reference to Doxygen.

pw_bloat#

We improved the performance of label creation. One benchmark moved from 120 seconds to 0.02 seconds!

pw_bluetooth#

Support for 3 events was added.

pw_build#

pw_build_mcuxpresso#

Some H3 elements in the pw_build_mcuxpresso docs were being incorrectly rendered as H2.

pw_chrono_freertos#

We investigated what appeared to be a race condition but turned out to be an unreliable FreeRTOS variable.

pw_cli#

pw_cli now supports tab completion!

pw_console#

Communication errors are now handled more gracefully.

pw_containers#

The flat map implementation and docs have been improved.

pw_digital_io#

We continued migrating the API reference to Doxygen. An RPC service was added.

pw_digital_io_mcuxpresso#

We continued migrating the API reference to Doxygen. Support for a new RPC service was added.

pw_docgen#

Support for auto-linking to Rust docs (when available) was added. We also explained how to debug Pigweed’s Sphinx extensions.

pw_env_setup#

There were lots of updates around how the Pigweed environment uses Python.

pw_fuzzer#

A fuzzer example was updated to more closely follow Pigweed code conventions.

pw_hdlc#

Communication errors are now handled more gracefully.

pw_i2c#

An RPC service was added. Docs and code comments were updated to use responder and initiator terminology consistently.

pw_i2c_mcuxpresso#

pw_ide#

pw_interrupt#

Work continued on how facade backend selection works in Bazel.

pw_log_rpc#

A docs section was added that explains how pw_log, pw_log_tokenized, and pw_log_rpc interact with each other.

pw_package#

Raspberry Pi Pico and Zephyr support improved.

pw_perf_test#

pw_presubmit#

pw_protobuf_compiler#

pw_ring_buffer#

pw_ring_buffer now builds with -Wconversion enabled.

pw_rpc#

pw_rpc_transport#

pw_rust#

We are preparing pigweed.dev to automatically link to auto-generated Rust module documentation when available.

pw_spi#

We updated docs and code comments to use initiator and responder terminology consistently.

pw_status#

pw_stream#

We continued work on Rust support.

pw_stream_uart_linux#

A new UART Linux backend for pw_stream was added.

pw_sync#

C++ lock traits were added and used.

pw_sync_freertos#

pw_sys_io#

pw_system#

pw_tokenizer#

We refactored the pw_tokenizer docs to adhere to 0102: Consistent Module Documentation.

pw_toolchain#

The build system was modified to use relative paths to avoid unintentionally relying on the path environment variable. Map file generation is now optional to avoid generating potentially large map files when they’re not needed.

pw_trace_tokenized#

pw_unit_test#

pw_varint#

pw_watch#

We fixed an issue where builds were getting triggered when files were opened or closed without modication.

pw_web#

Build#

bazel#

build#

Targets#

targets/rp2040_pw_system#

Some of the Pico docs incorrectly referred to another hardware platform.

Language support#

python#

rust#

OS support#

zephyr#

Docs#

We added a feature grid to the homepage and fixed outdated info in various docs.

SEEDs#

SEED-0107#

SEED-0108#

Third party#

third_party#

third_party/mbedtls#