using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MV485.model
{
public class RunConfig
{
public byte MeterType { get; set; }
public bool MeterTypeWRFlag { get; set; }
public ushort DnValue { get; set; }
public bool DnValueWRFlag { get; set; }
public byte DigitCount { get; set; }
public bool DigitCountWRFlag { get; set; }
public byte IndCount { get; set; }
public bool IndCountWRFlag { get; set; }
public float BrightValue { get; set; }
public bool BrightValueWRFlag { get; set; }
public byte LastUnitLevel { get; set; }
public bool LastUnitLevelWRFlag { get; set; }
public byte UploadRedind { get; set; }
public bool UploadRedindWRFlag { get; set; }
public ulong LatestValue { get; set; }
public bool LatestValueWRFlag { get; set; }
public DateTime LatestTime { get; set; }
public string LatestTimeStr
{
get
{
if(LatestTime == null)
{
return "";
}
else
{
return LatestTime.ToString("yyyy-MM-dd HH:mm:ss");
}
}
}
public bool LatestTimeWRFlag { get; set; }
//采样间隔(分钟)
public ushort SampleInterval { get; set; }
public bool SampleIntervalFlag { get; set; }
//首采时间(整点时)
public byte FirstHour { get; set; }
public bool FirstHourFlag { get; set; }
public string MeterRegion { get; set; }
public bool MeterRegionWRFlag { get; set; }
public string DigitRegion { get; set; }
public bool DigitRegionWRFlag { get; set; }
public string FTIndRegion { get; set; }
public bool FTIndRegionWRFlag { get; set; }
// 新增属性:按大端序将 LatestValue 转换为 ushort[4]
public ushort[] LatestValues
{
get
{
// 1. 将 ulong 转为大端序的字节数组
byte[] bytes = BitConverter.GetBytes(LatestValue);
if (BitConverter.IsLittleEndian)
{
Array.Reverse(bytes); // 小端系统需反转字节数组
}
// 2. 将字节数组转为 ushort[4](按大端序)
ushort[] result = new ushort[4];
for (int i = 0; i < 4; i++)
{
int offset = i * 2;
result[i] = (ushort)((bytes[offset] << 8) | bytes[offset + 1]);
}
return result;
}
}
public ushort[] LatestTimes
{
get
{
if (LatestTime != null)
{
ushort[] result = new ushort[6];
result[0] = (ushort)(LatestTime.Year - 2000);
result[1] = (ushort)LatestTime.Month;
result[2] = (ushort)LatestTime.Day;
result[3] = (ushort)LatestTime.Hour;
result[4] = (ushort)LatestTime.Minute;
result[5] = (ushort)LatestTime.Second;
return result;
}
else
{
return null;
}
}
}
/*public ushort[] LatestValues
{
get
{
// 1. 手动按大端序提取 ulong 的8个字节
byte[] bytes = new byte[8];
ulong value = LatestValue;
bytes[0] = (byte)(value >> 56); // 最高有效字节
bytes[1] = (byte)(value >> 48);
bytes[2] = (byte)(value >> 40);
bytes[3] = (byte)(value >> 32);
bytes[4] = (byte)(value >> 24);
bytes[5] = (byte)(value >> 16);
bytes[6] = (byte)(value >> 8);
bytes[7] = (byte)value; // 最低有效字节
// 2. 将字节按大端序转为 ushort[4]
ushort[] result = new ushort[4];
for (int i = 0; i < 4; i++)
{
int offset = i * 2;
result[i] = (ushort)((bytes[offset] << 8) | bytes[offset + 1]);
}
return result;
}
}*/
// 反向操作:从大端序 ushort[] 设置 LatestValue
public void SetLatestValueFromShorts(ushort[] values)
{
byte[] bytes = new byte[8];
for (int i = 0; i < 4; i++)
{
bytes[i * 2] = (byte)(values[i] >> 8); // 高8位
bytes[i * 2 + 1] = (byte)(values[i] & 0xFF); // 低8位
}
// 组合为 ulong(手动大端序)
ulong value =
((ulong)bytes[0] << 56) |
((ulong)bytes[1] << 48) |
((ulong)bytes[2] << 40) |
((ulong)bytes[3] << 32) |
((ulong)bytes[4] << 24) |
((ulong)bytes[5] << 16) |
((ulong)bytes[6] << 8) |
(ulong)bytes[7];
LatestValue = value;
}
public ushort[] MeterRegions
{
get
{
ushort[] result = ConvertStringToUShortArray(MeterRegion, 4);
return result;
}
}
public ushort[] DigitRegions
{
get
{
ushort[] result = ConvertStringToUShortArray(DigitRegion, 8);
return result;
}
}
public ushort[] FTIndRegions
{
get
{
ushort[] result = ConvertStringToUShortArray(FTIndRegion, 4);
return result;
}
}
///
/// 将字符串按分隔符(逗号、空格)分割并转换为固定长度的 ushort 数组
///
/// 输入字符串
/// 期望的数组长度
/// ushort数组(失败返回null)
public static ushort[] ConvertStringToUShortArray(string input, int expectedLength)
{
// 1. 分割字符串(支持逗号和空格分隔)
string[] parts = input.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
// 2. 验证分割后的元素数量
if (parts.Length != expectedLength)
{
return null;
}
// 3. 尝试转换为ushort数组
ushort[] array = new ushort[expectedLength];
for (int i = 0; i < expectedLength; i++)
{
if (!ushort.TryParse(parts[i], out array[i]))
{
return null; // 转换失败(非数字或超出ushort范围)
}
}
return array;
}
public RunConfig()
{
MeterTypeWRFlag = false;
DnValueWRFlag = false;
DigitCountWRFlag = false;
IndCountWRFlag = false;
BrightValueWRFlag = false;
LastUnitLevelWRFlag = false;
UploadRedindWRFlag = false;
LatestValueWRFlag = false;
LatestTimeWRFlag = false;
MeterRegionWRFlag = false;
DigitRegionWRFlag = false;
FTIndRegionWRFlag = false;
SampleIntervalFlag = false;
FirstHourFlag = false;
}
//-----------------------------------------------
}
}