| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- using System;
- using System.Text;
- namespace TeamAAS.Communication.LightSources
- {
- /// <summary>
- /// TSD 光源协议命令构造器
- /// 适用于 DPA12024V-4T-3.0 等型号
- /// 特点: 所有命令带 XOR 校验字
- /// </summary>
- public static class TSDLightProtocol
- {
- /// <summary>
- /// 读取指定通道亮度
- /// #4{CH}00015 + XOR校验
- /// </summary>
- public static string BuildReadCommand(int channelIndex)
- {
- string cmd = $"#4{channelIndex + 1}00015";
- return cmd + CalcXor(cmd);
- }
- /// <summary>
- /// 设置指定通道亮度
- /// #3{CH}0{HEX} + XOR校验
- /// </summary>
- public static string BuildSetBrightnessCommand(int channelIndex, int brightness)
- {
- int br = Math.Max(0, Math.Min(255, brightness));
- string cmd = $"#3{channelIndex + 1}0{br.ToString("X2")}";
- return cmd + CalcXor(cmd);
- }
- /// <summary>
- /// 打开指定通道
- /// #1{CH}064 + XOR校验
- /// </summary>
- public static string BuildTurnOnChannelCommand(int channelIndex)
- {
- string cmd = $"#1{channelIndex + 1}064";
- return cmd + CalcXor(cmd);
- }
- /// <summary>
- /// 关闭指定通道
- /// #2{CH}029 + XOR校验
- /// </summary>
- public static string BuildTurnOffChannelCommand(int channelIndex)
- {
- string cmd = $"#2{channelIndex + 1}029";
- return cmd + CalcXor(cmd);
- }
- /// <summary>
- /// 全开所有通道(逐通道发送)
- /// </summary>
- public static string[] BuildTurnOnAllCommands(int channelCount)
- {
- var cmds = new string[channelCount];
- for (int i = 0; i < channelCount; i++)
- cmds[i] = BuildTurnOnChannelCommand(i);
- return cmds;
- }
- /// <summary>
- /// 全关所有通道(逐通道发送)
- /// </summary>
- public static string[] BuildTurnOffAllCommands(int channelCount)
- {
- var cmds = new string[channelCount];
- for (int i = 0; i < channelCount; i++)
- cmds[i] = BuildTurnOffChannelCommand(i);
- return cmds;
- }
- /// <summary>
- /// 解析读取响应,返回亮度值(16进制转10进制)
- /// </summary>
- public static int ParseReadResponse(string response)
- {
- if (string.IsNullOrEmpty(response)) return 0;
- if (response.Contains("$")) return 0;
- try
- {
- string val = response.Substring(4, 2);
- return Convert.ToInt32(val, 16);
- }
- catch { return 0; }
- }
- /// <summary>
- /// 验证响应是否成功
- /// 成功: 响应包含 "#"
- /// 失败: 响应包含 "$"
- /// </summary>
- public static bool VerifyResponse(string response)
- {
- return !string.IsNullOrEmpty(response) && response.Contains("#");
- }
- /// <summary>
- /// XOR 校验字计算
- /// </summary>
- public static string CalcXor(string asciiData)
- {
- if (string.IsNullOrEmpty(asciiData)) return "00";
- byte[] data = Encoding.ASCII.GetBytes(asciiData);
- byte xor = data[0];
- for (int i = 1; i < data.Length; i++)
- xor ^= data[i];
- char high = NibbleToAscii((byte)((xor >> 4) & 0x0F));
- char low = NibbleToAscii((byte)(xor & 0x0F));
- return new string(new[] { high, low });
- }
- private static char NibbleToAscii(byte nibble)
- {
- return nibble < 10 ? (char)('0' + nibble) : (char)('A' + (nibble - 10));
- }
- }
- }
|