using System;
using System.Collections.Generic;
using System.Text;
namespace IceCoffee.HJ212
{
    /// 
    /// 拆分包及应答标志
    /// 
    public class PackageFlag
    {
        public byte V5 { get; set; }
        public byte V4 { get; set; }
        public byte V3 { get; set; }
        public byte V2 { get; set; }
        public byte V1 { get; set; }
        public byte V0 { get; set; }
        /// 
        /// 命令是否应答:1-应答,0-不应答
        /// 
        public byte A { get; set; }
        /// 
        /// 是否有数据包序号:1 - 数据包中包含包号和总包数两部分,0 - 数据包中不包含包号和总包数两部分
        /// 
        public byte D { get; set; }
        /// 
        /// 标准版本号
        /// 000000 表示标准 HJ/T212-2005
        /// 000001 表示本次标准修订版本号
        /// 
        public string Version
        {
            get
            {
                return $"{V5}{V4}{V3}{V2}{V1}{V0}";
            }
        }
        /// 
        /// 解析
        /// 
        /// 
        /// 
        public static PackageFlag Parse(string data)
        {
            byte flag = byte.Parse(data);
            return new PackageFlag()
            {
                V5 = GetBit(flag, 7),
                V4 = GetBit(flag, 6),
                V3 = GetBit(flag, 5),
                V2 = GetBit(flag, 4),
                V1 = GetBit(flag, 3),
                V0 = GetBit(flag, 2),
                D = GetBit(flag, 1),
                A = GetBit(flag, 0)
            };
        }
        /// 
        /// 序列化
        /// 
        /// 
        public string Serialize()
        {
            return Convert.ToInt32($"{V5}{V4}{V3}{V2}{V1}{V0}{D}{A}", 2).ToString();
        }
        /// 
        /// 获取取第index位
        /// 
        /// 
        /// index从0开始
        /// 
        /// 
        /// 
        /// 
        private static byte GetBit(byte b, int index) 
        {
            // (byte)((from & (0xFF << (index * 8))) >> (index * 8))
            return ((b & (1 << index)) > 0) ? (byte)1 : (byte)0; 
        }
        /// 
        /// 将第index位设为1
        /// 
        /// 
        /// index从0开始
        /// 
        /// 
        /// 
        /// 
        private static byte SetBit(byte b, int index) { return (byte)(b | (1 << index)); }
        /// 
        /// 将第index位设为0
        /// 
        /// 
        /// index从0开始
        /// 
        /// 
        /// 
        /// 
        private static byte ClearBit(byte b, int index) { return (byte)(b & (byte.MaxValue - (1 << index))); }
        /// 
        /// 将第index位取反
        /// 
        /// 
        /// index从0开始
        /// 
        /// 
        /// 
        /// 
        private static byte ReverseBit(byte b, int index) { return (byte)(b ^ (byte)(1 << index)); }
    }
}