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); }
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); }