Многократный вызов обработчика при подписке на несколько каналов сигнальных данных

Пробуем подписаться на несколько каналов сигнальных данных из программы на C# следующим образом:

private static void Subscribe(Device device)
{
    Subscribe(device, ChannelType.Signal, "T3");
    Subscribe(device, ChannelType.Signal, "T4");
    device.Execute(Command.StartSignal);
}

private static void Subscribe(Device device, ChannelType channelType, string channelName)
{
    if (DeviceTraits.HasChannelsWithType(device, channelType)) {
        IList<ChannelInfo> signalChannels = DeviceTraits.GetChannelsWithType(device, channelType);
        ChannelInfo? channelInfo = signalChannels.FirstOrDefault(ci => ci.Name == channelName);
        if (channelInfo != null) {
            log.Debug($"Subscribing to {channelType}.{channelName}");
            if (channelType == ChannelType.Signal) {
                device.AddSignalChannelDataListener(OnSignalReceived, channelInfo.Value);
            }
        }
    }
}

private static void OnSignalReceived(object sender, Device.SignalChannelData scd)
{
    log.Debug($"'{scd.ChannelInfo.Name}' data received: {scd.DataArray.Length} items, {scd.FirstSampleNumber}");
}

В логе при этом получаем такое:

2019-12-06 19:22:16.7467 TestApp1.TestApp1App [ 11] [Debug] Subscribing to Signal.T3
2019-12-06 19:22:16.7467 TestApp1.TestApp1App [ 11] [Debug] Subscribing to Signal.T4
2019-12-06 19:22:16.7467 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[Neuro::CommandData<enum Neuro::BrainbitCommand,enum Neuro::BrainbitCommandError,4000,2000>::setRequestData] Set request data. Command 2
2019-12-06 19:22:16.7467 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::sendCommandPacket] Sending command packet for command 2
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::sendCommandPacket] Command been sent
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::onStatusDataReceived] Status data received
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::parseState] Device new state: 2, previous state: 1
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[Neuro::CommandData<enum Neuro::BrainbitCommand,enum Neuro::BrainbitCommandError,4000,2000>::onResponseReceived] Response received. Command 2
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::parseVersion] Parsing firmware version
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[BrainbitImpl: Neuro::BrainbitImpl::parseVersion] Firmware version: 5
2019-12-06 19:22:16.7977 TestApp1.TestApp1App [  5] [Debug] 06-12-2019 07:22:16|[Neuro::CommandData<enum Neuro::BrainbitCommand,enum Neuro::BrainbitCommandError,4000,2000>::wait] Response ready
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 0 <-- 1-й пакет данных T4
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 0 
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 0 <-- еще раз 1-й пакет данных T4
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 2 <-- 2-й пакет данных T4
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 2 <-- еще раз 2-й пакет данных T4
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 0
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 2
2019-12-06 19:22:17.4387 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 2
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 4
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 4
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 4
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 4
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 6
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 6
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 8
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 12] [Debug] 'T3' data received: 2 items, packet number: 8
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 6
2019-12-06 19:22:17.4567 TestApp1.TestApp1App [ 13] [Debug] 'T4' data received: 2 items, packet number: 6

Другими словами, обработчик OnSignalReceived получает столько дубликатов каждого пакета сигнальных данных, на сколько каналов мы подписываемся: если подпишемся еще на 'O1', каждый пакет будет приходить в обработчик 3 раза, и т.д.

Обойти такое поведение можно, задавая для каждого сигнала собственный обработчик и в нем отфильтровывая все каналы, кроме нужного, но это как-то не совсем аккуратно.

Edited Dec 12, 2019 by Rq Aw
Assignee Loading
Time tracking Loading