예제 #1
0
        private bool RxOn()
        {
            //Debug.Assert(_RxPorts.Count == 0);
            //Debug.Assert(_AudioVia == RdRxAudioVia.NoAudio);

            SetAudioVia(NextRxAudioVia());
            _RealAudioVia = AudioVia;   // RdRxAudioVia.Speaker;
            if (AudioVia == RdRxAudioVia.NoAudio)
            {
                return(false);
            }

            General.SafeLaunchEvent(RxAlreadyAssigned, this);

            foreach (Rs <RdSrvRxRs> rxRs in _AssociateRxRs)
            {
                if (rxRs.IsValid /*&& _RscSite.ContainsKey(rxRs.Id) && _RscSite[rxRs.Id] == Alias*/)
                {
                    if (!_RxPorts.ContainsKey(rxRs.Id.ToUpper()))
                    {
                        CreateRxAudio(rxRs, rxRs.Id.ToUpper());
                    }
                }
            }

            return(true);
        }
예제 #2
0
        public void RdConfirmRxAudio(int id, RdRxAudioVia via)
        {
            RdDst dst = _StateManager.Radio[id];

            Debug.Assert((_StateManager.Radio.Rtx == 0) || !dst.Tx || ((dst.RtxGroup != 0) && (dst.RtxGroup != _StateManager.Radio.Rtx)));

            _EngineCmdManager.SetRdAudio(id, via);
        }
예제 #3
0
        public void Reset(RdInfo dst)
        {
            if (dst.Dst == "")
            {
                Reset();
            }
            else
            {
                _Frecuency      = dst.Dst;
                _Alias          = dst.Alias;
                _TempAlias      = string.Empty;
                _Ptt            = dst.Ptt;
                _Squelch        = dst.Squelch;
                _Tx             = dst.Tx;
                _Rx             = dst.Rx || _Tx;
                _AudioVia       = _Rx ? dst.AudioVia : RdRxAudioVia.NoAudio;
                _Monitoring     = dst.Monitoring;//  && !Unavailable;
                _RtxGroup       = _TempRtxGroup = dst.RtxGroup;
                _TipoFrecuencia = dst.TipoFrecuencia;
                _State          = dst.Estado;
                _qidxResource   = _qidxMethod = string.Empty;
                _qidxValue      = 0;
                _RxOnly         = dst.RxOnly;
                /** 20180321. AGL. ALIAS a mostrar en la tecla... */
                if (Properties.Settings.Default.RadioAlias == true)
                {
                    _KeyAlias = dst.KeyAlias == dst.Dst ? "" : dst.KeyAlias;
                }
                else
                {
                    _KeyAlias = (_TempAlias != string.Empty && _TempAlias != _Alias) ? _TempAlias : _Alias;
                }
                /** */

                if (!Restored && Unavailable && (dst.Ptt != PttState.Unavailable || dst.Squelch != SquelchState.Unavailable))
                {
                    _Restored = true;
                }
                else
                {
                    _Restored = false;
                }

                Debug.Assert(!_Rx || (_AudioVia != RdRxAudioVia.NoAudio));
                Debug.Assert(!_Tx || Rx);

                if ((_Squelch == SquelchState.SquelchPortAndMod) && (_Ptt == PttState.PttOnlyPort))
                {
                    _Ptt = PttState.PttPortAndMod;
                }
                else if ((_Squelch == SquelchState.SquelchOnlyPort) && (_Ptt == PttState.PttPortAndMod))
                {
                    _Ptt = PttState.PttOnlyPort;
                }

                //_PttSrcId = dst.PttSrcId;
            }
        }
예제 #4
0
        /// <summary>
        /// Redirige al audio hacia el proximo destino según rotación
        /// </summary>
        /// <param name="audioVia"></param>
        public void SetNextAudioVia()
        {
            RdRxAudioVia newAudio = NextRxAudioVia();

            if (newAudio == RdRxAudioVia.NoAudio)
            {
                SetRx(false);
            }
            else
            {
                SetAudioVia(newAudio);
            }
        }
예제 #5
0
        public void Reset(RdAsignState st)
        {
            _Tx       = st.Tx;
            _Rx       = st.Rx;
            _AudioVia = st.AudioVia;

            Debug.Assert(!_Rx || (_AudioVia != RdRxAudioVia.NoAudio));
            Debug.Assert(!_Tx || Rx);

            if (!_Tx)
            {
                _RtxGroup     = Math.Min(_RtxGroup, 0);
                _TempRtxGroup = _RtxGroup;
            }
        }
예제 #6
0
 public RdInfo(string dst, string alias, bool tx, bool rx, PttState ptt, SquelchState squelch,
               RdRxAudioVia audioVia, int rtxGroup, TipoFrecuencia_t tipoFrecuencia, bool monitoring, FrequencyState estado, bool rxOnly)
 {
     Dst            = dst;
     Alias          = alias;
     Tx             = tx;
     Rx             = rx;
     Ptt            = ptt;
     Squelch        = squelch;
     AudioVia       = audioVia;
     RtxGroup       = rtxGroup;
     TipoFrecuencia = tipoFrecuencia;
     Monitoring     = monitoring;
     Estado         = estado;
     RxOnly         = rxOnly;
 }
