// edit packet_states.h to add new packet types
   GROUND_STATE,        // we don't know what packet type to expect

   COMMENT_BODY,        // pound comment for a test load
   COMMENT_RECOGNIZED,  // comment recognized
   NMEA_DOLLAR,         // we've seen first character of NMEA leader

   NMEA_BANG,           // we've seen first character of an AIS message '!'
   NMEA_PUB_LEAD,       // seen second character of NMEA G leader
   NMEA_VENDOR_LEAD,    // seen second character of NMEA P leader
   NMEA_LEADER_END,     // seen end char of NMEA leader, in body
   NMEA_PASHR_A,        // grind through recognizing $PASHR
   NMEA_PASHR_S,        // grind through recognizing $PASHR
   NMEA_PASHR_H,        // grind through recognizing $PASHR
   NMEA_BINARY_BODY,    // Ashtech-style binary packet body, skip until \r\n
   NMEA_BINARY_CR,      // \r on end of Ashtech-style binary packet
   NMEA_BINARY_NL,      // \n on end of Ashtech-style binary packet
   NMEA_CR,             // seen terminating \r of NMEA packet
   NMEA_RECOGNIZED,     // saw trailing \n of NMEA packet

   NMEA_LEAD_A,         // seen A of possible SiRF Ack, or of $AP
   SIRF_ACK_LEAD_2,     // seen c of possible SiRF Ack
   AIS_LEAD_1,          // seen initial A of possible AIS message
   AIS_LEAD_2,          // seen second I/B/N/X of possible AIS message
   AIS_LEAD_ALT1,       // seen initial B of possible AIS message
   AIS_LEAD_ALT2,       // seen second S of possible AIS message
   AIS_LEAD_ALT3,       // seen initial S of possible AIS message
   AIS_LEAD_ALT4,       // seen second A of possible AIS message

   SEATALK_LEAD_1,      // SeaTalk/Garmin packet leader 'I'
   WEATHER_LEAD_1,      // Weather instrument packet leader 'W'
   HEADCOMP_LEAD_1,     // Heading/compass packet leader 'H'
   TURN_LEAD_1,         // Turn indicator packet leader 'T'
   ECDIS_LEAD_1,        // ECDIS packet leader 'E'
   SOUNDER_LEAD_1,      // Depth sounder packet leader 'S'
   TRANSDUCER_LEAD_1,   // Generic transducer packet leader 'Y'
   BEIDOU_LEAD_1,       // Beidou leader
   QZSS_LEAD_1,         // Quasi-Zenith Satellite System leader

   DLE_LEADER,          // we've seen the TSIP/EverMore leader (DLE)

#ifdef TRIPMATE_ENABLE
   ASTRAL_1,            /* ASTRAL leader A */
   ASTRAL_2,            /* ASTRAL leader S */
   ASTRAL_3,            /* ASTRAL leader T */
   ASTRAL_4,            /* ASTRAL leader R */
   ASTRAL_5,            /* ASTRAL leader A */
#endif /* TRIPMATE_ENABLE */

#ifdef EARTHMATE_ENABLE
   EARTHA_1,            /* EARTHA leader E */
   EARTHA_2,            /* EARTHA leader A */
   EARTHA_3,            /* EARTHA leader R */
   EARTHA_4,            /* EARTHA leader T */
   EARTHA_5,            /* EARTHA leader H */
#endif /* EARTHMATE_ENABLE */

#if defined(SIRF_ENABLE) || defined(SKYTRAQ_ENABLE)
   SIRF_LEADER_1,       /* seen first character of SiRF/Skytraq leader <0x0A> */
#endif /* SIRF_ENABLE || SKYTRAQ_ENABLE */
#ifdef SIRF_ENABLE
   SIRF_LEADER_2,       /* seen second character of SiRF leader */
   SIRF_LENGTH_1,       /* seen first byte of SiRF length */
   SIRF_PAYLOAD,        /* we're in a SiRF payload part */
   SIRF_DELIVERED,      /* saw last byte of SiRF payload/checksum */
   SIRF_TRAILER_1,      /* saw first byte of SiRF trailer */
   SIRF_RECOGNIZED,     /* saw second byte of SiRF trailer */
#endif /* SIRF_ENABLE */

