public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) { var deviceJoinMap = new TesiraDspDeviceJoinMapAdvanced(joinStart); var dialerJoinMap = new TesiraDialerJoinMapAdvanced(joinStart); var faderJoinMap = new TesiraFaderJoinMapAdvanced(joinStart); var stateJoinMap = new TesiraStateJoinMapAdvanced(joinStart); var switcherJoinMap = new TesiraSwitcherJoinMapAdvanced(joinStart); var presetJoinMap = new TesiraPresetJoinMapAdvanced(joinStart); var meterJoinMap = new TesiraMeterJoinMapAdvanced(joinStart); var crosspointStateJoinMap = new TesiraCrosspointStateJoinMapAdvanced(joinStart); var roomCombinerJoinMap = new TesiraRoomCombinerJoinMapAdvanced(joinStart); if (bridge != null) { bridge.AddJoinMap(String.Format("{0}--DeviceInfoJoinMap", Key), deviceJoinMap); bridge.AddJoinMap(String.Format("{0}--DialerJoinMap", Key), dialerJoinMap); bridge.AddJoinMap(String.Format("{0}--FaderJoinMap", Key), faderJoinMap); bridge.AddJoinMap(String.Format("{0}--StateJoinMap", Key), stateJoinMap); bridge.AddJoinMap(String.Format("{0}--SwitcherJoinMap", Key), switcherJoinMap); bridge.AddJoinMap(String.Format("{0}--PresetsJoinMap", Key), presetJoinMap); bridge.AddJoinMap(String.Format("{0}--MeterJoinMap", Key), meterJoinMap); bridge.AddJoinMap(String.Format("{0}--CrosspointStateJoinMap", Key), crosspointStateJoinMap); bridge.AddJoinMap(String.Format("{0}--RoomCombinerJoinMap", Key), roomCombinerJoinMap); } Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); //var comm = DspDevice as IBasicCommunication; CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[deviceJoinMap.IsOnline.JoinNumber]); CommandPassthruFeedback.LinkInputSig(trilist.StringInput[deviceJoinMap.CommandPassThru.JoinNumber]); trilist.SetStringSigAction(deviceJoinMap.DirectPreset.JoinNumber, RunPreset); trilist.SetStringSigAction(deviceJoinMap.CommandPassThru.JoinNumber, SendLineRaw); //Level and Mute Control Debug.Console(2, this, "There are {0} Level Control Points", Faders.Count()); foreach (var item in Faders) { var channel = item.Value; var data = channel.BridgeIndex; if (data == null) { continue; } var x = (uint)data; //var TesiraChannel = channel.Value as Tesira.DSP.EPI.TesiraDspLevelControl; Debug.Console(2, "TesiraChannel {0} connect", x); var genericChannel = channel as IBasicVolumeWithFeedback; if (!channel.Enabled) { continue; } Debug.Console(2, this, "TesiraChannel {0} Is Enabled", x); channel.NameFeedback.LinkInputSig(trilist.StringInput[faderJoinMap.Label.JoinNumber + x]); channel.TypeFeedback.LinkInputSig(trilist.UShortInput[faderJoinMap.Type.JoinNumber + x]); channel.ControlTypeFeedback.LinkInputSig(trilist.UShortInput[faderJoinMap.Status.JoinNumber + x]); channel.PermissionsFeedback.LinkInputSig(trilist.UShortInput[faderJoinMap.Permissions.JoinNumber + x]); channel.VisibleFeedback.LinkInputSig(trilist.BooleanInput[faderJoinMap.Visible.JoinNumber + x]); genericChannel.MuteFeedback.LinkInputSig(trilist.BooleanInput[faderJoinMap.MuteToggle.JoinNumber + x]); genericChannel.MuteFeedback.LinkInputSig(trilist.BooleanInput[faderJoinMap.MuteOn.JoinNumber + x]); genericChannel.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[faderJoinMap.MuteOff.JoinNumber + x]); genericChannel.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[faderJoinMap.Volume.JoinNumber + x]); trilist.SetSigTrueAction(faderJoinMap.MuteToggle.JoinNumber + x, genericChannel.MuteToggle); trilist.SetSigTrueAction(faderJoinMap.MuteOn.JoinNumber + x, genericChannel.MuteOn); trilist.SetSigTrueAction(faderJoinMap.MuteOff.JoinNumber + x, genericChannel.MuteOff); trilist.SetBoolSigAction(faderJoinMap.VolumeUp.JoinNumber + x, genericChannel.VolumeUp); trilist.SetBoolSigAction(faderJoinMap.VolumeDown.JoinNumber + x, genericChannel.VolumeDown); trilist.SetUShortSigAction(faderJoinMap.Volume.JoinNumber + x, u => { if (u > 0) { genericChannel.SetVolume(u); } }); //channel.Value.DoPoll(); } //states Debug.Console(2, this, "There are {0} State Control Points", States.Count()); foreach (var item in States) { var state = item.Value; var data = state.BridgeIndex; if (data == null) { continue; } var x = (uint)data - 1; Debug.Console(2, this, "Tesira State {0} connect to {1}", state.Key, x); if (!state.Enabled) { continue; } Debug.Console(2, this, "Tesira State {0} at {1} is Enabled", state.Key, x); state.StateFeedback.LinkInputSig(trilist.BooleanInput[stateJoinMap.Toggle.JoinNumber + x]); state.StateFeedback.LinkInputSig(trilist.BooleanInput[stateJoinMap.On.JoinNumber + x]); state.StateFeedback.LinkComplementInputSig(trilist.BooleanInput[stateJoinMap.Off.JoinNumber + x]); state.NameFeedback.LinkInputSig(trilist.StringInput[stateJoinMap.Label.JoinNumber + x]); trilist.SetSigTrueAction(stateJoinMap.Toggle.JoinNumber + x, state.StateToggle); trilist.SetSigTrueAction(stateJoinMap.On.JoinNumber + x, state.StateOn); trilist.SetSigTrueAction(stateJoinMap.Off.JoinNumber + x, state.StateOff); } //Source Selectors Debug.Console(2, this, "There are {0} SourceSelector Control Points", Switchers.Count()); foreach (var item in Switchers) { var switcher = item.Value; var data = switcher.BridgeIndex; if (data == null) { continue; } var y = (uint)data; var x = (ushort)(((y - 1) * 2) + 1); //3 switchers //((1 - 1) * 2) + 1 = 1 //((2 - 1) * 2) + 1 = 3 //((3 - 1) * 2) + 1 = 5 Debug.Console(2, this, "Tesira Switcher {0} connect to {1}", switcher.Key, y); if (!switcher.Enabled) { continue; } Debug.Console(2, this, "Tesira Switcher {0} is Enabled", x); var s = switcher as IRoutingWithFeedback; s.SourceIndexFeedback.LinkInputSig(trilist.UShortInput[switcherJoinMap.Index.JoinNumber + x]); trilist.SetUShortSigAction(switcherJoinMap.Index.JoinNumber + x, u => switcher.SetSource(u)); switcher.NameFeedback.LinkInputSig(trilist.StringInput[switcherJoinMap.Label.JoinNumber + x]); } //Presets trilist.SetStringSigAction(presetJoinMap.PresetName.JoinNumber, RunPreset); foreach (var preset in Presets) { var p = preset; var runPresetIndex = preset.Value.PresetIndex; var presetIndex = runPresetIndex - 1; trilist.StringInput[(uint)(presetJoinMap.PresetNameFeedback.JoinNumber + presetIndex)].StringValue = p.Value.Label; trilist.SetSigTrueAction((uint)(presetJoinMap.PresetSelection.JoinNumber + presetIndex), () => RunPresetNumber((ushort)runPresetIndex)); } // VoIP Dialer uint lineOffset = 0; foreach (var line in Dialers) { var dialer = line.Value; var bridgeIndex = dialer.BridgeIndex; if (bridgeIndex == null) { continue; } var x = (uint)bridgeIndex; var dialerLineOffset = lineOffset += 1; Debug.Console(2, "AddingDialerBRidge {0} {1} Offset", dialer.Key, dialerLineOffset); for (var i = 0; i < dialerJoinMap.KeyPadNumeric.JoinSpan; i++) { trilist.SetSigTrueAction((dialerJoinMap.KeyPadNumeric.JoinNumber + (uint)i + dialerLineOffset), () => dialer.SendKeypad(TesiraDspDialer.eKeypadKeys.Num0)); } trilist.SetSigTrueAction((dialerJoinMap.KeyPadStar.JoinNumber + dialerLineOffset), () => dialer.SendKeypad(TesiraDspDialer.eKeypadKeys.Star)); trilist.SetSigTrueAction((dialerJoinMap.KeyPadPound.JoinNumber + dialerLineOffset), () => dialer.SendKeypad(TesiraDspDialer.eKeypadKeys.Pound)); trilist.SetSigTrueAction((dialerJoinMap.KeyPadClear.JoinNumber + dialerLineOffset), () => dialer.SendKeypad(TesiraDspDialer.eKeypadKeys.Clear)); trilist.SetSigTrueAction((dialerJoinMap.KeyPadBackspace.JoinNumber + dialerLineOffset), () => dialer.SendKeypad(TesiraDspDialer.eKeypadKeys.Backspace)); trilist.SetSigTrueAction(dialerJoinMap.KeyPadDial.JoinNumber + dialerLineOffset, dialer.Dial); trilist.SetSigTrueAction(dialerJoinMap.DoNotDisturbToggle.JoinNumber + dialerLineOffset, dialer.DoNotDisturbToggle); trilist.SetSigTrueAction(dialerJoinMap.DoNotDisturbOn.JoinNumber + dialerLineOffset, dialer.DoNotDisturbOn); trilist.SetSigTrueAction(dialerJoinMap.DoNotDisturbOff.JoinNumber + dialerLineOffset, dialer.DoNotDisturbOff); trilist.SetSigTrueAction(dialerJoinMap.AutoAnswerToggle.JoinNumber + dialerLineOffset, dialer.AutoAnswerToggle); trilist.SetSigTrueAction(dialerJoinMap.AutoAnswerOn.JoinNumber + dialerLineOffset, dialer.AutoAnswerOn); trilist.SetSigTrueAction(dialerJoinMap.AutoAnswerOff.JoinNumber + dialerLineOffset, dialer.AutoAnswerOff); trilist.SetSigTrueAction(dialerJoinMap.Answer.JoinNumber + dialerLineOffset, dialer.Answer); trilist.SetSigTrueAction(dialerJoinMap.EndCall.JoinNumber + dialerLineOffset, dialer.EndAllCalls); trilist.SetSigTrueAction(dialerJoinMap.OnHook.JoinNumber + dialerLineOffset, dialer.OnHook); trilist.SetSigTrueAction(dialerJoinMap.OffHook.JoinNumber + dialerLineOffset, dialer.OffHook); trilist.SetStringSigAction(dialerJoinMap.DialString.JoinNumber + dialerLineOffset, dialer.SetDialString); dialer.DoNotDisturbFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.DoNotDisturbToggle.JoinNumber + dialerLineOffset]); dialer.DoNotDisturbFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.DoNotDisturbOn.JoinNumber + dialerLineOffset]); dialer.DoNotDisturbFeedback.LinkComplementInputSig(trilist.BooleanInput[dialerJoinMap.DoNotDisturbOff.JoinNumber + dialerLineOffset]); dialer.OffHookFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.KeyPadDial.JoinNumber + dialerLineOffset]); dialer.OffHookFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.OffHook.JoinNumber + dialerLineOffset]); dialer.OffHookFeedback.LinkComplementInputSig(trilist.BooleanInput[dialerJoinMap.OnHook.JoinNumber + dialerLineOffset]); dialer.IncomingCallFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.IncomingCall.JoinNumber + dialerLineOffset]); dialer.AutoAnswerFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.AutoAnswerToggle.JoinNumber + dialerLineOffset]); dialer.AutoAnswerFeedback.LinkInputSig(trilist.BooleanInput[dialerJoinMap.AutoAnswerOn.JoinNumber + dialerLineOffset]); dialer.AutoAnswerFeedback.LinkComplementInputSig(trilist.BooleanInput[dialerJoinMap.AutoAnswerOff.JoinNumber + dialerLineOffset]); dialer.NameFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.Label.JoinNumber + dialerLineOffset]); dialer.DisplayNumberFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.DisplayNumber.JoinNumber + dialerLineOffset]); dialer.DialStringFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.DialString.JoinNumber + dialerLineOffset]); dialer.CallerIdNumberFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.CallerIdNumberFb.JoinNumber + dialerLineOffset]); dialer.CallerIdNameFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.CallerIdNameFb.JoinNumber + dialerLineOffset]); dialer.LastDialedFeedback.LinkInputSig(trilist.StringInput[dialerJoinMap.LastNumberDialerFb.JoinNumber + dialerLineOffset]); dialer.CallStateFeedback.LinkInputSig(trilist.UShortInput[dialerJoinMap.CallState.JoinNumber + dialerLineOffset]); lineOffset += 50; } Debug.Console(2, this, "There are {0} Meter Control Points", Meters.Count); foreach (var item in Meters) { var meter = item.Value; var data = meter.BridgeIndex; if (data == null) { continue; } var x = (uint)(data - 1); Debug.Console(2, this, "AddingMeterBridge {0} | Join:{1}", meter.Key, meterJoinMap.Label.JoinNumber); meter.MeterFeedback.LinkInputSig(trilist.UShortInput[meterJoinMap.Meter.JoinNumber + x]); meter.NameFeedback.LinkInputSig(trilist.StringInput[meterJoinMap.Label.JoinNumber + x]); meter.SubscribedFeedback.LinkInputSig(trilist.BooleanInput[meterJoinMap.Subscribe.JoinNumber + x]); trilist.SetSigTrueAction(meterJoinMap.Subscribe.JoinNumber, meter.Subscribe); trilist.SetSigFalseAction(meterJoinMap.Subscribe.JoinNumber, meter.UnSubscribe); } Debug.Console(2, this, "There are {0} Crosspoint State Control Points", CrosspointStates.Count); foreach (var item in CrosspointStates) { var xpointState = item.Value; var data = xpointState.BridgeIndex; if (data == null) { continue; } var y = (uint)data; var x = y > 1 ? ((y - 1) * 3) : 0; Debug.Console(2, this, "Adding Crosspoint State ControlPoint {0} | JoinStart:{1}", xpointState.Key, crosspointStateJoinMap.Label.JoinNumber); xpointState.CrosspointStateFeedback.LinkInputSig(trilist.BooleanInput[crosspointStateJoinMap.Toggle.JoinNumber]); xpointState.CrosspointStateFeedback.LinkInputSig(trilist.BooleanInput[crosspointStateJoinMap.On.JoinNumber]); trilist.SetSigTrueAction(crosspointStateJoinMap.Toggle.JoinNumber, xpointState.StateToggle); trilist.SetSigTrueAction(crosspointStateJoinMap.On.JoinNumber, xpointState.StateOn); trilist.SetSigTrueAction(crosspointStateJoinMap.Off.JoinNumber, xpointState.StateOff); } Debug.Console(2, this, "There are {0} Room Combiner Control Points", RoomCombiners.Count); //x = 0; foreach (var item in RoomCombiners) { var roomCombiner = item.Value; var data = roomCombiner.BridgeIndex; if (data == null) { continue; } var y = (uint)data; var x = y > 1 ? ((y - 1) * 6) : 0; Debug.Console(2, "Tesira Room Combiner {0} connect", x); var genericChannel = roomCombiner as IBasicVolumeWithFeedback; if (!roomCombiner.Enabled) { continue; } Debug.Console(2, this, "TesiraChannel {0} Is Enabled", x); roomCombiner.NameFeedback.LinkInputSig(trilist.StringInput[roomCombinerJoinMap.Label.JoinNumber + x]); roomCombiner.VisibleFeedback.LinkInputSig(trilist.BooleanInput[roomCombinerJoinMap.Visible.JoinNumber + x]); roomCombiner.ControlTypeFeedback.LinkInputSig(trilist.UShortInput[roomCombinerJoinMap.Type.JoinNumber + x]); roomCombiner.PermissionsFeedback.LinkInputSig(trilist.UShortInput[roomCombinerJoinMap.Permissions.JoinNumber + x]); roomCombiner.RoomGroupFeedback.LinkInputSig(trilist.UShortInput[roomCombinerJoinMap.Group.JoinNumber + x]); genericChannel.MuteFeedback.LinkInputSig(trilist.BooleanInput[roomCombinerJoinMap.MuteToggle.JoinNumber + x]); genericChannel.MuteFeedback.LinkInputSig(trilist.BooleanInput[roomCombinerJoinMap.MuteOn.JoinNumber + x]); genericChannel.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[roomCombinerJoinMap.MuteOff.JoinNumber + x]); genericChannel.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[roomCombinerJoinMap.Volume.JoinNumber + x]); trilist.SetSigTrueAction(roomCombinerJoinMap.MuteToggle.JoinNumber + x, genericChannel.MuteToggle); trilist.SetSigTrueAction(roomCombinerJoinMap.MuteOn.JoinNumber + x, genericChannel.MuteOn); trilist.SetSigTrueAction(roomCombinerJoinMap.MuteOff.JoinNumber + x, genericChannel.MuteOff); trilist.SetBoolSigAction(roomCombinerJoinMap.VolumeUp.JoinNumber + x, genericChannel.VolumeUp); trilist.SetBoolSigAction(roomCombinerJoinMap.VolumeDown.JoinNumber + x, genericChannel.VolumeDown); trilist.SetUShortSigAction(roomCombinerJoinMap.Volume.JoinNumber + x, u => { if (u > 0) { genericChannel.SetVolume(u); } }); trilist.SetUShortSigAction(roomCombinerJoinMap.Group.JoinNumber + x, u => { if (u > 0) { roomCombiner.SetRoomGroup(u); } }); } trilist.OnlineStatusChange += (d, args) => { if (!args.DeviceOnLine) { return; } foreach (var feedback in Feedbacks) { feedback.FireUpdate(); } }; }
private void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args) { if (Debug.Level == 2) { Debug.Console(2, this, "RX: '{0}'", ShowHexResponse ? ComTextHelper.GetEscapedText(args.Text) : args.Text); } //Debug.Console(1, this, "RX: '{0}'", args.Text); try { DeviceRx = args.Text; CommandPassthruFeedback.FireUpdate(); if (args.Text.IndexOf("Welcome to the Tesira Text Protocol Server...", StringComparison.Ordinal) > -1) { // Indicates a new TTP session // moved to CustomActivate() method CommunicationMonitor.Start(); CrestronInvoke.BeginInvoke((o) => HandleAttributeSubscriptions()); } else if (args.Text.IndexOf("! ", StringComparison.Ordinal) > -1) { // response is from a subscribed attribute //(if(args.Text const string pattern = "! [\\\"](.*?[^\\\\])[\\\"] (.*)"; var match = Regex.Match(args.Text, pattern); if (!match.Success) { return; } var customName = match.Groups[1].Value; var value = match.Groups[2].Value; AdvanceQueue(args.Text); foreach (var controlPoint in Faders.Where(controlPoint => customName == controlPoint.Value.LevelCustomName || customName == controlPoint.Value.MuteCustomName)) { controlPoint.Value.ParseSubscriptionMessage(customName, value); return; } foreach (var controlPoint in Dialers.Where(controlPoint => customName == controlPoint.Value.AutoAnswerCustomName || customName == controlPoint.Value.ControlStatusCustomName || customName == controlPoint.Value.DialerCustomName)) { controlPoint.Value.ParseSubscriptionMessage(customName, value); return; } foreach (var controlPoint in States.Where(controlPoint => customName == controlPoint.Value.StateCustomName)) { controlPoint.Value.ParseSubscriptionMessage(customName, value); return; } foreach (var controlPoint in Switchers.Where(controlPoint => customName == controlPoint.Value.SelectorCustomName)) { controlPoint.Value.ParseSubscriptionMessage(customName, value); return; } foreach (var controlPoint in Meters.Where(controlPoint => customName == controlPoint.Value.MeterCustomName)) { controlPoint.Value.ParseSubscriptionMessage(customName, value); return; } // same for dialers // same for switchers } else if (args.Text.IndexOf("+OK", StringComparison.Ordinal) > -1) { if (args.Text == "+OK") // Check for a simple "+OK" only 'ack' repsonse or a list response and ignore { return; } // response is not from a subscribed attribute. From a get/set/toggle/increment/decrement command //string pattern = "(?<=\" )(.*?)(?=\\+)"; //string data = Regex.Replace(args.Text, pattern, ""); AdvanceQueue(args.Text); } else if (args.Text.IndexOf("-ERR", StringComparison.Ordinal) > -1) { // Error response Debug.Console(2, this, "Error From DSP: '{0}'", args.Text); switch (args.Text) { case "-ERR ALREADY_SUBSCRIBED": { WatchDogSniffer = false; AdvanceQueue(args.Text); break; } default: { WatchDogSniffer = false; AdvanceQueue(args.Text); break; } } } } catch (Exception e) { if (Debug.Level == 2) { Debug.Console(2, this, "Error parsing response: '{0}'\n{1}", args.Text, e); } } }