.. include:: Datalogger: A Semi-Realistic Project (Threaded Version) ======================================================= .. topic:: Documentation * :doc:`../why-os/mqtt` .. topic:: Trainer's note * Continue from :doc:`../messagequeue/index` Add Second Sensor (Message Queue) --------------------------------- * Add second sensor * |longrightarrow| From interrupt, communicate sensor name .. attention:: ``std::string_view`` does not *own* |longrightarrow| Lifetime! .. image:: datalogger-two-sensors.svg :scale: 60% .. literalinclude:: code/datalogger-two-sensors.cpp :caption: :download:`code/datalogger-two-sensors.cpp` :language: c++ Add Watchdog ------------ .. topic:: Documentation * :doc:`../why-os/watchdog` * Shift sensor data consumption into a dedicated thread * Feed Watchdog in main thread (which has highest priority) .. image:: datalogger-watchdog.svg :scale: 60% .. literalinclude:: code/datalogger-watchdog.cpp :caption: :download:`code/datalogger-watchdog.cpp` :language: c++ Add CSV And MQTT ---------------- .. topic:: Documentation * :doc:`../why-os/file` * :doc:`../why-os/mqtt` * Add datalogger functionality to consumer thread * Write CSV: ``Why::File`` * Publish on an MQTT topic: ``Why::MQTTPublisher`` .. note:: Both File IO and network IO are notoriously blocking! .. image:: datalogger-csv-mqtt.svg :scale: 60% .. literalinclude:: code/datalogger-csv-mqtt.cpp :caption: :download:`code/datalogger-csv-mqtt.cpp` :language: c++ .. _why-datalogger-snapshot-button: Add Snapshot Button (Message Queue) ----------------------------------- .. image:: datalogger-snapshot-button.svg :scale: 60% * Interrupt from edge triggered GPIO (with hardware debouncing, say |:innocent:|): "create CSV snapshot" * Dedicated handler thread * Use a :doc:`mutex <../why-os/mutex>` to guard CSV file rotation against concurrent CSV writes * Closes and renames file * Creates a new file to use from now on .. note:: As button presses are enqueued .. literalinclude:: code/datalogger-snapshot-button.cpp :caption: :download:`code/datalogger-snapshot-button.cpp` :language: c++