/**
\example hallucination.cpp

Sometimes you'd like to create a packet without immediately sending it
off-board, but the basic printing functions don't provide a mechanism
for that.  As an advanced feature, the #makePacketPrinter function can
be used to create a packet in a (sufficiently large) memory buffer of
your choosing, allowing you to do whatever you want with the resulting
packet.

Using the #makePacketPrinter mechanism is a little bit involved, but
typically boils down to the following steps:
 -# Create a RAM buffer big enough to hold the packet-to-be-printed.
 -# Create variables to hold the pointer to the resulting packet, and
   the assigned virtual face number.
 -# Make the call on #makePacketPrinter(), and store the packet pointer
   and virtual face number into the previously-created variables.
   This is commonly, though not necessarily, done in the #setup()
   method.
 -# Print using the virtual face number.
 -# (Either during the printing or) After the packet is terminated,
   access the printed packet via the stored packet pointer.

As an illustration, this sketch 'hallucinates' that it's receiving 'd'
packets at irregular intervals, when it actually is generating them
itself.  The keys to this sketch are the #makePacketPrinter mechanism
to generate an in-memory packet, and the SBFReactor::trigger()
function (see \ref trigger.cpp).

When run, this sketch generates output along the lines of:

\code
Ln 8.404 Got 'd1' from N
Ln 9.566 Got 'd2' from N
Ln 9.952 Got 'd3' from N
Ln 17.704 Got 'd4' from N
\endcode

which shows the \c handleD packet handler is being invoked, even
though (or when) no actual input packets have been received.

 */
