借助网络配置,控制Modbus工具的日志显示,避免卡死界面
智能大石头 authored at 2021-12-11 22:09:19
3.49 KiB
XCoder
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ALib
{
    /// <summary>位图图像</summary>
    public class BitmapImage
    {
        /// <summary>列数,每行个数,建议是8的倍数</summary>
        public int Columns;
        /// <summary>总bit数</summary>
        public int BitCount;

        /// <summary>位图数据</summary>
        public Byte[] Bits;

        /// <summary>位图 图</summary>
        /// <param name="bits"></param>
        /// <param name="bitCount">bit总数</param>
        /// <param name="cols">列数</param>
        public BitmapImage(byte[] bits, int bitCount, int cols = 8)
        {
            if (cols < 1) cols = 8;
            if (bitCount > bits.Length * 8) bitCount = bits.Length * 8;

            Bits = bits;
            BitCount = bitCount;
            Columns = cols;
        }

        /// <summary>位图,图</summary>
        /// <param name="bitCount">bit数</param>
        /// <param name="cols"></param>
        public BitmapImage(int bitCount, int cols = 8)
        {
            if (cols < 1) cols = 8;

            Bits = new Byte[bitCount];
            BitCount = bitCount;
            Columns = cols;
        }

        /// <summary>获取标志</summary>
        /// <param name="idx"></param>
        /// <returns></returns>
        public bool GetBit(int idx)
        {
            idx %= BitCount;

            int byteIdx = idx / 8;
            var temp = Bits[byteIdx];

            int bitIdx = idx % 8;
            int mask = 1 << bitIdx;

            return (mask & temp) > 0;
        }

        /// <summary>设置标志,测试用的</summary>
        /// <param name="idx"></param>
        /// <param name="bit"></param>
        public void SetBit(int idx, bool bit)
        {
            idx %= BitCount;

            int byteIdx = idx / 8;
            var temp = Bits[byteIdx];

            int bitIdx = idx % 8;
            int bitMask = 1 << bitIdx;

            if (bit)
            {
                temp = (byte)(temp | bitMask);
            }
            else
            {
                bitMask = ~bitMask;
                temp = (byte)(temp & bitMask);
            }

            Bits[byteIdx] = temp;
        }

        /// <summary>获取图像</summary>
        /// <returns></returns>
        public Bitmap GetImage()
        {
            int rowCount = (BitCount + Columns - 1) / Columns;
            // 每个标志占 10x10 pix ,计算整体大小。
            var bmap = new Bitmap(Columns * 10, rowCount * 10);
            var g = Graphics.FromImage(bmap);
            g.Clear(Color.LightGray);

            // 每个标志占 10x10 pix, 红色
            for (int i = 0; i < BitCount; i++)
            {
                var brush = Brushes.Red;
                if (!GetBit(i)) brush = Brushes.Green;

                int x = i % Columns * 10;
                int y = i / Columns * 10;
                g.FillRectangle(brush, x, y, 10, 10);
            }

            // 画线分隔图块
            // 竖线
            var pen2 = new Pen(Color.White, 2);
            for (int i = 1; i < Columns; i++)
            {
                int x = i * 10;
                g.DrawLine(pen2, x, 0, x, rowCount * 10);
            }
            // 横线
            for (int i = 1; i < rowCount; i++)
            {
                int y = i * 10;
                g.DrawLine(pen2, 0, y, Columns * 10, y);
            }

            g.Dispose();

            return bmap;
        }
    }
}