Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions AntPlus.Extensions.Hosting/AntCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@ public async Task StartScanning()
/// <param name="e">The ANT response.</param>
private void MessageHandler(object? sender, AntResponse e)
{
_logger.LogAntResponse(LogLevel.Trace, e);

// check for a valid payload
if (e.Payload == null || e.Payload.Length < 3)
{
Expand Down
9 changes: 5 additions & 4 deletions AntPlus.Extensions.Hosting/Hosting.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,12 @@
<PackageIcon>PackageLogo.png</PackageIcon>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<PackageReleaseNotes>
Updated NuGet dependencies.
1. Removed unnecessary logging.
2. Updated NuGet dependencies.
</PackageReleaseNotes>
<IncludeSymbols>True</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<VersionPrefix>2.0.6</VersionPrefix>
<VersionPrefix>2.0.7</VersionPrefix>
<PackageProjectUrl>https://stephenhidem.github.io/AntPlus</PackageProjectUrl>
<RepositoryUrl>https://github.com/StephenHidem/AntPlus</RepositoryUrl>
<Configurations>Debug;Release</Configurations>
Expand All @@ -41,8 +42,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.8" />
<PackageReference Include="Microsoft.Maui.Core" Version="10.0.70" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.9" />
<PackageReference Include="Microsoft.Maui.Core" Version="10.0.71" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.300">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
2 changes: 0 additions & 2 deletions AntPlus/AntDeviceCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,6 @@ public async Task StartScanning()

private void MessageHandler(object? sender, AntResponse e)
{
_logger.LogAntResponse(LogLevel.Trace, e);

// check for a valid payload
if (e.Payload == null || e.Payload.Length < 3)
{
Expand Down
10 changes: 5 additions & 5 deletions AntPlus/AntPlus.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<RootNamespace>SmallEarthTech.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
<PackageId>SmallEarthTech.$(AssemblyName)</PackageId>
<VersionPrefix>6.2.0</VersionPrefix>
<VersionPrefix>6.2.1</VersionPrefix>
<Title>ANT+ Class Library</Title>
<PackageProjectUrl>https://stephenhidem.github.io/AntPlus</PackageProjectUrl>
<Authors>Stephen Hidem</Authors>
Expand All @@ -23,7 +23,7 @@
<PackageIcon>PackageLogo.png</PackageIcon>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<PackageReleaseNotes>
1. Added UnknownDataPageReceived event to AntDevice class. This allows applications to receive data pages that are not defined in the library. This is useful for receiving custom data pages or data pages that have not yet been added to the library.
1. Improved logging with ANT device number scopes.
2. Updated NuGet dependencies.
</PackageReleaseNotes>
<Configurations>Debug;Release</Configurations>
Expand Down Expand Up @@ -95,9 +95,9 @@

<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.8" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.8" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.9" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.9" />
<PackageReference Include="Microsoft.Extensions.Options" Version="10.0.9" />
</ItemGroup>

<ItemGroup>
Expand Down
80 changes: 42 additions & 38 deletions AntPlus/DeviceProfiles/AssetTracker/Tracker.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.Logging;
using SmallEarthTech.AntRadioInterface;
using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -50,7 +51,7 @@ public enum DataPage
/// </code>
/// This ensures changes to the collection are thread safe and marshalled on the UI thread.
/// </remarks>
public object CollectionLock = new object();
public readonly object CollectionLock = new();

/// <summary>Gets the collection of assets being tracked.</summary>
public ObservableCollection<Asset> Assets { get; } = new ObservableCollection<Asset>();
Expand Down Expand Up @@ -89,48 +90,51 @@ public Tracker(ChannelId channelId, IAntChannel antChannel, ILogger<Tracker> log
/// <remarks>The asset is removed from the <see cref="Assets"/> collection if the <see cref="Asset.AssetStatus.RemoveAsset"/> flag is set.</remarks>
public override void Parse(byte[] dataPage)
{
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
using (_logger.BeginScope("DeviceNumber={DeviceNumber}", ChannelId.DeviceNumber))
{
case DataPage.AssetLocation1:
Asset asset = GetAsset(dataPage);
asset.ParseLocation1(dataPage);
if (asset.Status.HasFlag(Asset.AssetStatus.RemoveAsset))
{
lock (CollectionLock)
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
{
Comment on lines +93 to +97

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Creating a log scope (BeginScope) on every single message parsed (which happens multiple times per second per device) introduces significant allocation overhead and GC pressure, especially when logging is disabled (which is the default in production). Since a log scope only has an effect if a log message is actually written during its lifetime, you should conditionally create the scope only when logging is actually enabled. This applies to all other Parse overrides in the device profiles as well.

            IDisposable? scope = _logger.IsEnabled(LogLevel.Trace)
                ? _logger.BeginScope("DeviceNumber={DeviceNumber}", ChannelId.DeviceNumber)
                : null;
            using (scope)
            {
                base.Parse(dataPage);
                switch ((DataPage)dataPage[0])
                {

case DataPage.AssetLocation1:
Asset asset = GetAsset(dataPage);
asset.ParseLocation1(dataPage);
if (asset.Status.HasFlag(Asset.AssetStatus.RemoveAsset))
{
lock (CollectionLock)
{
Assets.Remove(asset);
}
}
break;
case DataPage.AssetLocation2:
GetAsset(dataPage).ParseLocation2(dataPage);
break;
case DataPage.NoAssets:
if (Assets.Count > 0)
{
Assets.Remove(asset);
lock (CollectionLock)
{
Assets.Clear();
}
}
}
break;
case DataPage.AssetLocation2:
GetAsset(dataPage).ParseLocation2(dataPage);
break;
case DataPage.NoAssets:
if (Assets.Count > 0)
{
lock (CollectionLock)
break;
case DataPage.AssetId1:
GetAsset(dataPage).ParseIdPage1(dataPage);
break;
case DataPage.AssetId2:
GetAsset(dataPage).ParseIdPage2(dataPage);
break;
case DataPage.DisconnectCommand:
Disconnected = true;
break;
default:
// Handle common data pages and unknown data pages.
if (!CommonDataPages.ParseCommonDataPage(dataPage))
{
Assets.Clear();
OnUnknownDataPageReceived(dataPage);
}
}
break;
case DataPage.AssetId1:
GetAsset(dataPage).ParseIdPage1(dataPage);
break;
case DataPage.AssetId2:
GetAsset(dataPage).ParseIdPage2(dataPage);
break;
case DataPage.DisconnectCommand:
Disconnected = true;
break;
default:
// Handle common data pages and unknown data pages.
if (!CommonDataPages.ParseCommonDataPage(dataPage))
{
OnUnknownDataPageReceived(dataPage);
}
break;
break;
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions AntPlus/DeviceProfiles/BicyclePower/BicyclePower.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,13 @@ public static BicyclePower GetBicyclePowerSensor(byte[] dataPage, ChannelId chan
if ((DataPage)dataPage[0] == DataPage.CrankTorqueFrequency)
{
// return CTF sensor
CrankTorqueFrequencySensor sensor = new CrankTorqueFrequencySensor(channelId, antChannel, loggerFactory.CreateLogger<CrankTorqueFrequencySensor>(), timeout);
CrankTorqueFrequencySensor sensor = new(channelId, antChannel, loggerFactory.CreateLogger<CrankTorqueFrequencySensor>(), timeout);
sensor.Parse(dataPage);
return sensor;
}
else
{
StandardPowerSensor sensor = new StandardPowerSensor(channelId, antChannel, loggerFactory.CreateLogger<StandardPowerSensor>(), timeout);
StandardPowerSensor sensor = new(channelId, antChannel, loggerFactory.CreateLogger<StandardPowerSensor>(), timeout);
sensor.Parse(dataPage);
return sensor;
}
Expand Down
2 changes: 1 addition & 1 deletion AntPlus/DeviceProfiles/BicyclePower/Calibration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public partial class StandardPowerSensor
/// </code>
/// This ensures changes to the collection are thread safe and marshalled on the UI thread.
/// </remarks>
public object CollectionLock = new object();
public readonly object CollectionLock = new();
/// <summary>Gets a value indicating whether automatic zero is supported.</summary>
[ObservableProperty]
private bool autoZeroSupported;
Expand Down
25 changes: 14 additions & 11 deletions AntPlus/DeviceProfiles/BicyclePower/CrankTorqueFrequencySensor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,18 +74,21 @@ public CrankTorqueFrequencySensor(ChannelId channelId, IAntChannel antChannel, I
/// <param name="dataPage">The data page.</param>
public override void Parse(byte[] dataPage)
{
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
using (_logger.BeginScope("DeviceNumber={DeviceNumber}", ChannelId.DeviceNumber))
{
case DataPage.Calibration:
ParseCalibrationMessage(dataPage);
break;
case DataPage.CrankTorqueFrequency:
ParseCTFMessage(dataPage);
break;
default:
OnUnknownDataPageReceived(dataPage);
break;
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
{
case DataPage.Calibration:
ParseCalibrationMessage(dataPage);
break;
case DataPage.CrankTorqueFrequency:
ParseCTFMessage(dataPage);
break;
default:
OnUnknownDataPageReceived(dataPage);
break;
}
}
}

Expand Down
93 changes: 48 additions & 45 deletions AntPlus/DeviceProfiles/BicyclePower/StandardPowerSensor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,52 +85,55 @@ public StandardPowerSensor(ChannelId channelId, IAntChannel antChannel, ILogger<
/// <inheritdoc/>
public override void Parse(byte[] dataPage)
{
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
using (_logger.BeginScope("DeviceNumber={DeviceNumber}", ChannelId.DeviceNumber))
{
case DataPage.Calibration:
ParseCalibrationPage(dataPage);
break;
case DataPage.GetSetParameters:
ParseParameters(dataPage);
break;
case DataPage.MeasurementOutput:
ParseMeasurementOutputData(dataPage);
break;
case DataPage.PowerOnly:
ParsePowerOnly(dataPage);
break;
case DataPage.WheelTorque:
TorqueSensor ??= new StandardWheelTorqueSensor(_logger);
TorqueSensor.ParseTorque(dataPage);
break;
case DataPage.CrankTorque:
TorqueSensor ??= new StandardCrankTorqueSensor(_logger);
TorqueSensor.ParseTorque(dataPage);
break;
case DataPage.TorqueEffectivenessAndPedalSmoothness:
ParseTEPS(dataPage);
break;
case DataPage.TorqueBarycenter:
case DataPage.RightForceAngle:
case DataPage.LeftForceAngle:
case DataPage.PedalPosition:
if (TorqueSensor is StandardCrankTorqueSensor sensor)
{
sensor.ParseCyclingDynamics(dataPage);
}
else
{
_logger.LogIgnoredDataPage<DataPage>(dataPage);
}
break;
default:
// attempt to parse common data pages, otherwise log as unknown
if (!CommonDataPages.ParseCommonDataPage(dataPage))
{
OnUnknownDataPageReceived(dataPage);
}
break;
base.Parse(dataPage);
switch ((DataPage)dataPage[0])
{
case DataPage.Calibration:
ParseCalibrationPage(dataPage);
break;
case DataPage.GetSetParameters:
ParseParameters(dataPage);
break;
case DataPage.MeasurementOutput:
ParseMeasurementOutputData(dataPage);
break;
case DataPage.PowerOnly:
ParsePowerOnly(dataPage);
break;
case DataPage.WheelTorque:
TorqueSensor ??= new StandardWheelTorqueSensor(_logger);
TorqueSensor.ParseTorque(dataPage);
break;
case DataPage.CrankTorque:
TorqueSensor ??= new StandardCrankTorqueSensor(_logger);
TorqueSensor.ParseTorque(dataPage);
break;
case DataPage.TorqueEffectivenessAndPedalSmoothness:
ParseTEPS(dataPage);
break;
case DataPage.TorqueBarycenter:
case DataPage.RightForceAngle:
case DataPage.LeftForceAngle:
case DataPage.PedalPosition:
if (TorqueSensor is StandardCrankTorqueSensor sensor)
{
sensor.ParseCyclingDynamics(dataPage);
}
else
{
_logger.LogIgnoredDataPage<DataPage>(dataPage);
}
break;
default:
// attempt to parse common data pages, otherwise log as unknown
if (!CommonDataPages.ParseCommonDataPage(dataPage))
{
OnUnknownDataPageReceived(dataPage);
}
break;
}
}
}

Expand Down
Loading