Skip to content
This repository has been archived by the owner on Jul 4, 2023. It is now read-only.

Commit

Permalink
closes #80 : Provide a way for setting Level speed for the locs indiv…
Browse files Browse the repository at this point in the history
…idual
  • Loading branch information
Christian Benjamin Ries committed Apr 6, 2021
1 parent 63c3c81 commit cdc2c9e
Show file tree
Hide file tree
Showing 8 changed files with 207 additions and 82 deletions.
2 changes: 1 addition & 1 deletion EcosApp/railessentials.min.js

Large diffs are not rendered by default.

79 changes: 69 additions & 10 deletions EcosApp/src/locomotives.js
Original file line number Diff line number Diff line change
Expand Up @@ -590,10 +590,56 @@ class Locomotives {
if (typeof row === "undefined" || row == null)
continue;

if (row.locked !== data[oid].IsLocked) {
row.locked = data[oid].IsLocked;
var dataOid = data[oid];
if (typeof dataOid === "undefined") continue;
if (dataOid == null) continue;

if (row.locked !== dataOid.IsLocked) {
row.locked = dataOid.IsLocked;
elGrid.refreshCell(oid, 'locked');
}

try {
let level1 = 0, level2 = 0, level3 = 0, level4 = 0;

if (typeof dataOid.SpeedLevels !== "undefined" && dataOid.SpeedLevels != null) {
if(typeof dataOid.SpeedLevels.speedLevel1 !== "undefined" && dataOid.SpeedLevels.speedLevel1 != null) {
level1 = dataOid.SpeedLevels.speedLevel1;
}
if(typeof dataOid.SpeedLevels.speedLevel2 !== "undefined" && dataOid.SpeedLevels.speedLevel2 != null) {
level2 = dataOid.SpeedLevels.speedLevel2;
}
if(typeof dataOid.SpeedLevels.speedLevel3 !== "undefined" && dataOid.SpeedLevels.speedLevel3 != null) {
level3 = dataOid.SpeedLevels.speedLevel3;
}
if(typeof dataOid.SpeedLevels.speedLevel4 !== "undefined" && dataOid.SpeedLevels.speedLevel4 != null) {
level4 = dataOid.SpeedLevels.speedLevel4;
}
}

if(row.speedLevel1 !== level1) {
row.speedLevel1 = level1;
elGrid.refreshCell(oid, 'speedLevel1');
}

if(row.speedLevel2 !== level2) {
row.speedLevel2 = level2;
elGrid.refreshCell(oid, 'speedLevel2');
}

if(row.speedLevel3 !== level3) {
row.speedLevel3 = level3;
elGrid.refreshCell(oid, 'speedLevel3');
}

if(row.speedLevel4 !== level4) {
row.speedLevel4 = level4;
elGrid.refreshCell(oid, 'speedLevel4');
}

} catch(err) {
// ignore
}
}
}

Expand Down Expand Up @@ -708,16 +754,29 @@ class Locomotives {
const self = this;
const locData = self.__getLocomotiveOfRecentData(oid);
try {
const level1Value = locData.speedLevels.level1;
const level2Value = locData.speedLevels.level2;
const level3Value = locData.speedLevels.level3;
const level4Value = locData.speedLevels.level4;
const level1Value = locData.SpeedLevels.speedLevel1;
const level2Value = locData.SpeedLevels.speedLevel2;
const level3Value = locData.SpeedLevels.speedLevel3;
const level4Value = locData.SpeedLevels.speedLevel4;

var v1 = 0, v2 = 0, v3 = 0, v4 = 0;
if (typeof level1Value !== "undefined" && level1Value != null) v1 = level1Value.value;
else v1 = parseInt(maxSpeedstep * 0.1); // REMARK if default is changed, change server as well

if (typeof level2Value !== "undefined" && level2Value != null) v2 = level2Value.value;
else v2 = parseInt(maxSpeedstep * 0.3); // REMARK if default is changed, change server as well

if (typeof level3Value !== "undefined" && level3Value != null) v3 = level3Value.value;
else v3 = parseInt(maxSpeedstep * 0.5); // REMARK if default is changed, change server as well

if (typeof level4Value !== "undefined" && level4Value != null) v4 = level4Value.value;
else v4 = parseInt(maxSpeedstep * 0.6); // REMARK if default is changed, change server as well

return {
"level1": parseInt(level1Value),
"level2": parseInt(level2Value),
"level3": parseInt(level3Value),
"level4": parseInt(level4Value)
"level1": parseInt(v1),
"level2": parseInt(v2),
"level3": parseInt(v3),
"level4": parseInt(v4)
};
}
catch(err) {
Expand Down
152 changes: 84 additions & 68 deletions ecoslibNet48/Entities/Locomotive.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum ProtocolSteps
public int GetSpeedByPercentage(float percentage)
{
var speed = GetNumberOfSpeedsteps(Protocol) * percentage;
return (int) Math.Floor(speed);
return (int)Math.Floor(speed);
}

public const int Typeid = 1;
Expand Down Expand Up @@ -99,13 +99,13 @@ public Locomotive(IStatistics stats)
for (var i = 0; i < 32; ++i)
Funcset.Add(false);
}

public void ChangeName(string name)
{
AddCmd(CommandFactory.Create($"request({ObjectId}, control, force)"));
AddCmd(CommandFactory.Create($@"set({ObjectId}, name[""{name}""])", true));
AddCmd(CommandFactory.Create($"release({ObjectId}, control)"));
AddCmd(CommandFactory.Create($"get({ObjectId}, name)"));
AddCmd(CommandFactory.Create($"get({ObjectId}, name)"));
}

public void Stop()
Expand All @@ -118,22 +118,22 @@ public void StopSimulation()
ChangeSpeedstepSimulation(0);
}

