Skip to content

Commit

Permalink
Merge pull request #80 from huskyroboticsteam/science-updates-2
Browse files Browse the repository at this point in the history
Science
  • Loading branch information
husky-robotics authored Aug 14, 2018
2 parents 7127520 + 74b62f4 commit a4a02bf
Show file tree
Hide file tree
Showing 34 changed files with 1,657 additions and 479 deletions.
12 changes: 2 additions & 10 deletions BaseStation/BaseStation/App.config
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
12 changes: 2 additions & 10 deletions BaseStation/BaseStation/app.config
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
12 changes: 2 additions & 10 deletions BaseStation/MainWindow/App.config
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
12 changes: 2 additions & 10 deletions BaseStation/MainWindow/app.config
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
5 changes: 3 additions & 2 deletions Science/Science Base/BaseMain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,16 @@ class BaseMain
static void Main(string[] args)
{
Log.SetGlobalOutputLevel(Log.Severity.INFO);
//Log.SetSingleOutputLevel(Log.Source.NETWORK, Log.Severity.DEBUG);
Log.ErrorCodes = ScienceErrors.ERROR_CODES;
Log.SystemNames = ScienceErrors.SYSTEMS;
Log.Begin();
Log.ForceOutput(Log.Severity.INFO, Log.Source.OTHER, "Science Station - Base Side");

StateStore.Start("ScienceBase");

Window = new MainWindow();
Application.EnableVisualStyles();
Server.Start(ScienceConstants.DEFAULT_PORT_TCP, ScienceConstants.DEFAULT_PORT_UDP);
Server.Start(ScienceConstants.DEFAULT_PORT_TCP, ScienceConstants.DEFAULT_PORT_UDP, OperationPeriod:5);
Server.ClientConnectionChange += Window.UpdateClientList;
DataHandler.Start();
Application.Run(Window);
Expand Down
19 changes: 13 additions & 6 deletions Science/Science Base/ChartManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using LiveCharts.Geared;
using LiveCharts.WinForms;
using Scarlet.Utilities;

namespace Science_Base
{
Expand All @@ -16,6 +13,8 @@ public class ChartInstance
public CartesianChart Chart;
public ListBox DataChooser;

private HashSet<int> SeriesIndexList = new HashSet<int>();

public ChartInstance(CartesianChart Chart, ListBox Chooser)
{
this.Chart = Chart;
Expand All @@ -34,7 +33,7 @@ public ChartInstance(CartesianChart Chart, ListBox Chooser)

public void AddSeries<T>(DataSeries<T> Series)
{
Log.Output(Log.Severity.INFO, Log.Source.GUI, "Adding series, current series count:" + this.Chart.Series.Count);
if (this.Chart.Series.Count == 0) { this.Chart.AxisY.Clear(); }
LiveCharts.Wpf.Axis Y = new LiveCharts.Wpf.Axis()
{
Title = Series.AxisLabel
Expand All @@ -44,28 +43,36 @@ public void AddSeries<T>(DataSeries<T> Series)
GLineSeries ChartSeries = new GLineSeries(Series.GetMapper())
{
Values = Series.Data,
Stroke = MainWindow.ScarletColour,
Fill = MainWindow.ScarletBackColour,
Stroke = UIHelper.ScarletColour,
Fill = UIHelper.ScarletBackColour,
PointGeometry = null
};
this.Chart.Series.Add(ChartSeries);

object[] AllSeries = DataHandler.GetSeries();
if (AllSeries.Contains(Series)) { this.SeriesIndexList.Add(Array.IndexOf(AllSeries, Series)); }
}

// Thanks Sasha!
public void AddByIndex(int Index)
{
if (DataHandler.GetSeries().Length <= Index) { return; }
object Series = DataHandler.GetSeries()[Index];
Type type = Series.GetType();
Type Generic = type.GetGenericArguments()[0];
MethodInfo Info = this.GetType().GetMethod("AddSeries");
Info = Info.MakeGenericMethod(Generic);
Info.Invoke(this, new object[] { Series });
this.SeriesIndexList.Add(Index);
}

public HashSet<int> GetIndices() { return this.SeriesIndexList; }

public void Clear()
{
this.Chart.Series.Clear();
this.Chart.AxisY.Clear();
this.SeriesIndexList.Clear();
}
}

Expand Down
58 changes: 51 additions & 7 deletions Science/Science Base/Controls.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Scarlet.Communications;
using Scarlet.Utilities;
using Science.Library;
Expand All @@ -11,14 +8,61 @@ namespace Science_Base
{
public static class Controls
{

public static bool IsDrillEnabled;
public static bool IsDrillEnabled, SampleDoorState;
private static int DrillSpd = 0;
private static int RailSpd = 0;

public static void DrillSpeedChange(int NewValue)
{
if (NewValue < -100 || NewValue > 100) { NewValue = 0; }
Packet Packet = new Packet(new Message(ScienceConstants.Packets.CONTROL, new byte[] { (byte)Math.Abs(NewValue), ((NewValue < 0) ? (byte)0x01 : (byte)0x00) }), true, ScienceConstants.CLIENT_NAME);
if (IsDrillEnabled && Server.GetClients().Contains(ScienceConstants.CLIENT_NAME)) { Server.Send(Packet); }
if (!IsDrillEnabled) { NewValue = 0; }
DrillSpd = NewValue;
SendDrillSpdPacket();
}

public static void RailSpeedChange(int NewValue)
{
if (NewValue < 0 || NewValue > 100) { NewValue = 0; }
RailSpd = NewValue;
SendRailSpdPacket();
}

public static void RailTargetChange(bool FromTop, float TargetDist)
{
byte Command;
if (FromTop && float.IsNaN(TargetDist)) { Command = 0x00; }
else if (!FromTop && float.IsNaN(TargetDist)) { Command = 0x01; }
else { Command = (byte)(FromTop ? 0x02 : 0x03); }
Packet Packet = new Packet(new Message(ScienceConstants.Packets.RAIL_TARGET_SET, new byte[] { Command }.Concat(UtilData.ToBytes(TargetDist)).ToArray()), false, ScienceConstants.CLIENT_NAME);
Server.Send(Packet);
}

public static void SampleDoorChange(bool NewValue)
{
Packet Packet = new Packet(new Message(ScienceConstants.Packets.SERVO_SET, new byte[]
{
0x00,
}.Concat(UtilData.ToBytes((int)(NewValue ? 0x01 : 0x00))).ToArray()), false, ScienceConstants.CLIENT_NAME);
Server.Send(Packet);
}

private static void SendDrillSpdPacket()
{
Packet Packet = new Packet(new Message(ScienceConstants.Packets.DRILL_SPEED_SET, new byte[]
{
(byte)(((DrillSpd < 0) ? 0b10 : 0b00) | (IsDrillEnabled ? 0b01 : 0b00)),
(byte)Math.Abs(DrillSpd)
}), false, ScienceConstants.CLIENT_NAME);
if (Server.GetClients().Contains(ScienceConstants.CLIENT_NAME)) { Server.Send(Packet); }
}

private static void SendRailSpdPacket()
{
Packet Packet = new Packet(new Message(ScienceConstants.Packets.RAIL_SPEED_SET, new byte[]
{
(byte)Math.Abs(RailSpd)
}), false, ScienceConstants.CLIENT_NAME);
if (Server.GetClients().Contains(ScienceConstants.CLIENT_NAME)) { Server.Send(Packet); }
}

}
Expand Down
3 changes: 1 addition & 2 deletions Science/Science Base/Data.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,14 @@ public void Add(DataUnit Unit)
Datum<DataType> Added = new Datum<DataType>
{
Time = Unit.GetValue<DateTime>("Time"),
Data = Unit.GetValue<DataType>(DataUnitEntry)
Data = Unit.GetValue<DataType>(this.DataUnitEntry)
};
this.Data.Add(Added);
}

private double GetYVal(Datum<DataType> Datum)
{
return Convert.ToDouble(Datum.Data);
//return double.Parse(Datum.Data.ToString()); // TODO: This is extremely terrible.
}
}
}
76 changes: 59 additions & 17 deletions Science/Science Base/DataHandler.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Threading;
using Scarlet.Communications;
using Scarlet.Components.Sensors;
using Scarlet.Utilities;
Expand All @@ -12,55 +12,70 @@ public static class DataHandler
{
public static DataSeries<float> ThermoInt = new DataSeries<float>("Thermocouple Internal", "Sensor Temperature (°C)");
public static DataSeries<float> ThermoExt = new DataSeries<float>("Thermocouple External", "Ground Temperature (°C)");
public static DataSeries<int> UV = new DataSeries<int>("UV Light", "UV Light (µm/cm²)");
public static DataSeries<int> UV = new DataSeries<int>("UV Light", "UV Light (µW/cm²)");
public static DataSeries<float> AirPollution = new DataSeries<float>("Air Pollution", "Air Pollution (PPM)");
public static DataSeries<double> AirTemp = new DataSeries<double>("Air Temperature", "Temperature (°C)");
public static DataSeries<double> AirHumidity = new DataSeries<double>("Air Humidity", "Relative Humidity (%)");
public static DataSeries<double> AirPressure = new DataSeries<double>("Air Pressure", "Pressure (Pa)");
public static DataSeries<float> SoilMoisture = new DataSeries<float>("Soil Moisture", "Volumetric Water Content (%)");
// TODO: Add the rest of the serieses.

public static DataSeries<double> SupplyVoltage = new DataSeries<double>("Supply Voltage", "Supply Voltage (V)");
public static DataSeries<double> SystemCurrent = new DataSeries<double>("System Current", "System Current (A)");
public static DataSeries<double> DrillCurrent = new DataSeries<double>("Drill Current", "Drill Current (A)");
public static DataSeries<double> RailCurrent = new DataSeries<double>("Rail Current", "Rail Current (A)");

public static DataSeries<double> AIn0 = new DataSeries<double>("Analogue 0", "Analogue Input");
public static DataSeries<double> AIn1 = new DataSeries<double>("Analogue 1", "Analogue Input");

public static DataSeries<int> RandomData = new DataSeries<int>("Random", "Rubbish");
private static Random Random;

public static DataSeries<double> AIn = new DataSeries<double>("Analogue Input", "Input (Vb)");

public static void Start()
{
Random = new Random();
Parse.SetParseHandler(ScienceConstants.Packets.GND_SENSOR, PacketGroundSensor);
Parse.SetParseHandler(ScienceConstants.Packets.SYS_SENSOR, PacketSysSensor);
Parse.SetParseHandler(ScienceConstants.Packets.RAIL_STATUS, PacketRailStatus);
new Thread(new ThreadStart(DoAdds)).Start();
}

public static object[] GetSeries()
{
return new object[] { ThermoInt, ThermoExt, UV, AirPollution, SupplyVoltage, SystemCurrent, DrillCurrent, RailCurrent, RandomData, AIn };
return new object[] { ThermoInt, ThermoExt, UV, AirPollution, AirTemp, AirHumidity, AirPressure, SoilMoisture, SupplyVoltage, SystemCurrent, DrillCurrent, RailCurrent, RandomData, AIn0, AIn1 };
}

public static void PacketGroundSensor(Packet Packet)
{
if(Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 16)
if(Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 40)
{
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "Ground sensor packet invalid. Discarding.");
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "Ground sensor packet invalid. Discarding. Length: " + Packet?.Data?.Payload?.Length);
return;
}
//float SoilMoisture = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 0, 4));
DateTime Timestamp = DateTime.Now;
int UVLight = UtilData.ToInt(UtilMain.SubArray(Packet.Data.Payload, 0, 4));
uint ThermocoupleData = UtilData.ToUInt(UtilMain.SubArray(Packet.Data.Payload, 4, 4));
double AInData = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 8, 8));
ThermoExt.Data.Add(new Datum<float>(DateTime.Now, MAX31855.ConvertExternalFromRaw(ThermocoupleData)));
ThermoInt.Data.Add(new Datum<float>(DateTime.Now, MAX31855.ConvertInternalFromRaw(ThermocoupleData)));
UV.Data.Add(new Datum<int>(DateTime.Now, UVLight));
AIn.Data.Add(new Datum<double>(DateTime.Now, AInData));
float AirQuality = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 4, 4));
float SoilMoist = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 8, 4));
uint ThermocoupleData = UtilData.ToUInt(UtilMain.SubArray(Packet.Data.Payload, 12, 4));
double AtmoTemp = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 16, 8));
double AtmoPres = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 24, 8));
double AtmoHumid = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 32, 8));

