public void TestAddEntryListener() { string key1 = "testKey"; string toWrite1 = "written"; NtCore.SetEntryValue(key1, Value.MakeString(toWrite1)); int count = 0; string recievedKey = ""; Value recievedValue = null; NotifyFlags receivedFlags = 0; NotifyFlags f = NotifyFlags.NotifyNew | NotifyFlags.NotifyUpdate; if (true) { f |= NotifyFlags.NotifyLocal; } int listener = NtCore.AddEntryListener(key1, (uid, key, value, flags) => { count++; recievedKey = key; recievedValue = value; receivedFlags = flags; }, f); string toWrite2 = "NewNumber"; NtCore.SetEntryValue(key1, Value.MakeString(toWrite2)); Thread.Sleep(20); Assert.That(count, Is.GreaterThanOrEqualTo(1)); Assert.That(recievedKey, Is.EqualTo(key1)); Assert.That(recievedValue, Is.Not.Null); Assert.That(recievedValue.IsString); var retValue = recievedValue.GetString(); Assert.That(retValue, Is.Not.Null); Assert.That(retValue, Is.EqualTo(toWrite2)); Assert.That(receivedFlags.HasFlag(NotifyFlags.NotifyLocal)); NtCore.RemoveEntryListener(listener); }
public void TestEntryListenerBooleanArray() { string key1 = "testKey"; bool[] toWrite1 = { true, true, true }; NtCore.SetEntryValue(key1, Value.MakeBooleanArray(toWrite1)); int count = 0; string recievedKey = ""; Value recievedValue = null; NotifyFlags receivedFlags = 0; NotifyFlags f = NotifyFlags.NotifyNew | NotifyFlags.NotifyUpdate; if (true) { f |= NotifyFlags.NotifyImmediate; } int listener = NtCore.AddEntryListener(key1, (uid, key, value, flags) => { count++; recievedKey = key; recievedValue = value; receivedFlags = flags; }, f); Thread.Sleep(300); Assert.That(count, Is.EqualTo(1)); Assert.That(recievedKey, Is.EqualTo(key1)); Assert.That(recievedValue, Is.Not.Null); Assert.That(recievedValue.IsBooleanArray()); bool[] retValue = recievedValue.GetBooleanArray(); for (int i = 0; i < retValue.Length; i++) { Assert.That(retValue[i], Is.EqualTo(toWrite1[i])); } Assert.That(receivedFlags.HasFlag(NotifyFlags.NotifyImmediate)); NtCore.RemoveEntryListener(listener); }
private CameraServer() { m_defaultUsbDevice = 0; m_lockObject = new object(); m_sources = new Dictionary <string, VideoSource>(); m_sinks = new Dictionary <string, VideoSink>(); m_tables = new Dictionary <int, ITable>(); m_publishTable = NetworkTable.GetTable(PublishName); m_nextPort = BasePort; m_addresses = new List <string>(); m_videoListener = new VideoListener((vidEvent) => { switch (vidEvent.Kind) { case EventKind.SourceCreated: { // Create subtable for the camera ITable table = m_publishTable.GetSubTable(vidEvent.Name); lock (m_lockObject) { m_tables.Add(vidEvent.SourceHandle, table); } table.PutString("source", MakeSourceValue(vidEvent.SourceHandle)); table.PutString("description", NativeMethods.GetSourceDescription(vidEvent.SourceHandle)); table.PutBoolean("connected", NativeMethods.IsSourceConnected(vidEvent.SourceHandle)); table.PutStringArray("streams", GetSourceStreamValues(vidEvent.SourceHandle)); try { VideoMode mode = NativeMethods.GetSourceVideoMode(vidEvent.SourceHandle); table.SetDefaultString("mode", VideoModeToString(mode)); table.PutStringArray("modes", GetSourceModeValues(vidEvent.SourceHandle)); } catch (VideoException) { // Do nothing } break; } case EventKind.SourceDestroyed: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { table.PutString("source", ""); table.PutStringArray("streams", new string[0]); table.PutStringArray("modes", new string[0]); } break; } case EventKind.SourceConnected: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { // update the description too (as it may have changed) table.PutString("description", NativeMethods.GetSourceDescription(vidEvent.SourceHandle)); table.PutBoolean("connected", true); } break; } case EventKind.SourceDisconnected: { ITable table = GetSourceTable(vidEvent.SourceHandle); table?.PutBoolean("connected", false); break; } case EventKind.SourceVideoModesUpdated: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { table.PutStringArray("modes", GetSourceModeValues(vidEvent.SourceHandle)); } break; } case EventKind.SourceVideoModeChanged: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { table.PutString("mode", VideoModeToString(vidEvent.Mode)); } break; } case EventKind.SourcePropertyCreated: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { PutSourcePropertyValue(table, vidEvent, true); } break; } case EventKind.SourcePropertyValueUpdated: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { PutSourcePropertyValue(table, vidEvent, false); } break; } case EventKind.SourcePropertyChoicesUpdated: { ITable table = GetSourceTable(vidEvent.SourceHandle); if (table != null) { List <string> choices = NativeMethods.GetEnumPropertyChoices(vidEvent.PropertyHandle); table.PutStringArray($"PropertyInfo/{vidEvent.Name}/choices", choices); } break; } case EventKind.SinkSourceChanged: case EventKind.SinkCreated: case EventKind.SinkDestroyed: { UpdateStreamValues(); break; } case EventKind.NetworkInterfacesChanged: { m_addresses = NativeMethods.GetNetworkInterfaces(); break; } default: break; } }, (EventKind)0x4fff, true); m_tableListener = NtCore.AddEntryListener($"{PublishName}/", (uid, key, value, flags) => { string relativeKey = key.Substring(PublishName.Length + 1); int subKeyIndex = relativeKey.IndexOf('/'); if (subKeyIndex == -1) { return; } string sourceName = relativeKey.Substring(0, subKeyIndex); VideoSource source; if (!m_sources.TryGetValue(sourceName, out source)) { return; } relativeKey = relativeKey.Substring(subKeyIndex + 1); string propName; if (relativeKey == "mode") { // reset to current mode NtCore.SetEntryString(key, VideoModeToString(source.GetVideoMode())); return; } else if (relativeKey.StartsWith("Property/")) { propName = relativeKey.Substring(9); } else if (relativeKey.StartsWith("RawProperty/")) { propName = relativeKey.Substring(12); } else { return; } VideoProperty prop = source.GetProperty(propName); switch (prop.Kind) { case PropertyKind.None: return; case PropertyKind.Boolean: NtCore.SetEntryBoolean(key, prop.Get() != 0); break; case PropertyKind.Integer: case PropertyKind.Enum: NtCore.SetEntryDouble(key, prop.Get()); break; case PropertyKind.String: NtCore.SetEntryString(key, prop.GetString()); break; default: return; } }, NotifyFlags.NotifyImmediate | NotifyFlags.NotifyUpdate); }
public void TestAddEntryListenerDefaultTypes(object val) { string key1 = "testKey"; if (val is double) { NtCore.SetEntryValue(key1, Value.MakeDouble((double)val)); } else if (val is bool) { NtCore.SetEntryValue(key1, Value.MakeBoolean((bool)val)); } else if (val is string) { NtCore.SetEntryValue(key1, Value.MakeString((string)val)); } int count = 0; string recievedKey = ""; Value recievedValue = null; NotifyFlags receivedFlags = 0; NotifyFlags f = NotifyFlags.NotifyNew | NotifyFlags.NotifyUpdate; if (true) { f |= NotifyFlags.NotifyImmediate; } int listener = NtCore.AddEntryListener(key1, (uid, key, value, flags) => { count++; recievedKey = key; recievedValue = value; receivedFlags = flags; }, f); Thread.Sleep(20); Assert.That(count, Is.EqualTo(1)); Assert.That(recievedKey, Is.EqualTo(key1)); Assert.That(recievedValue, Is.Not.Null); if (val is double) { Assert.That(recievedValue.IsDouble()); var retValue = recievedValue.GetDouble(); Assert.That(retValue, Is.EqualTo((double)val)); Assert.That(receivedFlags.HasFlag(NotifyFlags.NotifyImmediate)); } else if (val is bool) { Assert.That(recievedValue.IsBoolean()); var retValue = recievedValue.GetBoolean(); Assert.That(retValue, Is.EqualTo((bool)val)); Assert.That(receivedFlags.HasFlag(NotifyFlags.NotifyImmediate)); } else if (val is string) { Assert.That(recievedValue.IsString); var retValue = recievedValue.GetString(); Assert.That(retValue, Is.Not.Null); Assert.That(retValue, Is.EqualTo((string)val)); Assert.That(receivedFlags.HasFlag(NotifyFlags.NotifyImmediate)); } else { NtCore.RemoveEntryListener(listener); Assert.Fail("Unknown type"); return; } NtCore.RemoveEntryListener(listener); }