Commit in hps-java/src/main/java/org/lcsim/hps/recon/tracking on MAIN | |||
HPSSVTDataBuffer.java | +145 | added 1.1 |
Class to create and buffer SVT data banks
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); + } + } + +}
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1