UV.Data.Add(new Datum<int>(Timestamp, UVLight));
AirPollution.Data.Add(new Datum<float>(Timestamp, AirQuality));
SoilMoisture.Data.Add(new Datum<float>(Timestamp, SoilMoist));
ThermoExt.Data.Add(new Datum<float>(Timestamp, MAX31855.ConvertExternalFromRaw(ThermocoupleData)));
ThermoInt.Data.Add(new Datum<float>(Timestamp, MAX31855.ConvertInternalFromRaw(ThermocoupleData)));
AirTemp.Data.Add(new Datum<double>(Timestamp, AtmoTemp));
AirPressure.Data.Add(new Datum<double>(Timestamp, AtmoPres));
AirHumidity.Data.Add(new Datum<double>(Timestamp, AtmoHumid));
}

public static void PacketSysSensor(Packet Packet)
{
if (Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 40)
{
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "System sensor packet invalid. Discarding.");
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "System sensor packet invalid. Discarding. Length: " + Packet?.Data?.Payload?.Length);
return;
}
double SysA = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 0, 8));
Expand All @@ -77,15 +92,42 @@ public static void PacketSysSensor(Packet Packet)
RailCurrent.Data.Add(new Datum<double>(Sample, RailA));
}

public static void PacketTesting(Packet Packet)
{
if (Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 12)
{
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "System sensor packet invalid. Discarding. Length: " + Packet?.Data?.Payload?.Length);
return;
}
int Enc = UtilData.ToInt(UtilMain.SubArray(Packet.Data.Payload, 0, 4));
DateTime Sample = new DateTime(UtilData.ToLong(UtilMain.SubArray(Packet.Data.Payload, 4, 8)));
}

