Revision: 1803
Author: wattymage
Date: Mon Mar 15 10:56:13 2010
Log: initial alpha sample
http://code.google.com/p/jallib/source/detail?r=1803
Added:
/trunk/catpad/rds_rx.jal
=======================================
--- /dev/null
+++ /trunk/catpad/rds_rx.jal Mon Mar 15 10:56:13 2010
@@ -0,0 +1,206 @@
+--Title rds_rx
+
+-- work in Progress Feb 2010
+-- Michael Watterson
+const RDSBLOCKSIZE = 26; -- inBits
+
+const word SYNDROMEA = 0x03D8;
+const word SYNDROMEB = 0x03D4;
+const word SYNDROMEC = 0x025C;
+const word SYNDROMECDASH = 0x03CC;
+const word SYNDROMED = 0x0258;
+const word LOOKUPSYNDROME = {
+ -- Starting at low bit lookup
+ 0x031B, 0x038F, 0x02A7, 0x00F7,
+ 0x01EE, 0x03DC, 0x0201, 0x01BB,
+ 0x0376, 0x0355, 0x0313, 0x039F,
+ 0x0287, 0x00B7, 0x016E, 0x02DC,
+ 0x0001, 0x0002, 0x0004, 0x0008,
+ 0x0010, 0x0020, 0x0040, 0x0080,
+ 0x0100, 0x0200 }
+
+const word DATAINPOLY = 0x031B;
+const word SYNSHIFTPOLY = 0x01B9;
+
+ -- private SerialPort portToUse = null;
+ -- use rds_data and rds_clock
+
+var word sampleRate = 0;
+var bit rxMsgValid =false
+var byte*16 rxMsgBytes
+var bit lastRxClock = false
+var bit rxClkSample = false
+ -- private boolean lastRxBit = false;
+var bit rxSample = false;
+
+
+ -- RDS SPECIFIC RECEIVER
+var bit rdsSync = false;
+var byte*4 rdsSyncBuffer = 0;
+var word rdsCounter = 0;
+
+ -- private static final int RDSBITSHIFTMASK = 0x03FFFFFF;
+
+-- values for RDS
+Const RDSS_NOSYNC =0
+Const RDSS_EXPECTA = 1
+Const RDSS_EXPECTB = 2
+Const RDSS_EXPECTC =3
+Const RDSS_EXPECTCDASH =4
+Const RDSS_EXPECTD =5
+Const RDSS_GOTASYNC = 6
+Const RDSS_GOTBSYNC = 7
+Const RDSS_GOTCSYNC = 8
+Const RDSS_GOTCDASHSYNC =9
+Const RDSS_GOTDSYNC =10
+Const RDSS_BUFFERFULL =11
+var byte rdsStatus = RDSS_NOSYNC
+
+
+ -- RDS STATS
+var byte allGroupsDetected = 0;
+var byte completeGroups = 0;
+var dword blocksDetected = 0;
+var dword errorBlocks = 0;
+var word bufferOverflows = 0;
+
+
+
+procedure sampleBits() is
+ rxClkSample = rds_clock
+ rxSample = rds_data
+ if (lastRxClock & !rxClkSample) Then -- 1->0 falling edge
+ rdsSyncBuffer = rdsSyncBuffer << 1;
+ if rxSample then
+ rdsSyncBuffer = (rdsSyncBuffer | 0x01)
+ else
+ rdsSyncBuffer
+ end if
+ rdsCounter = rdsCounter +1;
+ if (rdsCounter >= 26) Then
+ if (!rdsSync) then
+ rdsStatus = checkRDSSync() -- for every bit, disabled when
in sync
+ end if
+ rdsSync = false;
+ -- If we weren't Synced but are now we need to grab those bits
straight
+ -- away - GOTASYNC is the one we're looking for
+ case rdsStatus of
+ RDSS_NOSYNC :
+
+ RDSS_GOTASYNC :
+ block
+ allGroupsDetected= allGroupsDetected+1;
+ -- rdsStatus = checkRDSSync(); -- Recheck sync and
correct bits
+ -- System.out.println("RDS SYNCED! Data; " +
Integer.toHexString(rdsSyncBuffer));
+ if (rxMsgValid & rdsStatus == RDSS_GOTASYNC) then
+ -- rxMessage.clearMsgBytes();
+ rxMsgBytes = rxMessage.getMsgBytes();
+ rdsStatus = RDSSYNCSTATUS.EXPECTB;
+ -- STORE A BLOCK
+ rxMsgBytes[0] = (rdsSyncBuffer >> 18);
+ rxMsgBytes[1] = (rdsSyncBuffer >> 10);
+ rxMsgBytes[2] = (rdsSyncBuffer >> 2);
+ rxMsgBytes[3] = (rdsSyncBuffer << 6);
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+ rdsSync = true;
+ else
+ rdsStatus = RDSSYNCSTATUS.BUFFERFULL;
+ rdsCounter = 0;
+ bufferOverflows = bufferOverflows +1;
+ -- System.out.println("Warning Message Buffer is
Full");
+ end if
+ end block
+ RDSS_GOTBSYNC, RDSS_GOTCSYNC, RDSS_GOTDSYNC, RDSS_BUFFERFULL :
+ block
+ -- No point in doing anything for the next 26 bits!
+ -- Waiting for A Block
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+ block end;
+ RDSS_EXPECTA :
+ block
+ allGroupsDetected = allGroupsDetected+1;
+ rdsStatus = checkRDSSyncErrCor();
+ if (rxMsgValid & rdsStatus == RDSSYNCSTATUS.GOTASYNC)
then
+ -- rxMessage.clearMsgBytes();
+ rxMsgBytes = rds_rx_getMsgBytes();
+ rxMsgBytes[0] = (rdsSyncBuffer >> 18);
+ rxMsgBytes[1] = (rdsSyncBuffer >> 10);
+ rxMsgBytes[2] = (rdsSyncBuffer >> 2);
+ rxMsgBytes[3] = (rdsSyncBuffer << 6);
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+ rdsStatus = RDSSYNCSTATUS.EXPECTB;
+ rdsSync = true;
+ else
+ rdsStatus = RDSSYNCSTATUS.BUFFERFULL;
+ rdsCounter = 0;
+ bufferOverflows= bufferOverflows +1;
+ -- System.out.println("Warning Message Buffer is
Full");
+ end if
+ end block
+ RDSS_EXPECTB :
+ block
+ rdsStatus = checkRDSSyncErrCor();
+ -- System.out.println("Checking for B Block - " +
rdsStatus);
+ if (rdsStatus == RDSSYNCSTATUS.GOTBSYNC) then
+ -- Store B
+ -- System.out.println("RDS B Block recieved!
Data; " + Integer.toHexString(rdsSyncBuffer));
+ rxMsgBytes[4] = (byte)(rdsSyncBuffer >> 18);
+ rxMsgBytes[5] = (byte)(rdsSyncBuffer >> 10);
+ rxMsgBytes[6] = (byte)(rdsSyncBuffer >> 2);
+ rxMsgBytes[7] = (byte)(rdsSyncBuffer << 6);
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+
+ rdsStatus = RDSSYNCSTATUS.EXPECTC;
+ -- IS B TYPE Group?
+ if ((rxMsgBytes[4] & 0x08) != 0) then rdsStatus =
RDSS_EXPECTCDASH end if
+ rdsSync = true
+ end if
+ end block
+ RDSS_EXPECTCDASH, RDSS_EXPECTC :
+ block
+ rdsStatus = checkRDSSyncErrCor();
+ -- print_string(usb_serial_data,"Checking for C (or
C') Block - " + rdsStatus);
+ if (rdsStatus == RDSS_GOTCSYNC | rdsStatus ==
RDSS_GOTCDASHSYNC) Then
+ -- Store C in Message Buffer
+ -- System.out.println("RDS C Block recieved!
Data; " + Integer.toHexString(rdsSyncBuffer));
+ rxMsgBytes[8] = (byte)(rdsSyncBuffer >> 18);
+ rxMsgBytes[9] = (byte)(rdsSyncBuffer >> 10);
+ rxMsgBytes[10] = (byte)(rdsSyncBuffer >> 2);
+ rxMsgBytes[11] = (byte)(rdsSyncBuffer << 6);
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+ rdsStatus = RDSS_EXPECTD;
+ rdsSync = true;
+ end if
+ end block
+ RDSS_EXPECTD :
+ block
+ rdsStatus = checkRDSSyncErrCor();
+ -- System.out.println("Checking for D Block - " +
rdsStatus);
+ if (rdsStatus == RDSS_GOTDSYNC) Then
+ -- Store D in Message Buffer
+ -- System.out.println("Complete RDS Group
recieved!");
+ completeGroups++;
+ rxMsgBytes[12] = (byte)(rdsSyncBuffer >> 18);
+ rxMsgBytes[13] = (byte)(rdsSyncBuffer >> 10);
+ rxMsgBytes[14] = (byte)(rdsSyncBuffer >> 2);
+ rxMsgBytes[15] = (byte)(rdsSyncBuffer << 6);
+ -- Mark message Ready
+ rxMessage.setMsgBytes(rxMsgBytes);
+ rxMessage.setMsgStatus(MSGSTATUS.RECEIVED);
+ rdsSyncBuffer = 0;
+ rdsCounter = 0;
+ rdsStatus = RDSS_EXPECTA;
+ rdsSync = true;
+ end if
+ end block
+ end case
+ end if
+ end if
+ lastRxClock = rxClkSample;
+end procedure
+
--
You received this message because you are subscribed to the Google Groups
"jallib" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/jallib?hl=en.