fix: GetCarStateInfo 空引用与枚举解析
holdingLocks/blockedBy/enums 为空时不再抛异常,CurrNodeCode 在无站点时返回 0。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2580,7 +2580,6 @@ namespace StandardScene
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
var carId = singleCar.id;
|
|
||||||
var alarmsList = new List<CarAlarm>();
|
var alarmsList = new List<CarAlarm>();
|
||||||
if (
|
if (
|
||||||
singleCar.status.enums.ContainsKey("AlarmInfo")
|
singleCar.status.enums.ContainsKey("AlarmInfo")
|
||||||
@@ -2599,16 +2598,18 @@ namespace StandardScene
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentSite = SimpleLib.GetSite(singleCar.status.holdingLocks.FirstOrDefault());
|
var holdingLocks = singleCar.status.holdingLocks;
|
||||||
var blockedBy = singleCar.status.blockedBy.ToHashSet();
|
var currentSite = SimpleLib.GetSite(holdingLocks?.FirstOrDefault() ?? 0);
|
||||||
|
var blockedBy = (singleCar.status.blockedBy ?? Array.Empty<(int, int)>())
|
||||||
|
.ToHashSet();
|
||||||
List<BlockedByItem> blockedByItems = new List<BlockedByItem>();
|
List<BlockedByItem> blockedByItems = new List<BlockedByItem>();
|
||||||
for (int i = 0; i < blockedBy.Count; i++)
|
foreach (var pair in blockedBy)
|
||||||
{
|
{
|
||||||
blockedByItems.Add(
|
blockedByItems.Add(
|
||||||
new BlockedByItem
|
new BlockedByItem
|
||||||
{
|
{
|
||||||
CarCode = blockedBy.ElementAt(i).Item1.ToString(),
|
CarCode = pair.Item1.ToString(),
|
||||||
Type = blockedBy.ElementAt(i).Item2
|
Type = pair.Item2
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -2635,40 +2636,28 @@ namespace StandardScene
|
|||||||
carState = $"被{string.Join("、", blockerNames)}车交管";
|
carState = $"被{string.Join("、", blockerNames)}车交管";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var enums = singleCar.status.enums;
|
||||||
return new CarStateInfo()
|
return new CarStateInfo()
|
||||||
{
|
{
|
||||||
Code = carCode,
|
Code = carCode,
|
||||||
Name = singleCar.name,
|
Name = singleCar.name,
|
||||||
CurrState = carState,
|
CurrState = carState,
|
||||||
IsOnline = isOnline,
|
IsOnline = isOnline,
|
||||||
Battery = singleCar.status.enums.ContainsKey("Soc")
|
Battery = TryParseEnumInt(enums, "Soc", 100),
|
||||||
? int.Parse(singleCar.status.enums["Soc"])
|
Voltage = TryParseEnumDouble(enums, "Voltage", 0),
|
||||||
: 100,
|
ElectricCurrent = TryParseEnumDouble(enums, "ElectricCurrent", 0),
|
||||||
Voltage = singleCar.status.enums.ContainsKey("Voltage")
|
|
||||||
? double.Parse(singleCar.status.enums["Voltage"])
|
|
||||||
: 0,
|
|
||||||
ElectricCurrent = singleCar.status.enums.ContainsKey("ElectricCurrent")
|
|
||||||
? double.Parse(singleCar.status.enums["ElectricCurrent"])
|
|
||||||
: 0,
|
|
||||||
X = singleCar.x,
|
X = singleCar.x,
|
||||||
Y = singleCar.y,
|
Y = singleCar.y,
|
||||||
Theta = singleCar.th,
|
Theta = singleCar.th,
|
||||||
Speed = singleCar.status.enums.ContainsKey("ActualLeftWheelVelocity")
|
Speed = TryParseEnumDouble(enums, "ActualLeftWheelVelocity", singleCar.speed),
|
||||||
? double.Parse(
|
Load = TryParseEnumInt(enums, "loadStatus", 0),
|
||||||
SimpleLib.GetCar(carId).status.enums["ActualLeftWheelVelocity"]
|
CurrNodeCode = currentSite != null ? currentSite.id.ToString() : "0",
|
||||||
)
|
|
||||||
: singleCar.speed,
|
|
||||||
//CurrNodeCode = currentSite.fields.ContainsKey("code") ? currentSite.fields["code"] : currentSite.id.ToString(),
|
|
||||||
Load = singleCar.status.enums.TryGetValue("loadStatus", out var statusEnum)
|
|
||||||
? int.Parse(statusEnum)
|
|
||||||
: 0,
|
|
||||||
CurrNodeCode = currentSite.id.ToString(),
|
|
||||||
StartNodeCode = "0",
|
StartNodeCode = "0",
|
||||||
EndNodeCode = "0",
|
EndNodeCode = "0",
|
||||||
StartEdgeCode = "0",
|
StartEdgeCode = "0",
|
||||||
EndEdgeCode = "0",
|
EndEdgeCode = "0",
|
||||||
HoldingLocks = singleCar.status.holdingLocks.ToList(),
|
HoldingLocks = holdingLocks?.ToList() ?? new List<int>(),
|
||||||
PendingLocks = singleCar.status.pendingLocks.ToList(),
|
PendingLocks = singleCar.status.pendingLocks?.ToList() ?? new List<int>(),
|
||||||
BlockedBy = blockedByItems,
|
BlockedBy = blockedByItems,
|
||||||
// BlockingTime = singleCar.status.blockingTime.ToString("yyyy-MM-dd HH:mm:ss"),//没有了
|
// BlockingTime = singleCar.status.blockingTime.ToString("yyyy-MM-dd HH:mm:ss"),//没有了
|
||||||
TrafficMessage = singleCar.status.TCStat.ToString(),
|
TrafficMessage = singleCar.status.TCStat.ToString(),
|
||||||
@@ -2686,6 +2675,20 @@ namespace StandardScene
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int TryParseEnumInt(IDictionary<string, string> enums, string key, int fallback)
|
||||||
|
{
|
||||||
|
if (enums != null && enums.TryGetValue(key, out var text) && int.TryParse(text, out var value))
|
||||||
|
return value;
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double TryParseEnumDouble(IDictionary<string, string> enums, string key, double fallback)
|
||||||
|
{
|
||||||
|
if (enums != null && enums.TryGetValue(key, out var text) && double.TryParse(text, out var value))
|
||||||
|
return value;
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
public string SwitchCarState(Car car, ref bool isOnline)
|
public string SwitchCarState(Car car, ref bool isOnline)
|
||||||
{
|
{
|
||||||
string state = "Stopping";
|
string state = "Stopping";
|
||||||
|
|||||||
Reference in New Issue
Block a user