public static void PacketRailStatus(Packet Packet)
{
if (Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 17)
{
Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "Rail status packet invalid. Discarding. Length: " + Packet?.Data?.Payload?.Length);
return;
}

byte Status = Packet.Data.Payload[0];
float RailSpeed = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 1, 4));
float DepthTop = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 5, 4));
float HeightGround = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 9, 4));
float Target = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 13, 4));
BaseMain.Window.UpdateRail(RailSpeed, DepthTop, HeightGround, Target, ((Status & 0b100) == 0b100), ((Status & 0b10) == 0b10), ((Status & 0b1) == 0b1));
}

private static void DoAdds()
{
Log.Output(Log.Severity.INFO, Log.Source.GUI, "Beginning data addition.");
Log.Output(Log.Severity.DEBUG, Log.Source.GUI, "Beginning random data addition.");
for (int i = 0; i < 600; i++)
{
Thread.Sleep(150);
RandomData.Data.Add(new Datum<int>(DateTime.Now, Random.Next(100)));
}
Log.Output(Log.Severity.INFO, Log.Source.GUI, "Data addition ended.");
Log.Output(Log.Severity.DEBUG, Log.Source.GUI, "Random data addition finished.");

}

Expand Down
Loading

0 comments on commit a4a02bf

Please sign in to comment.