Typical processing of IOPortValueChangedEvents / Typische Verarbeitung von IOPortValueChangedEvents

(German version below, deutsche Version weiter unten)

When dealing with IOPortValueChangedEvents, you will have a method like this:

[RfidEventHandlerMethod]

public IOPortValueChangedEvent HandleIOPortValueChangedEvent(

    IOPortValueChangedEvent iOPortEvent)

What to do with it now?
After considering the DeviceName, the PortName, the Source and the Time-properties of the ioPortEvent, usually the most important piece of information is in the byte-array shown here:

byte[] iodata = iOPortEvent.GetPortValue();

(Of course can have VendorSpecificData also, but this special case is neglected here.)

What you want to do for each of these bytes is to be able to compare against it. We look at the "discrete" case where you do not care about continuous values but about specific lines being set somewhere, meaning that specific bits are set to "0" or "1".
This is "old-school". Typically this is done by two things:
1. Define a bitmask with the bits that interest you, use it with "AND" on the retrieved value
2. then compare the result with a value you provide. This gives you pretty good flexibility.
In the case of having only one element in the array above, this is simplified to:

byte ioValue = iodata[0];

ioValue = Convert.ToByte( ioValue & m_InputIOBitMask );

if (ioValue == m_InputIOValue)

{

   // do something

}

 

(German version, deutsche Version)

Wenn man mit  IOPortValueChangedEvents zu tun hat, wird in der Regel eine derartige Methode vorliegen:

[RfidEventHandlerMethod]

public IOPortValueChangedEvent HandleIOPortValueChangedEvent(

    IOPortValueChangedEvent iOPortEvent)

Was nun?
Nachdem man DeviceName,  PortName,  Source und die Time-Properties von ioPortEvent beachtet hat, ist normalerweise der wirklich relevante Teil in diesem Byte-Array:

byte[] iodata = iOPortEvent.GetPortValue();

(Natürlich kann es auch VendorSpecificData geben, dieser Fall wird hier aber vernachlässigt)

Nun will man in der Lage sein, diese Bytes gegen etwas zu vergleichen. Wir betrachten den "diskreten" Fall, also wo man sich nicht um kontinuierliche Werte kümmert, sondern darum dass bestimmte Verbindungen irgendwo vorhanden sind. Dies bedeutet, dass bestimmte Bits auf "0" oder "1" sind.
Das ist "Old School". Typischerweise wird dies durch zwei Dinge erledigt:
1. Definiere eine BitMask mit den Bits, welche interessant sind und verknüpfe diese mit "UND" mit dem erhaltenen Wert
2. dann wird das Ergebnis mit einem Wert verglichen, für welchen wir uns interessieren. So erreicht man relativ große Flexibilität.
In dem Fall, dass nur ein Element im obigen Array ist, vereinfacht sich dies zu:

byte ioValue = iodata[0];

ioValue = Convert.ToByte( ioValue & m_InputIOBitMask );

if (ioValue == m_InputIOValue)

{

   // irgendwas machen

}


Posted Feb 27 2008, 12:13 PM by Andreas Erben
developers.de is a .Net Community Blog powered by daenet GmbH.