View Source ATECC508A.Transport behaviour (atecc508a v1.2.0)

ATECC508A transport behaviour

Link to this section Summary

Functions

Check whether the ATECC508A is present

Return information about this transport

Send a request to the ATECC508A and wait for a response

Run a callback function inside a transaction that doesn't sleep

Link to this section Types

Link to this section Callbacks

@callback detected?(arg :: any()) :: boolean()
@callback info(id :: any()) :: map()
@callback init(args :: any()) :: {:ok, t()} | {:error, atom()}
Link to this callback

request(id, payload, timeout, response_payload_len)

View Source
@callback request(
  id :: any(),
  payload :: binary(),
  timeout :: non_neg_integer(),
  response_payload_len :: non_neg_integer()
) :: {:ok, binary()} | {:error, atom()}
Link to this callback

transaction(id, callback)

View Source
@callback transaction(
  id :: any(),
  callback :: (request :: (... -> any()) -> {:ok, any()} | {:error, atom()})
) :: {:ok, any()} | {:error, atom()}

Link to this section Functions

@spec detected?(t()) :: boolean()

Check whether the ATECC508A is present

The transport implementation should do the minimum work to figure out whether an ATECC508A is actually present. This is called by users who are unsure whether the device has an ATECC508A and want to check before sending requests to it.

@spec info(t()) :: map()

Return information about this transport

This information is specific to this transport. No fields are required.

Link to this function

request(arg, payload, timeout, response_payload_len)

View Source
@spec request(t(), binary(), non_neg_integer(), non_neg_integer()) ::
  {:ok, binary()} | {:error, atom()}

Send a request to the ATECC508A and wait for a response

This is the raw request. The transport implementation takes care of adding and removing CRCs.

Link to this function

transaction(arg, callback)

View Source
@spec transaction(t(), ((... -> any()) -> {:ok, any()} | {:error, atom()})) ::
  {:ok, any()} | {:error, atom()}

Run a callback function inside a transaction that doesn't sleep

Use a transaction when multiple requests need to be sent without putting the chip to sleep. For example, when a value needs to be stored in SRAM and then acted on, since sleeping will clear the SRAM.

callback is a function that provides one argument, request, and expects a return value of {:ok, data} or {:error, reason}. request is an anonymous function whose args follow the public function ATECC508A.Transport.request/4, except without the first arg (t()) since this is provided to transaction.

The success/error tuple returned by the callback function is returned by transaction.

example

Example

{:ok, transport} = ATECC508A.Transport.I2C.init()

{:ok, signature} =
  ATECC508A.Transport.transaction(transport, fn request ->
    # NONCE command (0x16)
    {:ok, <<0>>} = request.(<<0x16, 0x43, 0, 0, signature_digest::binary>>, 29, 1)
    # SIGN command (0x41)
    request.(<<0x41, 0xA0, 0, 0>>, 115, 64)
  end)