Common/../StreamingDecoder: - Protocol @m for bend detection, see BendDetectDataEventArgs
This commit is contained in:
parent
49ad983abd
commit
34595d9fb0
1
.gitignore
vendored
1
.gitignore
vendored
@ -18,7 +18,6 @@
|
|||||||
mono_crash.*
|
mono_crash.*
|
||||||
|
|
||||||
# Build results
|
# Build results
|
||||||
bin/
|
|
||||||
[Aa]pp_[Dd]ata/
|
[Aa]pp_[Dd]ata/
|
||||||
[Dd]ebug/
|
[Dd]ebug/
|
||||||
[Dd]ebugPublic/
|
[Dd]ebugPublic/
|
||||||
|
|||||||
@ -27,6 +27,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataPackages", "Hardware\Wa
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Shared", ".Shared", "{26EB462B-1FAC-4CEA-A9B9-DB96CA9CC864}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Shared", ".Shared", "{26EB462B-1FAC-4CEA-A9B9-DB96CA9CC864}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
..\.gitignore = ..\.gitignore
|
||||||
Hardware\WaterMeter\Genesis\GenesisCore\configuration.json = Hardware\WaterMeter\Genesis\GenesisCore\configuration.json
|
Hardware\WaterMeter\Genesis\GenesisCore\configuration.json = Hardware\WaterMeter\Genesis\GenesisCore\configuration.json
|
||||||
.shared\NlogConfig.xml = .shared\NlogConfig.xml
|
.shared\NlogConfig.xml = .shared\NlogConfig.xml
|
||||||
.shared\SharedAssemblyInfo.cs = .shared\SharedAssemblyInfo.cs
|
.shared\SharedAssemblyInfo.cs = .shared\SharedAssemblyInfo.cs
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
<s:Boolean x:Key="/Default/Environment/ExcludedFiles/FilesAndFoldersToSkip/=1057AD21_002DBA22_002D4CAB_002DB3FE_002D88C5C9980E6A_002Fd_003AScripts_002Ff_003Ajquery_002D1_002E10_002E2_002Eintellisense_002Ejs/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/ExcludedFiles/FilesAndFoldersToSkip/=1057AD21_002DBA22_002D4CAB_002DB3FE_002D88C5C9980E6A_002Fd_003AScripts_002Ff_003Ajquery_002D1_002E10_002E2_002Eintellisense_002Ejs/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:String x:Key="/Default/Environment/Hierarchy/Build/SolBuilderDuo/UseMsbuildSolutionBuilder/@EntryValue">NewVersion</s:String>
|
<s:String x:Key="/Default/Environment/Hierarchy/Build/SolBuilderDuo/UseMsbuildSolutionBuilder/@EntryValue">NewVersion</s:String>
|
||||||
<s:Boolean x:Key="/Default/Environment/Hierarchy/EntityFrameworkOptions/IsAlreadyNotifiedAboutEntityFramework/@EntryValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/Hierarchy/EntityFrameworkOptions/IsAlreadyNotifiedAboutEntityFramework/@EntryValue">True</s:Boolean>
|
||||||
|
<s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">C:\Users\Thomas\AppData\Local\Temp\JetBrains\ReSharperPlatformVs15\vAny_33007af5\CoverageData\_Common.-1885154465\Snapshot\snapshot.utdcvr</s:String>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -216,9 +216,11 @@
|
|||||||
<Link>Properties\SharedAssemblyInfo.cs</Link>
|
<Link>Properties\SharedAssemblyInfo.cs</Link>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="EventArguments\CalibDataEventArgs.cs" />
|
<Compile Include="EventArguments\CalibDataEventArgs.cs" />
|
||||||
|
<Compile Include="EventArguments\BendDetectDataEventArgs.cs" />
|
||||||
<Compile Include="EventArguments\FlowDataEventArgs.cs" />
|
<Compile Include="EventArguments\FlowDataEventArgs.cs" />
|
||||||
<Compile Include="EventArguments\RegisterUpdateEventArgs.cs" />
|
<Compile Include="EventArguments\RegisterUpdateEventArgs.cs" />
|
||||||
<Compile Include="EventArguments\RequestResponseDataEventArgs.cs" />
|
<Compile Include="EventArguments\RequestResponseDataEventArgs.cs" />
|
||||||
|
<Compile Include="MeasurementRecords\BendDetectionRecord.cs" />
|
||||||
<Compile Include="MeasurementRecords\CalibrationRecord.cs" />
|
<Compile Include="MeasurementRecords\CalibrationRecord.cs" />
|
||||||
<Compile Include="MeasurementRecords\FlowTestRecord.cs" />
|
<Compile Include="MeasurementRecords\FlowTestRecord.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.EventArguments;
|
||||||
|
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public class BendDetectDataEventArgs : BaseDataEventArgs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// new record from Stream
|
||||||
|
/// </summary>
|
||||||
|
public BendDetectionRecord NewData;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Object GetEventData()
|
||||||
|
{
|
||||||
|
return NewData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,114 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Xylem.Common.Metrology.Measurements;
|
||||||
|
|
||||||
|
namespace Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
/// <summary>
|
||||||
|
/// Streaming record for protocol M (information about bend detection and correction)
|
||||||
|
/// </summary>
|
||||||
|
public class BendDetectionRecord : MeasurementRecord
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The status of the U0 detection for this measurement
|
||||||
|
/// </summary>
|
||||||
|
public enum StatusBendU0Enum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Status okay
|
||||||
|
/// </summary>
|
||||||
|
OKAY = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// Error code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
ERROR_GENESISFLOW_INSTALLATION_HIGH_TIME_DIFF = 0x0F41,
|
||||||
|
/// <summary>
|
||||||
|
/// Error code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
ERROR_GENESISFLOW_INSTALLATION_LOW_FLOW_IGNORE = 0x0F42,
|
||||||
|
/// <summary>
|
||||||
|
/// Error code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
ERROR_GENESISFLOW_INSTALLATION_BAD_CHANNELS = 0x0F43,
|
||||||
|
/// <summary>
|
||||||
|
/// Error code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
ERROR_GENESISFLOW_INSTALLATION_FIXED = 0x0F44
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// An enum describing the installation type detected
|
||||||
|
/// </summary>
|
||||||
|
public enum InstallationTypeEnum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Installation type code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
INSTALLATION_U0_180_360 = 0,
|
||||||
|
/// <summary>
|
||||||
|
/// Installation type code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
INSTALLATION_U0_90_270 = 1,
|
||||||
|
/// <summary>
|
||||||
|
/// Installation type code as defined by field name
|
||||||
|
/// </summary>
|
||||||
|
INSTALLATION_UNDISTURBED = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Status of U0 Bend detection
|
||||||
|
/// </summary>
|
||||||
|
public StatusBendU0Enum StatusBendU0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Installation type code
|
||||||
|
/// </summary>
|
||||||
|
public InstallationTypeEnum InstallationType;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The proportion of the installation correction to apply based on the detected
|
||||||
|
/// installation. 100% == 0x8000
|
||||||
|
/// </summary>
|
||||||
|
public Double CorrectionFactor_percent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The default proportion of the installation correction to apply based on the
|
||||||
|
/// detected installation. 100% == 0x8000
|
||||||
|
/// </summary>
|
||||||
|
private const UInt32 DefaultCorrectionFactor = 0x8000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scale for correction factor to apply to convert it to percentage value 100% == 0x8000
|
||||||
|
/// </summary>
|
||||||
|
public const Double CorrectionFactorScale = 100.0 / DefaultCorrectionFactor;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The volume in internal units before correction applied
|
||||||
|
/// </summary>
|
||||||
|
public Double PreCorrectionVolumeRaw;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The volume in internal units after correction applied
|
||||||
|
/// </summary>
|
||||||
|
public Double PostCorrectionVolumeRaw;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get result as string
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override String ToString()
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.Append($"Status={StatusBendU0}").Append(",")
|
||||||
|
.Append($"Installation={InstallationType}").Append(",")
|
||||||
|
.Append($"Factor={CorrectionFactor_percent}").Append(",")
|
||||||
|
.Append($"PreVolume={PreCorrectionVolumeRaw}").Append(",")
|
||||||
|
.Append($"PostVolume={PostCorrectionVolumeRaw}");
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,6 +8,13 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public enum LedMode
|
public enum LedMode
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Test mode with raw record to log.
|
||||||
|
/// Should give one <see cref="FlowTestRecord"/>
|
||||||
|
/// 3 times <see cref="CalibrationRecord"/> and
|
||||||
|
/// one <see cref="BendDetectionRecord"/>
|
||||||
|
/// </summary>
|
||||||
|
FlowTestAndCalibDataAndBendCorrect = 7,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Test mode with raw record to log. Should give one <see cref="FlowTestRecord"/>
|
/// Test mode with raw record to log. Should give one <see cref="FlowTestRecord"/>
|
||||||
/// 3 times <see cref="CalibrationRecord"/> and repeat this till led mode is switch
|
/// 3 times <see cref="CalibrationRecord"/> and repeat this till led mode is switch
|
||||||
|
|||||||
@ -29,6 +29,22 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
private const Double AmplitudeToVoltFactor = 1.0 / 0x400000 / 1000.0; // 2^22 100 0000 0000 0000 0000 0000b
|
private const Double AmplitudeToVoltFactor = 1.0 / 0x400000 / 1000.0; // 2^22 100 0000 0000 0000 0000 0000b
|
||||||
private const Double PulseWidthToRelFactor = 1.0 / 0x100; // 2^8
|
private const Double PulseWidthToRelFactor = 1.0 / 0x100; // 2^8
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default data for bend detection tests of Genesis
|
||||||
|
/// </summary>
|
||||||
|
private readonly BendDetectionRecord _bendDetectionDefault = new BendDetectionRecord
|
||||||
|
{
|
||||||
|
StatusBendU0 = BendDetectionRecord.StatusBendU0Enum.OKAY,
|
||||||
|
InstallationType = BendDetectionRecord.InstallationTypeEnum.INSTALLATION_UNDISTURBED,
|
||||||
|
CorrectionFactor_percent = 0.0,
|
||||||
|
PreCorrectionVolumeRaw = 0.0,
|
||||||
|
PostCorrectionVolumeRaw = 0.0,
|
||||||
|
TimeS = 0.0,
|
||||||
|
OverflowTimeS = CpuTimeOverflowS,
|
||||||
|
Crc = 0xFFFF,
|
||||||
|
IsValid = false
|
||||||
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default data for flow tests of Genesis
|
/// Default data for flow tests of Genesis
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -76,6 +92,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
|
|
||||||
private CalibrationRecord _dataCalibRec;
|
private CalibrationRecord _dataCalibRec;
|
||||||
private FlowTestRecord _dataFlowTestRec;
|
private FlowTestRecord _dataFlowTestRec;
|
||||||
|
private BendDetectionRecord _dataBendDetectRec;
|
||||||
private readonly Boolean _ignoreCorruptedData;
|
private readonly Boolean _ignoreCorruptedData;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -85,6 +102,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
{
|
{
|
||||||
_dataFlowTestRec = _dataDefault;
|
_dataFlowTestRec = _dataDefault;
|
||||||
_dataCalibRec = _rawDataDefault;
|
_dataCalibRec = _rawDataDefault;
|
||||||
|
_dataBendDetectRec = _bendDetectionDefault;
|
||||||
_ignoreCorruptedData = ignoreCorruptedData;
|
_ignoreCorruptedData = ignoreCorruptedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,6 +122,14 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
get; private set;
|
get; private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bend detection test data
|
||||||
|
/// </summary>
|
||||||
|
public BendDetectionRecord DataBendDetectTest
|
||||||
|
{
|
||||||
|
get; private set;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Decoding the raw message
|
/// Decoding the raw message
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -170,7 +196,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
|
|
||||||
switch (rawMsgFields[0])
|
switch (rawMsgFields[0])
|
||||||
{
|
{
|
||||||
case "@f":
|
case "@m":
|
||||||
|
_dataBendDetectRec.IsValid = rawRecordIsValid;
|
||||||
|
if (rawRecordIsValid || !_ignoreCorruptedData)
|
||||||
|
{
|
||||||
|
DecodeProtocolM(ref _dataBendDetectRec, rawMsgFields);
|
||||||
|
DataBendDetectTest = _dataBendDetectRec;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "@f":
|
||||||
_dataFlowTestRec.IsValid = rawRecordIsValid;
|
_dataFlowTestRec.IsValid = rawRecordIsValid;
|
||||||
if (rawRecordIsValid || !_ignoreCorruptedData)
|
if (rawRecordIsValid || !_ignoreCorruptedData)
|
||||||
{
|
{
|
||||||
@ -205,6 +240,44 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
return rawRecordIsValid;
|
return rawRecordIsValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extracting message from string fields for protocol 'm'
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataBendTestRec">reference to bend detection test record</param>
|
||||||
|
/// <param name="fields">Separated fields containing the measurement as string</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
/// <remarks date="2023-Mar-09" author="T.Wiedebusch">
|
||||||
|
/// - Modified using common CRC check in advance.
|
||||||
|
/// </remarks>
|
||||||
|
private static void DecodeProtocolM(ref BendDetectionRecord dataBendTestRec, IList<String> fields)
|
||||||
|
{
|
||||||
|
// time stamp attachment
|
||||||
|
dataBendTestRec.DecodedTime = DateTimeOffset.UtcNow;
|
||||||
|
|
||||||
|
// extract received CRC
|
||||||
|
dataBendTestRec.Crc = ushort.Parse(fields[(Int32)ProtMsubString.Crc],
|
||||||
|
NumberStyles.HexNumber);
|
||||||
|
// extract the status
|
||||||
|
dataBendTestRec.StatusBendU0 =
|
||||||
|
(BendDetectionRecord.StatusBendU0Enum)UInt32.Parse(fields[(Int32)ProtMsubString.Status],
|
||||||
|
NumberStyles.AllowHexSpecifier);
|
||||||
|
// extract the installation type
|
||||||
|
dataBendTestRec.InstallationType =
|
||||||
|
(BendDetectionRecord.InstallationTypeEnum)UInt32.Parse(fields[(Int32)ProtMsubString.Installation],
|
||||||
|
NumberStyles.AllowHexSpecifier);
|
||||||
|
// extract the correction factor in percent
|
||||||
|
dataBendTestRec.CorrectionFactor_percent =
|
||||||
|
UInt32.Parse(fields[(Int32)ProtMsubString.Factor],
|
||||||
|
NumberStyles.AllowHexSpecifier) * BendDetectionRecord.CorrectionFactorScale;
|
||||||
|
|
||||||
|
// build result values, the volume before and after correction can be positive or negative!
|
||||||
|
dataBendTestRec.PreCorrectionVolumeRaw = Int32.Parse(fields[(Int32)ProtMsubString.PreVolume],
|
||||||
|
NumberStyles.AllowHexSpecifier);
|
||||||
|
// build result values, the volume before and after correction can be positive or negative!
|
||||||
|
dataBendTestRec.PostCorrectionVolumeRaw = Int32.Parse(fields[(Int32)ProtMsubString.PostVolume],
|
||||||
|
NumberStyles.AllowHexSpecifier);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Extracting message from string fields for protocol 'f'
|
/// Extracting message from string fields for protocol 'f'
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -413,6 +486,18 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
CpuTime,
|
CpuTime,
|
||||||
Crc
|
Crc
|
||||||
}
|
}
|
||||||
|
/// field position in protocol 'm'
|
||||||
|
private enum ProtMsubString
|
||||||
|
{
|
||||||
|
//do not remove this needed for position in record
|
||||||
|
ProtType,
|
||||||
|
Status,
|
||||||
|
Installation,
|
||||||
|
Factor,
|
||||||
|
PreVolume,
|
||||||
|
PostVolume,
|
||||||
|
Crc
|
||||||
|
}
|
||||||
|
|
||||||
/// field position in protocol 'g'
|
/// field position in protocol 'g'
|
||||||
private enum ProtGsubString
|
private enum ProtGsubString
|
||||||
|
|||||||
@ -73,6 +73,27 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (_streamingDecode.DataBendDetectTest != null)
|
||||||
|
{
|
||||||
|
_streamingDecode.DataBendDetectTest.SyncMarkRecord = dataArgs.GetSyncMarkRecord();
|
||||||
|
_streamingDecode.DataBendDetectTest.ReceivedTime = dataArgs.GetReceivedTime();
|
||||||
|
if (_streamingDecode.DataBendDetectTest.IsValid)
|
||||||
|
{
|
||||||
|
OnRecordIsDecoded?.Invoke(this, new BendDetectDataEventArgs
|
||||||
|
{
|
||||||
|
NewData = _streamingDecode.DataBendDetectTest,
|
||||||
|
RawData = data
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (!_ignoreCorruptedData)
|
||||||
|
{
|
||||||
|
OnRecordIsDecoded?.Invoke(this, new BendDetectDataEventArgs
|
||||||
|
{
|
||||||
|
NewData = _streamingDecode.DataBendDetectTest,
|
||||||
|
RawData = data
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//toDo: handle trashy telegrams
|
//toDo: handle trashy telegrams
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,7 +129,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
|
|||||||
WriteValue(Register.Genesisflow.SampleRate, SampleRateHz);
|
WriteValue(Register.Genesisflow.SampleRate, SampleRateHz);
|
||||||
|
|
||||||
_channels = 4;
|
_channels = 4;
|
||||||
WriteValue(Register.Genesisflow.LedMode, (Byte)LedMode.FlowTestAndCalibData);
|
WriteValue(Register.Genesisflow.LedMode, (Byte)LedMode.FlowTestAndCalibDataAndBendCorrect);
|
||||||
|
|
||||||
if (_currentGenesis.IsLoggedOn)
|
if (_currentGenesis.IsLoggedOn)
|
||||||
{
|
{
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user