#ifdef SKYTRAQ_ENABLE
   /* <0xA0,0xA1><Len><Message ID><Message Body><csum><0x0D,0x0A> */
   /* Len is two bytes, is the length of Message ID and Message Body */
   /* Skytraq leader 1 same as SIRF_LEADER_1 */
   SKY_LEADER_2,        /* saw leader 2 <0xA1> */
   SKY_LENGTH_1,        /* saw first byte of packet length */
   SKY_LENGTH_2,        /* saw second byte of packet length */
   SKY_PAYLOAD,         /* we're in a Skytraq payload */
   SKY_DELIVERED,       /* saw last byte of Skytraq payload */
   SKY_CSUM,            /* saw Skytraq checksum */
   SKY_TRAILER_1,       /* saw first byte of Skytraq trailer <0x0D> */
   SKY_RECOGNIZED,      /* found end of the Skytraq packet */
#endif /* SKYTRAQ_ENABLE */

#ifdef ZODIAC_ENABLE
   ZODIAC_EXPECTED,     /* expecting Zodiac packet */
   ZODIAC_LEADER_1,     /* saw leading 0xff */
   ZODIAC_LEADER_2,     /* saw leading 0x81 */
   ZODIAC_ID_1,         /* saw first byte of ID */
   ZODIAC_ID_2,         /* saw second byte of ID */
   ZODIAC_LENGTH_1,     /* saw first byte of Zodiac packet length */
   ZODIAC_LENGTH_2,     /* saw second byte of Zodiac packet length */
   ZODIAC_FLAGS_1,      /* saw first byte of FLAGS */
   ZODIAC_FLAGS_2,      /* saw second byte of FLAGS */
   ZODIAC_HSUM_1,       /* saw first byte of Header sum */
   ZODIAC_PAYLOAD,      /* we're in a Zodiac payload */
   ZODIAC_RECOGNIZED,   /* found end of the Zodiac packet */
#endif /* ZODIAC_ENABLE */

#if defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE)
   AT1_LEADER,          /* saw True North status leader '@' */
                        /* Garmin Simple Text starts with @ leader */
                        /* Oncore starts with @ leader */
   GTXT_RECOGNIZED,     /* */
#endif

#ifdef EVERMORE_ENABLE
   EVERMORE_LEADER_1,   /* a DLE after having seen EverMore data */
   EVERMORE_LEADER_2,   /* seen opening STX of EverMore packet */
   EVERMORE_PAYLOAD,    /* in payload part of EverMore packet */
   EVERMORE_PAYLOAD_DLE,/* DLE in payload part of EverMore packet */
   EVERMORE_RECOGNIZED, /* found end of EverMore packet */
#endif /* EVERMORE_ENABLE */

#ifdef ITRAX_ENABLE
   ITALK_LEADER_1,      /* saw leading < of iTalk packet */
   ITALK_LEADER_2,      /* saw leading ! of iTalk packet */
   ITALK_LENGTH,        /* saw packet length */
   ITALK_PAYLOAD,       /* in payload part of iTalk Packet */
   ITALK_DELIVERED,     /* seen end of payload */
   ITALK_TRAILER,       /* saw iTalk trailer byte */
   ITALK_RECOGNIZED,    /* found end of the iTalk packet */
#endif /* ITRAX_ENABLE */

#ifdef NAVCOM_ENABLE
   NAVCOM_EXPECTED,     /* expecting Navcom NCT packet */
   NAVCOM_LEADER_1,     /* saw leading 0x02 */
   NAVCOM_LEADER_2,     /* saw leading 0x99 */
   NAVCOM_LEADER_3,     /* saw leading 0x66 */
   NAVCOM_ID,           /* saw message ID */
   NAVCOM_LENGTH_1,     /* saw first byte of Navcom packet length */
   NAVCOM_LENGTH_2,     /* saw second byte of Navcom packet length */
   NAVCOM_PAYLOAD,      /* we're in a Navcom payload */
   NAVCOM_CSUM,         /* saw checksum */
   NAVCOM_RECOGNIZED,   /* found end of the Navcom packet */
#endif /* NAVCOM_ENABLE */

#ifdef UBLOX_ENABLE
   UBX_LEADER_1,        /* first constant leader byte found */
   UBX_LEADER_2,        /* second constant leader byte found */
   UBX_CLASS_ID,        /* classid read */
   UBX_MESSAGE_ID,      /* message id read */
   UBX_LENGTH_1,        /* first length byte read (le) */
   UBX_LENGTH_2,        /* second length byte read (le) */
   UBX_PAYLOAD,         /* payload eating */
   UBX_CHECKSUM_A,      /* checksum A byte (tcp checksum) */
   UBX_RECOGNIZED,      /* this is also UBX_CHECKSUM_B */
#endif

