/// <summary>
        /// Decode a Gesture Control packet from the byte stream
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <param name="rate"></param>
        /// <returns></returns>
        private static GestureId DecodeGestureControl(byte[] buffer, ref int index, out bool enabled)
        {
            GestureControlPacket status = DeserializePacket <GestureControlPacket>(buffer, ref index);

            enabled = (status.enabled != 0);
            return((GestureId)status.gestureId);
        }
        /// <summary>
        /// Encode a Gesture Control packet into the specified buffer
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="index"></param>
        /// <param name="gesture"></param>
        /// <param name="enabled"></param>
        public static void EncodeGestureControl(byte[] buffer, ref int index, GestureId gesture, bool enabled)
        {
            // Encode header
            PacketHeader header = new PacketHeader(PacketTypeCode.GestureControl);

            SerializePacket(buffer, ref index, header);

            // Encode payload
            GestureControlPacket packet = new GestureControlPacket
            {
                gestureId = (int)gesture,
                enabled   = (byte)(enabled ? 1 : 0)
            };

            SerializePacket(buffer, ref index, packet);

            // Encode footer
            SerializePacket(buffer, ref index, _footer);
        }