예제 #7
0
        public void Reset(RdState st)
        {
            if (Unavailable && (st.Ptt != PttState.Unavailable || st.Squelch != SquelchState.Unavailable))
            {
                _Restored = true;
            }
            else
            {
                _Restored = false;
            }
            _Ptt      = st.Ptt;
            _Squelch  = st.Squelch;
            _Tx       = st.Tx;
            _Rx       = st.Rx || _Tx;                             // || _Monitoring || _Tx;
            _AudioVia = _Rx ? st.AudioVia : RdRxAudioVia.NoAudio; // !_Monitoring ? st.AudioVia : RdRxAudioVia.Speaker;
            if (_RtxGroup != _TempRtxGroup)
            {
                _RtxGroup = st.RtxGroup;
            }
            else
            {
                _RtxGroup = _TempRtxGroup = st.RtxGroup;
            }
            //_RtxGroup = st.RtxGroup;

            Debug.Assert(!_Rx || (_AudioVia != RdRxAudioVia.NoAudio));
            Debug.Assert(!_Tx || Rx);

            if ((_Squelch == SquelchState.SquelchPortAndMod) && (_Ptt == PttState.PttOnlyPort))
            {
                _Ptt = PttState.PttPortAndMod;
            }
            else if ((_Squelch == SquelchState.SquelchOnlyPort) && (_Ptt == PttState.PttPortAndMod))
            {
                _Ptt = PttState.PttOnlyPort;
            }

            // BSS Information
            _qidxMethod   = st.QidxMethod;
            _qidxResource = st.QidxResource;
            _qidxValue    = st.QidxValue;

            _State = st.State;

            _PttSrcId = st.PttSrcId;
        }
예제 #8
0
        public RdState(bool tx, bool rx, string pttSrcId, PttState ptt, SquelchState squelch, RdRxAudioVia audioVia, int rtxGroup, FrequencyState state,
                       string qidxMethod, uint qidxValue, string qidxResource)
        {
            Tx       = tx;
            Rx       = rx;
            Ptt      = ptt;
            Squelch  = squelch;
            AudioVia = audioVia;
            RtxGroup = rtxGroup;
            State    = state;
            // BSS Information
            QidxMethod   = qidxMethod;
            QidxValue    = qidxValue;
            QidxResource = qidxResource;

            PttSrcId = pttSrcId;
        }
예제 #9
0
        private void RxOff()
        {
            if (Rx)
            {
                foreach (int port in _RxPorts.Values)
                {
                    Top.Mixer.Unlink(port);
                    SipAgent.DestroyRdRxPort(port);
                    _Logger.Debug("*** RxOff. Llamando a DestroyRdRxPort({0}) {1}", port, Literal);
                }
                _RxPorts.Clear();

                _AudioVia     = RdRxAudioVia.NoAudio;
                _RealAudioVia = RdRxAudioVia.NoAudio;
                _Tx           = AssignState.Idle;
                _RtxGroup     = Math.Min(_RtxGroup, 0);
            }
        }
예제 #10
0
 public void ResetToIdle()
 {
     _Tx             = false;
     _Rx             = false;
     _Ptt            = PttState.NoPtt;
     _Squelch        = SquelchState.NoSquelch;
     _AudioVia       = RdRxAudioVia.NoAudio;
     _RtxGroup       = _TempRtxGroup = 0;
     _Monitoring     = false;
     _Restored       = true;
     _TipoFrecuencia = TipoFrecuencia_t.Basica;
     _qidxResource   = _qidxMethod = string.Empty;
     _qidxValue      = 0;
     _State          = FrequencyState.NotAvailable;
     _RxOnly         = false;
     /** 20190205 */
     _PttSrcId = string.Empty;
 }
예제 #11
0
        /// <summary>
        /// Redirige al audio hacia el destino indicado (altavoz o auricular) con las siguientes condiciones:
        /// 1-Si no hay PTT, se conecta el audio siempre.
        /// 2-Si hay PTT propio no se hace nada, no está permitido cambiar la salida del audio.
        /// 3-Si hay PTT que procede de una RTX de otro SQ y estoy en el puesto propietario del grupo y el SQ es propio,
        /// no conecto mi audio porque se debe escuchar el que se está retransmitiendo.
        /// </summary>
        /// <param name="audioVia"></param>
        public void SetAudioVia(RdRxAudioVia audioVia)
        {
            if (/*Rx && */ (_AudioVia != audioVia) &&
                ((audioVia == RdRxAudioVia.Speaker && Top.Hw.RdSpeaker) ||
                 (audioVia == RdRxAudioVia.HfSpeaker && Top.Hw.HfSpeaker) ||
                 (audioVia == RdRxAudioVia.HeadPhones &&
                  (Top.Hw.InstructorJack || Top.Hw.AlumnJack) && !Top.Mixer.ModoSoloAltavoces)))
            {
                if (InhiboMiAudio(_Ptt, _AssociateFrRs.Info) == false)
                {
                    foreach (int port in _RxPorts.Values)
                    {
                        Top.Mixer.Unlink(port);
                        MixerDev dev = (audioVia == RdRxAudioVia.HeadPhones ? MixerDev.MhpRd : (audioVia == RdRxAudioVia.HfSpeaker ? MixerDev.SpkHf : MixerDev.SpkRd));
                        Top.Mixer.Link(port, dev, MixerDir.Send, Mixer.RD_PRIORITY, FuentesGlp.RxRadio);
                    }
                }

                AudioVia = audioVia;
            }
        }