#ifdef SUPERSTAR2_ENABLE
   SUPERSTAR2_LEADER,   /* leading SOH */
   SUPERSTAR2_ID1,      /* message type */
   SUPERSTAR2_ID2,      /* message type xor 0xff */
   SUPERSTAR2_PAYLOAD,  /* length of the actual packet data */
   SUPERSTAR2_CKSUM1,
   SUPERSTAR2_CKSUM2,
   SUPERSTAR2_RECOGNIZED,
#endif

#ifdef ONCORE_ENABLE
   ONCORE_AT2,          /* second @ */
   ONCORE_ID1,          /* first character of command type */
   ONCORE_PAYLOAD,      /* payload eating */
   ONCORE_CHECKSUM,     /* checksum byte */
   ONCORE_CR,           /* closing CR */
   ONCORE_RECOGNIZED,   /* closing LF */
#endif

#ifdef GEOSTAR_ENABLE
   GEOSTAR_LEADER_1,        /* first constant leader byte found */
   GEOSTAR_LEADER_2,        /* second constant leader byte found */
   GEOSTAR_LEADER_3,        /* third constant leader byte found */
   GEOSTAR_LEADER_4,        /* forth constant leader byte found */
   GEOSTAR_MESSAGE_ID_1,    /* first message id read */
   GEOSTAR_MESSAGE_ID_2,    /* second message id read */
   GEOSTAR_LENGTH_1,        /* first length byte read */
   GEOSTAR_LENGTH_2,        /* second length byte read */
   GEOSTAR_PAYLOAD,         /* payload eating */
   GEOSTAR_CHECKSUM_A,      /* checksum A byte (xor checksum) */
   GEOSTAR_CHECKSUM_B,      /* checksum B byte (xor checksum) */
   GEOSTAR_CHECKSUM_C,      /* checksum C byte (xor checksum) */
   GEOSTAR_RECOGNIZED,      /* this is also GEOSTAR_CHECKSUM_D */
#endif

#ifdef GREIS_ENABLE
   GREIS_EXPECTED,          /* expecting GREIS packet */
   GREIS_REPLY_1,           /* saw first byte of a reply */
   GREIS_REPLY_2,           /* saw second byte of a reply */
   GREIS_ID_1,              /* saw first byte of ID */
   GREIS_ID_2,              /* saw second byte of ID */
   GREIS_LENGTH_1,          /* saw first length byte */
   GREIS_LENGTH_2,          /* saw second length byte */
   GREIS_PAYLOAD,           /* we're in a GREIS payload */
   GREIS_RECOGNIZED,        /* found end of the GREIS packet */
#endif

/*
 * Packet formats without checksums start here.  We list them last so
 * that if a format with a conflicting structure *and* a checksum can
 * be recognized, that will be preferred.
 */

#if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE)
   TSIP_LEADER,         /* a DLE after having seen TSIP data */
   TSIP_PAYLOAD,        /* we're in TSIP payload */
   TSIP_DLE,            /* we've seen a DLE in TSIP payload */
   TSIP_RECOGNIZED,     /* found end of the TSIP packet */
   GARMIN_RECOGNIZED,   /* found end of Garmin packet */
#endif /* TSIP_ENABLE GARMIN_ENABLE */

#ifdef RTCM104V2_ENABLE
   RTCM2_SYNC_STATE,    /* we have sync lock */
   RTCM2_SKIP_STATE,    /* we have sync lock, but this character is bad */
   RTCM2_RECOGNIZED,    /* we have an RTCM packet */
#endif /* RTCM104V2_ENABLE */

#ifdef RTCM104V3_ENABLE
   RTCM3_LEADER_1,      /* constant leader byte found */
   RTCM3_LEADER_2,      /* second leader byte found (high 6 bits zero) */
   RTCM3_PAYLOAD,       /* gathering payload */
   RTCM3_RECOGNIZED,    /* RTCM3 packet recognized */
#endif

   JSON_LEADER,         /* JSON leading { found */
   JSON_STRINGLITERAL,  /* start of JSON string literal seen */
   JSON_STRING_SOLIDUS, /* backslash in string */
   JSON_END_ATTRIBUTE,  /* end of JSON attribute */
   JSON_EXPECT_VALUE,   /* just after colon */
   JSON_END_VALUE,      /* end of JSON value */
   JSON_NUMBER,         /* inside a JSON numeric literal */
   JSON_SPECIAL,        /* inside a JSON special literal (true,false,null) */
   JSON_RECOGNIZED,     /* JSON packet recognized */

#ifdef STASH_ENABLE
   STASH_RECOGNIZED,    /* stashable prefix recognized */
#endif

/* end of packet_states.h */
