| .. _seed-0122: |
| |
| =================================== |
| 0122: Organize Pigweed code samples |
| =================================== |
| .. seed:: |
| :number: 122 |
| :name: Organize Pigweed code samples |
| :status: accepted |
| :proposal_date: 2024-01-09 |
| :cl: 187121 |
| :authors: Ted Pudlik |
| :facilitator: Kayce Basques |
| |
| ------- |
| Summary |
| ------- |
| This SEED describes how Pigweed code samples will be organized. Implementation |
| bug: https://pwbug.dev//322816792. |
| |
| ---------- |
| Motivation |
| ---------- |
| Pigweed users need to see code samples that demonstrate Pigweed in action. |
| However, there are a few different use cases for such code samples. |
| Historically, we've not been explicit about what the use cases are, and how |
| they should be served. This SEED will fill this gap. |
| |
| -------- |
| Proposal |
| -------- |
| |
| Repositories |
| ============ |
| Pigweed will maintain the following types of code sample repositories: |
| |
| * **Quickstart**: `minimal, complete, reproducible |
| <https://stackoverflow.com/help/minimal-reproducible-example>`_ projects you |
| can clone to understand the basics of Pigweed and start a new `greenfield |
| project <https://en.wikipedia.org/wiki/Greenfield_project>`_. There will be |
| one Quickstart repository for each build system that Pigweed supports. |
| * **Examples**: granular, comprehensive code examples of every Pigweed |
| module's API. The Examples repository can also demonstrate core use cases |
| that require using multiple modules together. There will only be one Examples |
| repository. |
| * **Showcase**: Showstopper examples that demonstrate how to use Pigweed |
| to implement complex real-world applications. There will be many Showcase |
| repositories, each demonstrating a different application. These repositories |
| should inspire users, show them how to implement complex integrations, and |
| convince them that Pigweed is the best way to develop embedded projects. |
| |
| Standard board |
| ============== |
| The Quickstart and Examples repositories will eventually focus on a single |
| :ref:`seed-0122-standard-board`. But selecting the standard board is out of the |
| scope of this SEED. |
| |
| --------------- |
| Detailed design |
| --------------- |
| |
| .. _seed-0122-quickstart: |
| |
| Quickstart repository |
| ===================== |
| * **User journeys** these repositories serve: |
| |
| * "I want to clone a minimal repository to create my own project from |
| scratch." |
| * "I want to understand the smallest set of steps needed to add Pigweed as a |
| dependency of my own existing project." |
| * "I'm just getting started with Pigweed and want a tutorial that will |
| put *some* code on device". |
| |
| * **Repository contents**: One repository per build system that demonstrates |
| the minimal set of Pigweed features: |
| |
| #. Bootstrapping (downloading required tools, third-party dependencies, etc). |
| #. Building the minimal, viable, complete (MVC) application for |
| :ref:`target-host` and for the :ref:`seed-0122-standard-board`. |
| #. Flashing the application to the board. |
| #. Communicating with the board via :ref:`module-pw_console`. |
| |
| Determining the exact content of the MVC app is out-of-scope for this SEED. |
| This is the subject of `SEED-0106 |
| <https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/155430>`_. |
| However, every Quickstart repository will implement the same set of MVC |
| features. |
| |
| There will be tutorial documentation associated with each of these |
| repositories, but it will be hosted in pigweed.git. Documentation generation |
| with :ref:`module-pw_docgen` falls outside the scope of Quickstart. |
| |
| We may also add separate Quickstart repositories for boards other than the |
| "standard board". |
| |
| * **Locations**: |
| |
| * https://pigweed.googlesource.com/pigweed/quickstart/bazel.git |
| * https://pigweed.googlesource.com/pigweed/quickstart/gn.git |
| * (No CMake quickstart. We offer support for integrating Pigweed into an |
| existing CMake project, but don't recommend CMake for a greenfield Pigweed |
| project and so have no quickstart repository for it.) |
| |
| .. _seed-0122-examples: |
| |
| Examples repository |
| =================== |
| * **User journeys** this repository serves: |
| |
| * "I want to see an example of how a module's API is used in the context of a |
| full, building project." |
| * "I want to use tokenized logging, how do I hook this up?" |
| * "I read you can customize the :ref:`module-pw_console`, can I see an example?" |
| * "I want to see how to configure a backend of this module." |
| * "How do I use method X from Pigweed module Y?" |
| * "How do I use Pigweed modules A and B together?" |
| |
| * **Repository contents**: One repository that contains a bunch of directories. |
| Each directory is meant to be consulted in isolation. Common use cases such |
| as logging over UART or blinking an LED, may get their own directories. |
| Related examples (e.g., examples for an individual module) may be grouped |
| into a directory hierarchy for clarity. |
| |
| The individual examples may define their own build targets, but they are not |
| expected to set up independent builds. They're all part of one top-level build. |
| |
| In general, it should be possible to build the examples using all of |
| Pigweed's supported build systems (Bazel, CMake, GN). However, if the |
| functionality being exemplified is only supported in some build systems (e.g. |
| :ref:`module-pw_docgen` is only supported in GN as of this writing), then its |
| examples can be restricted to those build systems. |
| |
| Unlike Quickstart, this repository is a reference work: the user is not |
| expected to read through it "from beginning to end". Rather, they will come |
| here to view a specific example. We eventually expect to have hundreds or |
| even thousands of examples. |
| |
| The documentation for the Examples repo will be hosted at http://pigweed.dev, |
| but will be built from source within the ``examples.git`` repo. Building |
| documentation using :ref:`module-pw_docgen` is one of the things we're |
| exemplifying. |
| |
| * **Location**: https://pigweed.googlesource.com/pigweed/examples.git |
| |
| Showcase repositories |
| ===================== |
| * **User journeys** these repositories serve: |
| |
| * "I want to see a cool project built using Pigweed." |
| * "I'm looking for a full-fledged demo of what Pigweed is capable of." |
| * "I'm looking for a Show HN submission." |
| * "I want to convince my team Pigweed is powerful enough for our use case." |
| * "I need proof that Pigweed is a better way to develop embedded projects." |
| * "I need proof that Pigweed is production-ready." |
| |
| * **Repository contents**: One repository per showcase project. These projects |
| are standalone, with documentation that explains what they do. They're not |
| necessarily easy to stand up yourself, and may require custom hardware that's |
| hard to source. :ref:`Kudzu <docs-blog-01-kudzu>` and `Gonk |
| <https://pigweed.googlesource.com/gonk.git>`_ are examples of showcase |
| projects. |
| |
| * **Locations**: Showcase projects can be hosted anywhere. Open-source projects |
| created by third parties and not hosted on https://pigweed.googlesource.com |
| can also be showcases. |
| |
| We will host a list of Showcase projects, with brief descriptions, at |
| https://pigweed.dev/showcase. |
| |
| .. _seed-0122-standard-board: |
| |
| Standard board |
| ============== |
| Pigweed will select a "standard board" for use in our code samples. Today, the |
| de facto standard board is the STM32F429I-DISC1, but we expect to select a |
| different standard board in the near future. Standard board selection will be |
| discussed in a separate followup SEED. |
| |
| ---- |
| FAQs |
| ---- |
| |
| .. _seed-0122-existing-samples: |
| |
| How do existing code samples map to this scheme? |
| ================================================ |
| * `example/echo <https://pigweed.googlesource.com/pigweed/example/echo.git>`_ |
| will be renamed to become :ref:`seed-0122-quickstart` for Bazel. |
| * `sample_project |
| <https://pigweed.googlesource.com/pigweed/sample_project.git>`_ will be |
| renamed and reorganized to become the :ref:`seed-0122-examples`. |
| * `Kudzu <https://pigweed.googlesource.com/pigweed/kudzu.git>`_ and `Gonk |
| <https://pigweed.googlesource.com/gonk.git>`_ are Showcase projects. |
| |
| |
| What about inline code samples in the documentation? |
| ==================================================== |
| We will continue to provide inline code samples in the documentation, and later |
| in 2024 may prototype solutions for ensuring they compile and pass assertions. |
| But this is out of scope for this SEED. |
| |
| -------------- |
| Open questions |
| -------------- |
| A followup SEED will discuss the selection of the "standard board" for Pigweed |
| Quickstart and Examples repositories. |
| |
| The exact feature set of the MVC application demonstrated by the Quickstart |
| repos is the subject of `SEED-0106 |
| <https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/155430>`_. |