예제 #12
0
        public bool InSpeaker(RdRxAudioVia speaker)
        {
            bool ret = false;

            if (AudioVia == speaker)
            {
                ret = true;
            }
            else if (AudioVia == RdRxAudioVia.HeadPhones)
            {
                MixerDev dev = (speaker == RdRxAudioVia.HfSpeaker) ? dev = MixerDev.SpkHf: MixerDev.SpkRd;
                foreach (int port in _RxPorts.Values)
                {
                    if (Top.Mixer.MatchActiveLink(dev, port))
                    {
                        ret = true;
                        break;
                    }
                }
            }
            return(ret);
        }
예제 #13
0
        /// <summary>
        /// Funcion que calcula el siguiente estado de audio para RX en la rotación,
        /// teniendo en cuenta la configuración y el estado de los altavoces
        /// y el estado del RdDst.Tx
        /// </summary>

        /// <returns>audio via</returns>
        private RdRxAudioVia NextRxAudioVia()
        {
            RdRxAudioVia audioViaKO = RdRxAudioVia.NoAudio;

            switch (AudioVia)
            {
            case RdRxAudioVia.NoAudio:
                if (Top.Hw.RdSpeaker)
                {
                    return(RdRxAudioVia.Speaker);
                }
                else if (Top.Rd.HFSpeakerAvailable() &&
                         ((TipoFrecuencia == TipoFrecuencia_t.HF) || Top.Rd.DoubleRadioSpeaker))
                {
                    return(RdRxAudioVia.HfSpeaker);
                }
                else if (!Top.Mixer.ModoSoloAltavoces)
                {
                    return(RdRxAudioVia.HeadPhones);
                }
                audioViaKO = RdRxAudioVia.Speaker;
                break;

            case RdRxAudioVia.Speaker:
                if (Top.Rd.HFSpeakerAvailable() &&
                    ((TipoFrecuencia == TipoFrecuencia_t.HF) || Top.Rd.DoubleRadioSpeaker))
                {
                    return(RdRxAudioVia.HfSpeaker);
                }
                else if (Top.Mixer.ModoSoloAltavoces)
                {
                    if (!Tx)
                    {
                        return(RdRxAudioVia.NoAudio);
                    }
                }
                else
                {
                    return(RdRxAudioVia.HeadPhones);
                }
                if (!Top.Mixer.ModoSoloAltavoces)
                {
                    audioViaKO = RdRxAudioVia.HeadPhones;
                }
                else
                {
                    // No saca ventana de via no disponible
                    return(RdRxAudioVia.Speaker);
                }
                break;

            case RdRxAudioVia.HfSpeaker:
                if (Top.Mixer.ModoSoloAltavoces)
                {
                    if (!Tx)
                    {
                        return(RdRxAudioVia.NoAudio);
                    }
                    else if (Top.Hw.RdSpeaker)
                    {
                        return(RdRxAudioVia.Speaker);
                    }
                }
                else
                {
                    return(RdRxAudioVia.HeadPhones);
                }
                if (!Top.Mixer.ModoSoloAltavoces)
                {
                    audioViaKO = RdRxAudioVia.HeadPhones;
                }
                else
                {
                    // No saca ventana de via no disponible
                    return(RdRxAudioVia.HfSpeaker);
                }
                audioViaKO = RdRxAudioVia.HeadPhones;
                break;

            default:     // RdRxAudioVia.HeadPhones
                if (!Tx)
                {
                    return(RdRxAudioVia.NoAudio);
                }
                else if (Top.Hw.RdSpeaker)
                {
                    return(RdRxAudioVia.Speaker);
                }
                else if (Top.Rd.HFSpeakerAvailable() &&
                         ((TipoFrecuencia == TipoFrecuencia_t.HF) || Top.Rd.DoubleRadioSpeaker))
                {
                    return(RdRxAudioVia.HfSpeaker);
                }
                audioViaKO = RdRxAudioVia.Speaker;
                break;
            }
            General.SafeLaunchEvent(AudioViaNotAvailable, this, audioViaKO);
            return(AudioVia);
        }
예제 #14
0
 public void SetRdAudio(int id, RdRxAudioVia audio)
 {
     _Comm.Send(new byte[] { (byte)OpeEventType.Radio, (byte)RdCmdType.RxClick, (byte)(id + 1) });
     _Logger.Debug("(Tx) Radio: [Id={0}] [AudioVia={1}]", id, audio);
 }
예제 #15
0
 public RdAsignState(bool tx, bool rx, RdRxAudioVia audio)
 {
     Tx       = tx;
     Rx       = rx;
     AudioVia = audio;
 }