Files
DP44/DataPRO/DASFactory/DASFactory.Ribeye.cs
2026-04-17 14:55:32 -04:00

205 lines
7.3 KiB
C#

using System;
using System.Collections.Generic;
using DTS.Common.DAS.Concepts;
using DTS.Common.Enums.DASFactory;
using DTS.Common.ICommunication;
using DTS.Common.Interface.DASFactory;
using DTS.Common.Utilities.Logging;
using DTS.DASLib.Command.Ribeye;
using DTS.DASLib.Service;
namespace DTS.DASLib.DASFactory
{
internal class RibeyeHandling : IDeviceSetup
{
static readonly float AAFilterDivider = 5.0F;
static readonly Dictionary<uint, float> Samplerate2AAFilterDict = new Dictionary<uint, float>
{
{500, 500.0F/AAFilterDivider},
{1000, 1000.0F/AAFilterDivider},
{2500, 2500.0F/AAFilterDivider},
{5000, 5000.0F/AAFilterDivider},
{10000, 10000.0F/AAFilterDivider},
{20000, 20000.0F/AAFilterDivider},
{25000, 25000.0F/AAFilterDivider},
{50000, 50000.0F/AAFilterDivider},
{100000, 100000.0F/AAFilterDivider}
};
public RibeyeHandling(bool _utilMode)
{
}
public bool QueryInformation(ConnectedDevice dev)
{
if (!(dev.Dev is IConnectedDAS))
{
return false;
}
var DASCommDev = ((IConnectedDAS)dev.Dev).DASComm;
if (!(DASCommDev is ICommunication))
{
return false;
}
var CommDev = DASCommDev as ICommunication;
try
{
var dasInfo = new InfoResult { MaxNumberOfModules = 10 };
string SerialNumber;
uint NumberOfLEDs;
// Need to bootstrap protocol version ...
CommDev.ProtocolVersion = 1;
// Above left in place for future use.
var Status = new QueryArmAndTriggerStatus(CommDev);
try
{
Status.SyncExecute();
}
catch
{
// The ribeye will always fail this command on the first boot up (problably because
// their CRC is not inited right.
//
// Silently retry.
Status.SyncExecute();
}
if (Status.IsArmed)
{
SerialNumber = "Ribeye";
NumberOfLEDs = 18; // Would be nice to have a better fall back
}
else
{
var SerialNumberQuery = new QuerySerialNumber(CommDev);
SerialNumberQuery.SyncExecute();
SerialNumber = SerialNumberQuery.SerialNumber;
var LEDQuery = new QueryNumberOfLEDs(CommDev);
LEDQuery.SyncExecute();
NumberOfLEDs = LEDQuery.NumberOfLEDs;
}
dasInfo.Modules = new InfoResult.Module[NumberOfLEDs];
CommDev.FirmwareVersion = "0000";
DASCommDev.SerialNumber = SerialNumber;
var serialNumbers = new string[NumberOfLEDs + 1];
var firmwareVersions = new string[NumberOfLEDs + 1];
serialNumbers[0] = DASCommDev.SerialNumber;
firmwareVersions[0] = CommDev.FirmwareVersion;
for (var Index = 0; Index < NumberOfLEDs; Index++)
{
var module = new InfoResult.Module
{
ModuleArrayIndex = Index,
MaxRecordingSamples = 300000,
NumberOfChannels = 3,
SerialNumber = DASCommDev.SerialNumber + "-" + Index,
SupportedModes = new[]
{
DFConstantsAndEnums.RecordingMode.CircularBuffer,
DFConstantsAndEnums.RecordingMode.RecorderMode
},
SupportedSampleRates = new uint[1]
};
// this should be adjusted to real-life
//module.SerialNumber = (dev as IDASCommunication).SerialNumber + "-" + Index.ToString();
module.SupportedSampleRates[0] = 10000;
module.TypeOfModule = DFConstantsAndEnums.ModuleType.RibeyeLED; // for now
module.SampleRate2AAFrequency = Samplerate2AAFilterDict;
dasInfo.Modules[Index] = module;
serialNumbers[Index + 1] = module.SerialNumber;
firmwareVersions[Index + 1] = "0000";
}
//these are from the ribeye protocol specifications pdf, specifically
// "30 second flash memory" which by default is supporting 6 ribs sensing in 3 directions
// at 10k samples/sec.
dasInfo.MaxEventStorageSpaceInBytes = 30 * 10000 * 6 * 3;
//note this could be inaccurate if we dropped into here already armed, the code
//above will just constant it to 18 and so our calculations might be off.
dasInfo.NumberOfBytesPerSampleClock = NumberOfLEDs;
var icomm_dasinfo = new Communication_DASInfo { SerialNumbers = new string[1] };
icomm_dasinfo.SerialNumbers[0] = SerialNumber;
icomm_dasinfo.FirmwareVersions = firmwareVersions;
CommDev.DASInfo = icomm_dasinfo;
DASCommDev.SetDASInfo(dasInfo);
try
{
if (dev.Dev is IConnectedDAS idas)
{
idas.DASComm?.ReadFirstUseDate();
}
}
catch (Exception ex) { APILogger.Log(ex); }
return true;
}
catch (Exception)
{
var dasInfo = new InfoResult
{
MaxNumberOfModules = 10,
Modules = new InfoResult.Module[0]
};
DASCommDev.SetDASInfo(dasInfo);
dev.InUpdateMode = true;
return false;
}
}
public ICommunication GetICommunication()
{
return new EthernetRibeye();
}
public ICommunication GetICommunication(ConnectedDevice dev)
{
return (dev.Dev as ConnectedEthernetRibeye).Comm;
}
public IConnectedDevice GetIConnectedDevice(DTS.Common.Interface.DASFactory.ICommunication comm)
{
return new ConnectedEthernetRibeye(comm as EthernetRibeye);
}
public bool IsCorrectType(ConnectedDevice dev)
{
return dev.Dev is ConnectedEthernetRibeye;
}
public DFConstantsAndEnums.DASType GetDASType()
{
return DFConstantsAndEnums.DASType.ETHERNET_RIBEYE;
}
public Guid GetGuid()
{
return Guid.Empty;
}
public int GetProductId()
{
return 0;
}
public string GetProductIdString()
{
return string.Empty;
}
public void SetHandler(DeviceHandling handler)
{
}
}
}