hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -N HPSSVTDataBuffer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ HPSSVTDataBuffer.java 5 Apr 2012 20:32:09 -0000 1.1
@@ -0,0 +1,145 @@
+
+package org.lcsim.hps.recon.tracking;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @version $Id: HPSSVTDataBuffer.java,v 1.1 2012/04/05 20:32:09 omoreno Exp $
+ */
+public class HPSSVTDataBuffer {
+
+ private static final HPSSVTDataBuffer instance = new HPSSVTDataBuffer();
+
+ private static List<Integer> data = new ArrayList<Integer>();
+ int[] header = new int[8];
+ int temp = 23; // C
+ int numFpga = 8;
+
+ // Map the fpga to the data emerging from it
+ private static Map<Integer, List<Integer>> fpgaToData = new HashMap<Integer, List<Integer>>();
+
+ // Mask used to encode SVT data header information
+ private static final int FPGA_MASK = 0xFFFF;
+ private static final int TEMP_MASK = 0xFFFF;
+ private static final int ID_MASK = 0xFF;
+
+
+ /**
+ * Default constructor; Set to private to prevent instantiation
+ */
+ private HPSSVTDataBuffer()
+ {
+ //
+ for(int fpga = 0; fpga < numFpga; fpga++) {
+ fpgaToData.put(fpga, new ArrayList<Integer>());
+ }
+ }
+
+ /**
+ *
+ */
+ public static void addToBuffer(List<HPSSVTData> svtData, int fpga)
+ {
+ if(instance.fpgaToData.isEmpty()){
+
+ // Create SVT data banks
+ instance.createDataBanks();
+ }
+
+ instance.fillBank(svtData, fpga);
+ }
+
+ /**
+ *
+ */
+ public static Integer[] readoutBuffer(int fpga)
+ {
+
+ Integer[] datum = (Integer[]) fpgaToData.get(fpga).toArray();
+ fpgaToData.get(fpga).clear();
+
+ // Return the
+ return (Integer[]) data.toArray();
+ }
+
+ /**
+ *
+ */
+ private void fillBank(List<HPSSVTData> svtData, int fpga)
+ {
+ // Data
+ int[] datum;
+ for(HPSSVTData svtDatum : svtData){
+ datum = svtDatum.getData();
+ for(int index = 0; index < datum.length; index++){
+ fpgaToData.get(fpga).add(datum[index]);
+ }
+ }
+
+ // Tail
+ fpgaToData.get(fpga).add(0);
+
+ // Frame Size
+ fpgaToData.get(fpga).add(0, fpgaToData.get(fpga).size());
+
+ }
+
+ /**
+ *
+ */
+ private void createDataBanks()
+ {
+ // Create the headers for each of the banks
+
+ //--- FPGA 7 ---//
+ fpgaToData.get(7).add(0x00070101); // Tag = 7, UI32, Idx = 1
+
+ // Insert the temperature information. All temperatures are currently
+ // set to 23 C
+ header[0] = (header[0] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[0] = (header[0] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[1] = (header[1] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[1] = (header[1] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[2] = (header[2] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[2] = (header[2] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[3] = (header[3] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[3] = (header[3] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[4] = (header[4] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[4] = (header[4] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[5] = (header[5] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[5] = (header[5] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[6] = (header[6] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[6] = (header[6] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+ header[7] = (header[7] &= ~TEMP_MASK) | (temp & TEMP_MASK);
+ header[7] = (header[7] &= ~(TEMP_MASK << 16)) | ((temp & TEMP_MASK) << 16);
+
+
+ for(int index = 0; index < header.length; index++){
+ fpgaToData.get(7).add(header[index]);
+ }
+
+ int buff = 0;
+
+ //--- FPGA 0-6 ---//
+ for(int fpga = 0; fpga < numFpga - 1; fpga++){
+ buff = (buff &= ~(0x1 << 8)) | ((1 & ID_MASK) << 8);
+ buff = (buff &= ~(FPGA_MASK << 16)) | ((fpga & FPGA_MASK) << 16);
+ buff = (buff &= ~ID_MASK) | (fpga+1 & ID_MASK);
+
+ fpgaToData.get(fpga).add(buff);
+ }
+ }
+
+}