001    package edu.wpi.first.wpilibj.fpga;
002    
003    import com.ni.rio.*;
004    import edu.wpi.first.wpilibj.communication.BumARioHandle;
005    
006    public abstract class tSystem implements ExpectedFPGASignature//, DMAChannelDescriptors
007    {
008       protected static int m_DeviceHandle=0;
009       private static int m_ReferenceCount=0;
010       public static NiRioStatus status = new NiRioStatus();
011    
012       private static final String kRIO_DEVICE_NAME = "RIO0";
013       private static final int kFPGA_RESET_REGISTER = 0x8102;
014       private static final int kFPGA_COMMAND_REGISTER = 0x8104;
015       private static final int kFPGA_COMMAND_ENABLE_CLEAR = 4;
016       private static final int kFPGA_COMMAND_ENABLE_IN = 2;
017       private static final int kFPGA_INTERRUPT_BASE_ADDRESS = 0x8000;
018       private static final int kFPGA_SIGNATURE_REGISTER = 0x8108;
019       private static final int kMITE_IOPCR_REGISTER = 0x470;
020       private static final int kMITE_IOPCR_32BIT = 0xC00231;
021    
022       protected tSystem()
023       {
024          NiRioStatus versionStatus = new NiRioStatus();
025          if (m_DeviceHandle == 0)
026          {
027             // Bum a RIO handle from network communications
028             m_DeviceHandle = BumARioHandle.bum(status.getPointer());
029    
030             // Check the GUID
031             int hwGUID[] = new int[4];
032             for(int i=0; i<4; i++)
033             {
034                NiRioStatus cleanStatus = new NiRioStatus();
035                
036                hwGUID[i] = NiFpga.readU32(m_DeviceHandle, kFPGA_SIGNATURE_REGISTER, cleanStatus);
037                status.setStatus(cleanStatus);
038                if (hwGUID[i] != kExpectedFPGASignature[i])
039                {
040    //               versionStatus.setStatus(NiRioStatus.kRIOStatusVersionMismatch);
041                }
042             }
043    
044             System.out.print("FPGA Hardware GUID: ");
045             printGUID(hwGUID);
046             System.out.println("");
047             System.out.print("FPGA Software GUID: ");
048             printGUID(kExpectedFPGASignature);
049             System.out.println("");
050          }
051          status.setStatus(versionStatus);
052       }
053    
054       private static void printGUID(int guid[])
055       {
056          System.out.print("0x");
057          for(int i=0; i<4; i++)
058          {
059             long longVar = guid[i];
060             String word = Long.toString(longVar & 0xFFFFFFFFL, 16);
061             while (word.length() < 8)
062             {
063                word = "0" + word;
064             }
065             System.out.print(word);
066          }
067       }
068    
069       protected void finalize()
070       {
071       }
072    
073       public int[] getFpgaGuid(NiRioStatus status)
074       {
075                    int[] guid = {0,0,0,0};
076          if (m_DeviceHandle == 0)
077          {
078             status.setStatus(NiRioStatus.kRIOStatusInvalidHandle);
079             return guid;
080          }
081    
082          for(int i=0; i<4; i++)
083          {
084             guid[i] = NiFpga.readU32(m_DeviceHandle, kFPGA_SIGNATURE_REGISTER, status);
085          }
086          return guid;
087       }
088    
089            /**
090             * Releases the native C++ resources held by the tSystem instance.
091             */
092            public void Release()
093       {
094            }
095    }