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.

Reply via email to