private static void CompareDataPortConfig(DataPortConfig dataPortConfig, DataPortConfig defaultDataPortConfig) { var isValid = true; if (!dataPortConfig.ActChannelsDataPacking.SequenceEqual(defaultDataPortConfig.ActChannelsDataPacking)) { isValid = false; SmartLog.WriteErrorLine( $"Act Channel Data Pack {dataPortConfig.ActChannelsDataPacking.ToHex()} not matching with default {defaultDataPortConfig.ActChannelsDataPacking.ToHex()}"); } if (!dataPortConfig.SampleInterval.SequenceEqual(defaultDataPortConfig.SampleInterval)) { isValid = false; SmartLog.WriteErrorLine( $"Sample Interval {dataPortConfig.SampleInterval.ToHex()} not matching with default {defaultDataPortConfig.SampleInterval.ToHex()}"); } if (!dataPortConfig.FirmwareVersion.SequenceEqual(defaultDataPortConfig.FirmwareVersion)) { isValid = false; SmartLog.WriteErrorLine( $"Firmware Version {dataPortConfig.FirmwareVersion.ToHex()} not matching with default {defaultDataPortConfig.FirmwareVersion.ToHex()}"); } if (!dataPortConfig.ModeFlag.SequenceEqual(defaultDataPortConfig.ModeFlag)) { isValid = false; SmartLog.WriteErrorLine( $"Mode Flag {dataPortConfig.ModeFlag.ToHex()} not matching with default {defaultDataPortConfig.ModeFlag.ToHex()}"); } if (!isValid) { _smartPort.WriteDataPortConfig(_boardId, dataPortConfig, defaultDataPortConfig); } }
public static ErrorCode SetDataPortConfig(void *handle, DataPortConfig config) { return(driver.c_SparkMax_SetDataPortConfig(handle, config)); }
// ReSharper disable once UnusedParameter.Local static async Task Main(string[] args) { Console.Clear(); Parser.Default.ParseArguments <Options>(args) .WithParsed(o => { _options = o; SmartLog.WriteLine(!string.IsNullOrWhiteSpace(o.BoardId) ? $"Entered IFB Board Id (in Hex). Current Arguments: --ifb {o.BoardId.ToUpper()}" : $"No IFB Board Id passed. Current Arguments: --ifb"); SmartLog.WriteLine(o.PrintRequest ? $"Print Request enabled. Current Arguments: --req {o.PrintRequest}" : $"Print Request disabled. Current Arguments: --req {o.PrintRequest}"); SmartLog.WriteLine(o.PrintResponse ? $"Print Response enabled. Current Arguments: --res {o.PrintResponse}" : $"Print Response disabled. Current Arguments: --res {o.PrintResponse}"); SmartLog.WriteLine(o.PrintDataPortConfig ? $"Print Data Port Config enabled. Current Arguments: --conf {o.PrintDataPortConfig}" : $"Print Data Port Config disabled. Current Arguments: --conf {o.PrintDataPortConfig}"); SmartLog.WriteLine(o.Model == 1 || o.Model == 2 ? $"Entered Model. Current Arguments: --mdl {o.Model + (o.Model== 1 ? ":Ax-Sg": ":Sg-Sg")}" : $"No Model entered. Current Arguments: --mdl"); }); if (args != null && args.Any() && args[0].Equals("--help", StringComparison.InvariantCultureIgnoreCase)) { return; } if (args != null && args.Any() && args[0].Equals("--version", StringComparison.InvariantCultureIgnoreCase)) { return; } Greet(); Init(); if (!DetectComPort()) { return; } GetBoardId(); Console.WriteLine(); DataPortConfig defaultDataPortConfig = _smartPort.GetDefaultDataPortConfig(); await _smartPort.Init(_boardId, _defaultComPort, _options); if (!_smartPort.Start()) { return; } var readDataPortConfig = _smartPort.ReadDataPortConfig(); //CompareDataPortConfig(readDataPortConfig, defaultDataPortConfig); var portTask = _smartPort.Go(menuOption: CommandType.Collect); while (portTask.Result.Selection != CommandType.Exit) { switch (portTask.Result.Selection) { case CommandType.JustCollect: { if (portTask.Result.ReturnObject != null) { var sensors = ((List <Sensor>)portTask.Result.ReturnObject); PrintCollectResponse(sensors); } break; } case CommandType.Collect: { if (portTask.Result.ReturnObject != null) { var sensors = ((List <Sensor>)portTask.Result.ReturnObject); if (sensors[1].Data != null && sensors[1].Data.Any()) { var channelThreeQuantized = //Math.Truncate(sensors[1].Data.Select(x => BitConverter.ToUInt16(x.Bytes, 0)) // .Average(x => x)); Math.Truncate(sensors[1].Data.Average(x => x.Value)); _isTip = channelThreeQuantized < 300 || channelThreeQuantized > 3800; } PrintCollectResponse(sensors); //if (_options.Model.Equals(2)) // sensors = sensors.Skip(2).Take(2).ToList(); await AdjustStrain(readDataPortConfig, sensors); await AdjustAx(readDataPortConfig, sensors); } break; } case CommandType.ReadDataPort: { if (portTask.Result.ReturnObject != null) { var dataPortConfig = ((DataPortConfig)portTask.Result.ReturnObject); CompareDataPortConfig(dataPortConfig, defaultDataPortConfig); } break; } } //portTask = _smartPort.Go(menuOption: _smartPort.Menu()); portTask = _smartPort.Go(menuOption: _smartPort.Menu(_printMenu)); _printMenu = false; } //SmartLog.WriteLine("Type exit to quite\n"); //while (!Convert.ToString(Console.ReadLine()).Equals("exit", StringComparison.OrdinalIgnoreCase)) //{ // SmartLog.WriteLine("Unknown command\n"); //} //_smartPort.PowerOff(); }
private static async Task AdjustStrain(DataPortConfig readDataPortConfig, List <Sensor> sensors) { if (readDataPortConfig.SensorChannels.Any(x => x.Type.ToDecimal(0) == (int)SensorType.StrainGauge)) { var strainSensors = sensors.Where(x => x.Afe == (_isTip? Afe.Tip: Afe.Top) && x.Type == SensorType.StrainGauge).ToList(); var isBalanced = false; var saveRequire = false; while (!isBalanced) { //while (strainSensors.Select(s => Math.Truncate(s.Data.Average(x => x.Value))) // .All(x => x < StrainRange.Min)) Task <LoopResponse> portTask; while (strainSensors.Select(s => Math.Truncate(s.Data.Select(x => Convert.ToInt16(BitConverter.ToUInt16(x.Bytes, 0))) .Average(b => b))) .All(x => x < StrainRange.Min)) { saveRequire = true; await _smartPort.Go(menuOption : CommandType.IncrementSg); portTask = _smartPort.Go(menuOption: CommandType.Collect); switch (_options.Model) { case 2: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(2).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; case 1 when _isTip: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(2).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; default: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(0).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; } PrintCollectResponse(strainSensors); } //while (strainSensors.Select(s => Math.Truncate(s.Data.Average(x => x.Value))) // .All(x => x > StrainRange.Max)) while (strainSensors.Select(s => Math.Truncate(s.Data.Select(x => Convert.ToInt16(BitConverter.ToUInt16(x.Bytes, 0))) .Average(x => x))) .All(x => x > StrainRange.Max)) { saveRequire = true; await _smartPort.Go(menuOption : CommandType.DecrementSg); portTask = _smartPort.Go(menuOption: CommandType.Collect); switch (_options.Model) { case 2: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(2).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; case 1 when _isTip: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(2).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; default: strainSensors = ((List <Sensor>)portTask.Result.ReturnObject).Skip(0).Take(2) .Where(x => x.Type == SensorType.StrainGauge).ToList(); break; } PrintCollectResponse(strainSensors); } //if (strainSensors.Select(s => Math.Truncate(s.Data.Average(x => x.Value))) // .All(x => x < StrainRange.Max) // && strainSensors.Select(s => Math.Truncate(s.Data.Average(x => x.Value))) // .All(x => x > StrainRange.Min)) if (strainSensors.Select(s => Math.Truncate(s.Data.Select(x => Convert.ToInt16(BitConverter.ToUInt16(x.Bytes, 0))).Average(x => x))) .All(x => x <= StrainRange.Max) && strainSensors.Select(s => Math.Truncate(s.Data.Select(x => Convert.ToInt16(BitConverter.ToUInt16(x.Bytes, 0))).Average(x => x))) .All(x => x >= StrainRange.Min) && saveRequire) { await _smartPort.Go(menuOption : CommandType.SaveSg); isBalanced = true; } else if (!saveRequire) { isBalanced = true; } } } }