Пример #1
0
        private void Session_RDSFrameReceivedEvent(Framework.RDSCommand frame, RDSSession session)
        {
            //Get type
            if (frame.GetType() != typeof(RadioTextRDSCommand))
            {
                return;
            }
            RadioTextRDSCommand cmd = (RadioTextRDSCommand)frame;

            //Set if the clear flag has been changed
            //http://www.interactive-radio-system.com/docs/EN50067_RDS_Standard.pdf defines that a screen clear should happen
            if (_lastClearFlag != cmd.clear)
            {
                //Clear the buffer
                for (var i = 0; i < textBuffer.Length; i++)
                {
                    textBuffer[i] = (char)0x00;
                }

                //Set the buffer
                _lastClearFlag     = cmd.clear;
                _firstChunkDecoded = false;

                //Send event
                RDSFeatureRadioText_RadioTextClearedUpdatedEvent?.Invoke();
            }
            else
            {
                //Set data in buffer
                textBuffer[cmd.offset + 0] = cmd.letterA;
                textBuffer[cmd.offset + 1] = cmd.letterB;
                textBuffer[cmd.offset + 2] = cmd.letterC;
                textBuffer[cmd.offset + 3] = cmd.letterD;

                //Set chunk flag
                if (cmd.offset == 0)
                {
                    _firstChunkDecoded = true;
                }

                //Update final station name, if any
                //http://www.interactive-radio-system.com/docs/EN50067_RDS_Standard.pdf defines that the final message must end with \r. We use that to determine when the message is fully written
                if ((cmd.letterA == '\r' || cmd.letterB == '\r' || cmd.letterC == '\r' || cmd.letterD == '\r') && _firstChunkDecoded)
                {
                    radioText = new string(textBuffer);
                    RDSFeatureRadioText_RadioTextUpdatedEvent?.Invoke(radioText);
                }
            }

            //Send event
            RDSFeatureRadioText_RadioTextBufferUpdatedEvent?.Invoke(textBuffer, cmd.offset, 4);
        }
Пример #2
0
        public static RDSCommand ReadRdsFrame(RdsFrame frame)
        {
            //Swap frame bits
            ushort groupA = (ushort)((frame.GroupA >> 8) | (frame.GroupA << 8));
            ushort groupB = (ushort)((frame.GroupB >> 8) | (frame.GroupB << 8));
            ushort groupC = (ushort)((frame.GroupC >> 8) | (frame.GroupC << 8));
            ushort groupD = (ushort)((frame.GroupD >> 8) | (frame.GroupD << 8));

            //Decode params in block 2
            RdsHeaderFrame header = DecodeGroupBHeader(groupB);

            //Determine the RDSCommand to use
            RDSCommand cmd;

            switch (header.groupType)
            {
            case 0: cmd = new BasicDataRDSCommand(); break;

            case 2: cmd = new RadioTextRDSCommand(); break;

            default: cmd = new UnsupportedRDSCommand(); break;
            }

            //Set basic params on the command
            cmd.programIdentificationCode = groupA;
            cmd._header = header;
            cmd._groupA = groupA;
            cmd._groupB = groupB;
            cmd._groupC = groupC;
            cmd._groupD = groupD;

            //Read the data
            cmd.ReadCommand(header.specialData, groupC, groupD);

            return(cmd);
        }