/**
 \page comms SFB communications and packet functions

 As can be seen in the \ref Tutorials, the SFB has substantial support
 for serial communications and 'packet handling' -- sending out lines
 of text to others, and reacting to lines of text that have been
 received.

 - \subpage packeto "Packet writing functions"

 - \subpage packeti "Packet reading functions"

  \page packeto Packet output

 Packet output, in general, is performed by functions with 'print' in
 their names.

 Basic functions for packet output: 
 - \ref print() Print a string, or a number in various formats, to all
   faces (that are available for serial output)
 - \ref println() To all available faces, print a string, or a number
   in various formats, or nothing, and then end the packet.
 - \ref facePrint() To the specified face, print a string, or a number
   in various formats.
 - \ref facePrintln() To the specified face, print a string, or a number
   in various formats, or nothing, and then end the packet.
 - In addition, output can be directed to a specific face by 
   calling a \c print method on the face, such as
   \code NorthFace.println("cold"); \endcode 

 Intermediate functions for packet output: 
 - \ref printlnCheckByte() To all faces
   available for output, print a 'check byte' and then terminate the
   current packet.
 - \ref facePrintlnCheckByte() To the specified face, print a 'check
   byte' and then terminate the current packet.
 - \ref pprintf() Print, according to a given format, part of a
   packet, or a whole packet or multiple packets, to all faces
   available for output.
 - \ref facePrintf() To the specified face, print according to the
   given format.

 Advanced, low-level, or internal functions affecting packet output:
 - \ref faceFindFreeFace() Find an unused 'virtual face code', if possible
 - \ref faceSetPrinter() Assign a custom printer to a virtual face.
 - \ref faceUnsetPrinter() Deassign any custom printer from a virtual face.

  \page packeti Packet input processing

 When using the SFB packet reflex system, arriving packets are read
 into memory automatically, and are 'dispatched' to the sketch for
 processing.  So in the common case, by the time the sketch becomes
 involved, a packet-read-from-a-face is already complete and sitting
 in memory, ready to be accessed however the sketch wishes to do so.

 Basic functions for accessing received packets:
 - \ref packetLength() The number of bytes in a packet
 - \ref packetSource() The face (e.g., \ref NORTH) from which
   a packet was received.
 - \ref packetRead() Read a number or byte from
   a packet in a variety of format specified by a code.
 - \ref packetReadEOF() Have we read to the end of the packet?
 - \ref zpacketPrefix() Does the given packet begin with the given string?

 Intermediate functions for accessing received packets:
 - \ref packetScanf() Read from the packet according
   to the specified format.
 - \ref packetCursor() The index of the next byte-to-be-read
   within the packet.
 - \ref packetReread() Reset the #packetCursor() back to the
    beginning (or elsewhere), allowing (portions of) the packet to be
    read again.

 Advanced, low-level, or internal functions for accessing received packets:
 - \ref packetReadLength() The number of bytes that can still be
   read from the packet
 - \ref packetCheckByteValid() See if packet ends with a valid
   'check byte'.
 - \ref packetFlags() Access the flags of packet.  
 - \ref packetReadPacket() Read a nested subpacket
   from inside another packet
 - \ref packetReadCheckByte() Read a check byte, that can only
   appear at the end of a packet. 

 */