public void ToggleFunctions(Dictionary<uint, bool> states)
{
AddCmd(CommandFactory.Create($"request({ObjectId}, control, force)"));

foreach (var it in states)
{
var nr = it.Key;
var state = it.Value;
var v = state ? 1 : 0;
AddCmd(CommandFactory.Create($"set({ObjectId}, func[{nr}, {v}])"));
Funcset[(int)nr] = state;
}

AddCmd(CommandFactory.Create($"release({ObjectId}, control)"));
}
public void ToggleFunctions(Dictionary<uint, bool> states)
{
AddCmd(CommandFactory.Create($"request({ObjectId}, control, force)"));

foreach (var it in states)
{
var nr = it.Key;
var state = it.Value;
var v = state ? 1 : 0;
AddCmd(CommandFactory.Create($"set({ObjectId}, func[{nr}, {v}])"));
Funcset[(int)nr] = state;
}

AddCmd(CommandFactory.Create($"release({ObjectId}, control)"));
}

public void ChangeDirectionSimulation(bool backward)
{
_hasChanged = true;
Expand All @@ -159,47 +159,63 @@ public void ChangeDirection(bool backward)
/// [4] Level4
/// </summary>
/// <param name="level"></param>
public void ChangeSpeedLevel(string level)
/// <param name="availableSpeedlevels"></param>
public void ChangeSpeedLevel(string level, Dictionary<string, int> availableSpeedlevels)
{
if (string.IsNullOrEmpty(level))
level = "level0"; // for security reason we just stop on invalid command

level = level.ToLower();

// TODO change fixed values
var levelValuesPercentage = new Dictionary<string, float>
{
var newSpeed = -1;

foreach(var it in availableSpeedlevels)
{
if (it.Key.IndexOf(level, StringComparison.OrdinalIgnoreCase) != -1)
newSpeed = it.Value;
}

if (newSpeed != -1)
{
ChangeSpeedstep(newSpeed, true, true);
}
else
{ // fallback if level does not exist

var levelValuesPercentage = new Dictionary<string, float>
{ // REMARK if default is changed, change the web ui part as well
{"level0", 0 },
{"level1", 0.10f },
{"level2", 0.20f },
{"level3", 0.40f },
{"level4", 0.55f }
{"level1", (int)0.10f },
{"level2", (int)0.30f },
{"level3", (int)0.50f },
{"level4", (int)0.6f }
};

var percentage = levelValuesPercentage[level];
var speed = GetSpeedByPercentage(percentage);
var percentage = levelValuesPercentage[level];
var speed = GetSpeedByPercentage(percentage);

ChangeSpeedstep(speed, true, true);
ChangeSpeedstep(speed, true, true);
}
}

public void ChangeSpeedstep(int fahrstufe, bool isFirst = true, bool isLast = true)
{
if(isFirst)
if (isFirst)
{
AddCmd(CommandFactory.Create($"request({ObjectId}, control, force)"));
}

AddCmd(CommandFactory.Create($"set({ObjectId}, speedstep[{fahrstufe}])"));

if (isLast)
{
AddCmd(CommandFactory.Create($"release({ObjectId}, control)"));
AddCmd(CommandFactory.Create($"get({ObjectId}, speed, speedstep)"));
}
{
AddCmd(CommandFactory.Create($"release({ObjectId}, control)"));
AddCmd(CommandFactory.Create($"get({ObjectId}, speed, speedstep)"));
}

Speed = fahrstufe;
Speed = fahrstufe;
}

public void ChangeSpeedstepSimulation(int fahrstufe)
{
_hasChanged = true;
Expand Down Expand Up @@ -248,10 +264,10 @@ public override void QueryState()

public override bool Parse(List<object> arguments)
{
foreach (var a in arguments)
{
var arg = a as ICommandArgument;
if (arg == null) continue;
foreach (var a in arguments)
{
var arg = a as ICommandArgument;
if (arg == null) continue;

if (arg.Name.Equals("name", StringComparison.OrdinalIgnoreCase))
{
Expand Down Expand Up @@ -403,14 +419,14 @@ public override JObject ToJson()
else m += "0";
}

var arFncDesc = new JArray();
foreach (var desc in Funcdesc)
{
var odesc = new JObject();
odesc["idx"] = desc.Key;
odesc["type"] = desc.Value;
arFncDesc.Add(odesc);
}
var arFncDesc = new JArray();
foreach (var desc in Funcdesc)
{
var odesc = new JObject();
odesc["idx"] = desc.Key;
odesc["type"] = desc.Value;
arFncDesc.Add(odesc);
}

var o = new JObject
{
Expand All @@ -423,7 +439,7 @@ public override JObject ToJson()
["speedstepMax"] = GetNumberOfSpeedsteps(),
["direction"] = Direction,
["funcset"] = m,
["funcdesc"] = arFncDesc,
["funcdesc"] = arFncDesc,
["nrOfFunctions"] = NrOfFunctions,
["profile"] = Profile
};
Expand Down Expand Up @@ -453,23 +469,23 @@ public override void ParseJson(JObject obj)
Funcset[i] = m[i] == '1';
}

if (obj["funcdesc"] != null)
{
var ar = obj["funcdesc"] as JArray;
for(var i = 0; i < ar.Count; ++i)
{
var oar = ar[i] as JObject;
if (obj["funcdesc"] != null)
{
var ar = obj["funcdesc"] as JArray;
for (var i = 0; i < ar.Count; ++i)
{
var oar = ar[i] as JObject;
if (oar?["idx"] != null && oar["type"] != null)
{
var idx = oar["idx"].ToString().ToInt(i);
var type = oar["type"].ToString().ToInt();
if (Funcdesc.ContainsKey(idx))
Funcdesc[idx] = type;
else
Funcdesc.Add(idx, type);
}
}
}
{
var idx = oar["idx"].ToString().ToInt(i);
var type = oar["type"].ToString().ToInt();
if (Funcdesc.ContainsKey(idx))
Funcdesc[idx] = type;
else
Funcdesc.Add(idx, type);
}
}
}
}
}
}
14 changes: 11 additions & 3 deletions railessentials/ClientHandler/ClientHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using railessentials.Plan;
using railessentials.Route;
using railessentials;
using railessentials.Locomotives;
using SuperWebSocket;
using Utilities;
using Data = railessentials.Locomotives.Data;
Expand Down Expand Up @@ -352,7 +353,9 @@ private void HandleLocomotiveCommand(JObject cmddata)
var v = cmddata.GetString("speedstep");
if (!string.IsNullOrEmpty(v) && v.IndexOf("level", StringComparison.OrdinalIgnoreCase) != -1)
{
locomotiveItem.ChangeSpeedLevel(v);
var availableSpeedlevels = _metadata.LocomotivesData.GetSpeedLevels(oid);

locomotiveItem.ChangeSpeedLevel(v, availableSpeedlevels);
}
else if (!string.IsNullOrEmpty(v) && v.Equals("++", StringComparison.Ordinal))
{
Expand Down Expand Up @@ -1169,8 +1172,13 @@ private void HandleSettingLocomotive(string cmd, JToken value)
var level = data.GetString("level", string.Empty);
var levelValue = data.GetInt("value", 0);

// TODO store data
// TODO use data in AutoMode
lock (_metadataLock)
{
_metadata.LocomotivesData.SetSpeedLevel(oid, level, levelValue);
_metadata?.Save(Metadata.SaveModelType.LocomotivesData);
}

SendModelToClients(ModelType.UpdateLocomotivesData);
}
break;

Expand Down
1 change: 1 addition & 0 deletions railessentials/Locomotives/Data.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public class Data
public Dictionary<string, bool> Settings { get; set; } = new();
public string EnterBlockSide { get; set; }
public SpeedCurve SpeedCurve { get; set; }
public Dictionary<string, SpeedLevel> SpeedLevels { get; set; } = new();
}
}
Loading

0 comments on commit cdc2c9e

Please sign in to comment.