aboutsummaryrefslogtreecommitdiff
path: root/lib/pbdrv/pb-mod.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pbdrv/pb-mod.h')
-rw-r--r--lib/pbdrv/pb-mod.h83
1 files changed, 63 insertions, 20 deletions
diff --git a/lib/pbdrv/pb-mod.h b/lib/pbdrv/pb-mod.h
index c4629a6..2ff1908 100644
--- a/lib/pbdrv/pb-mod.h
+++ b/lib/pbdrv/pb-mod.h
@@ -1,31 +1,63 @@
#pragma once
-/**
- * \file puzzle bus driver implementation
- *
- * Most \c pb_* functions have a weak implementation, which may be overwritten
- * by a custom implementation. This allows you to use the default
- * implementation where possible, and only implement extensions required for
- * your puzzle module. Please see spec.adoc for more information about how to
- * use the puzzle bus driver library.
- */
-
#include "pb-types.h"
#ifdef __cplusplus
extern "C" {
#endif
-//! puzzle module name (optional, default = "???")
+/**
+ * \ingroup pbdrv-mod
+ * \defgroup pb_mod Module
+ * \brief Metadata and auxiliary utility functions
+ * \{
+ */
+
+/**
+ * \brief Puzzle module name
+ *
+ * Optional to define, default value is "???"
+ */
extern const char * PB_MOD_NAME;
-//! puzzle module bus address (required)
+/**
+ * \brief Puzzle module bus address
+ *
+ * **Required** to define
+ */
extern const i2c_addr_t PB_MOD_ADDR;
/**
+ * \brief Platform-specific blocking delay function
+ *
+ * FIXME: this should be removed (see handover: RP2040 I2C limitations)
+ */
+void pb_mod_blocking_delay_ms(unsigned long ms);
+
+/// \}
+
+/**
+ * \ingroup pbdrv-mod
+ * \defgroup pb_i2c I2C
+ * \brief I2C send/receive handlers
+ *
+ * If there is no existing \ref pb_drv "driver" for the microcontroller on
+ * which you want to use the puzzle bus driver, you may implement the following
+ * in order to use pbdrv:
+ *
+ * - The \c pb_i2c_recv() function must be **called** for every received I2C
+ * message
+ * - The \c pb_i2c_send() function must be **implemented** using the
+ * platform/device-specific I2C write function
+ *
+ * \{
+ */
+
+/**
* \brief handle a received message from the I2C bus (puzzle bus)
*
* This function attempts to parse an I2C message as a puzzle bus message, and
* calls the appropriate handler for the message if it is considered valid.
+ * Invalid messages are silently ignored.
*
* \param buf pointer to message content
* \param sz size of \p buf
@@ -46,25 +78,36 @@ void pb_i2c_recv(const uint8_t * buf, size_t sz);
*/
void pb_i2c_send(i2c_addr_t i2c_addr, const uint8_t * buf, size_t sz);
+/// \}
+
+/// \ingroup hook
+/// \{
+
+/**
+ * \defgroup pb_hook_mod_state State
+ * \brief Provide your own global state variable
+ *
+ * If your puzzle module defines its own global \c pb_global_state_t, you can
+ * tell the driver to use it by implementing these functions. These functions
+ * are also used internally by the driver when creating \c STATE \c REQ and \c
+ * STATE \c RES commands.
+ *
+ * \{
+ */
+
/**
* \brief global state read hook
- * \ingroup hook
* \return current value of global state enum
*/
pb_global_state_t pb_hook_mod_state_read();
/**
* \brief global state write hook
- * \ingroup hook
* \param state new value of global state enum
*/
void pb_hook_mod_state_write(pb_global_state_t state);
-/**
- * \brief platform-specific blocking delay function
- *
- * FIXME: this should be removed (see handover: RP2040 I2C limitations)
- */
-void pb_mod_blocking_delay_ms(unsigned long ms);
+/// \}
+/// \}
#ifdef __cplusplus
}