Алгоритм интерпретации событый

Eolt
Дата: 09.08.2018 16:27:22
Допустим есть устройство, которое зажигает цветные светодиоды сигнализируя о своем состоянии.
Нужно интерпретировать эти состояния, их может быть очень много и записывать в коллекцию событий

Например:

1. Горят только СКЗС и не горят другие - произошло событие А, если вместе с СКЗС горят и другие события А не было.
2. Горят КЗ, а состояние других пофиг - произошло событие Б.

Как описать и хранить в коде все эти сочетания случаев? Язык C#
hVostt
Дата: 09.08.2018 16:47:23
Eolt,

[Flags]
public enum LightSignal
{
   None = 0,
   Blue = 0b00001,
   Red = 0b00010,
   White = 0b00100,
   Yellow = 0b01000,
   Green = 0b10000,

   TypeA = Blue | Red | Green | White,
   TypeB = Red | Green,
   TypeC = Yellow | Green,
   TypeLastToB = Red | Blue
}

public enum EventType
{
   Unknown,
   A,
   B,
   C,
   RenameLastToB
}

public EventType CalcEvent(LightSignal ls)
{
   if(LightSignal.TypeA == ls) return EventType.A;
   if(LightSignal.TypeB == ls) return EventType.B;
   if(LightSignal.TypeC == ls) return EventType.C;

   if((LightSignal.TypeLastToB & ls) == LightSignal.TypeLastToB) return EventType.RenameLastToB;

   return defauit;
}


Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.
Akina
Дата: 09.08.2018 16:54:01
Eolt
Как описать и хранить в коде все эти сочетания случаев?
Две маски. Маска "горит" и маска "не горит". Например:

Горят только СКЗ и не горят другие - произошло событие А. У события A маска Г 11001, маска Н 00110.
Горят КЗ, а состояние других пофиг - произошло событие Б. У события Б маска Г 01001, маска Н 00000.

Проверка. Есть состояние С. Если оно соответствует некоему состоянию, то должно быть:

С XOR Г = 00000
С AND H = 00000
Eolt
Дата: 09.08.2018 17:14:15
hVostt
Eolt,

Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.


Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.
Aleksandr Sharahov
Дата: 09.08.2018 19:22:49
Eolt
hVostt
Eolt,

Фих знает, короче. Можно матрицы написать или хитрую методу на третичной логике.


Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.


Про двоичную систему наверняка слышал, в твоем случае состояние системы кодируется 5 битами.
Таким образом, у тебя 2^5=32 различных состояний системы в диапазоне 0..31.
Вот и опиши, что надо делать в каждом из этих состояний в массиве Action[0..31].
hVostt
Дата: 10.08.2018 10:06:13
Eolt
Про матрицы решений что-то слышал. Но вот нагуглить никак не могу.


Ну вон в коде привёл же битовые маски. Делаешь из этого матрицу, я написал в методе для экономии. Но можно матрицу перенести в конфиг файл и тогда это можно будет менять в конфиге.
kealon(Ruslan)
Дата: 14.08.2018 09:59:45
Eolt,

обычный ДКА
Eolt
Дата: 14.08.2018 11:27:32
kealon(Ruslan),

можно примерчик реализации в контексте моего случая?
kealon(Ruslan)
Дата: 14.08.2018 12:12:39
Eolt
kealon(Ruslan),

можно примерчик реализации в контексте моего случая?

у тебя есть варианты состояний индикатора К, 2^5 вариантов

есть варианты состояний { S }

у тебя должна быть построена двумерная таблица M[S, K] (реальная или условная неважно)
и индикатор срабатывания F[S]

в реализации простой цикл

S = M[S, K];
if ( F[S] ) {действие... }

как будешь делать M и F это уже на твоё усмотрение, хоть вручную ...
Dima T
Дата: 14.08.2018 12:42:55
Выше решение попроще описано 21636635
// Таблица соответствия событий и состояний
События[0b00000] = Событие1
События[0b00001] = Событие1
...
События[0b11111] = СобытиеN

// Обработка cостояния S
switch(События[S]) {
case Событие1:
...
case Событие2:
...
}