001    /*
002     * To change this template, choose Tools | Templates
003     * and open the template in the editor.
004     */
005    package edu.wpi.first.wpilibj.image;
006    
007    import com.sun.cldc.jna.Pointer;
008    import com.sun.cldc.jna.Structure;
009    
010    /**
011     *
012     * @author koconnor
013     */
014    public class LinearAverages {
015        
016        Pointer columnAveragesPtr;
017        int columnCount;
018        float[] columnAverages;
019        Pointer rowAveragesPtr;
020        int rowCount;
021        float[] rowAverages;
022        Pointer risingDiagAveragesPtr;
023        int risingDiagCount;
024        float[] risingDiagAverages;
025        Pointer fallingDiagAveragesPtr;
026        int fallingDiagCount;
027        float[] fallingDiagAverages;
028        
029        public static class LinearAveragesMode {
030            
031            public final int value;
032            static final int IMAQ_COLUMN_AVERAGES_val = 1;
033            static final int IMAQ_ROW_AVERAGES_val = 2;
034            static final int IMAQ_RISING_DIAG_AVERAGES_val = 4;
035            static final int IMAQ_FALLING_DIAG_AVERAGES_val = 8;
036            static final int IMAQ_ALL_LINEAR_AVERAGES_val = 15;
037            public static final LinearAveragesMode IMAQ_COLUMN_AVERAGES = new LinearAveragesMode(IMAQ_COLUMN_AVERAGES_val);
038            public static final LinearAveragesMode IMAQ_ROW_AVERAGES = new LinearAveragesMode(IMAQ_ROW_AVERAGES_val);
039            public static final LinearAveragesMode IMAQ_RISING_DIAG_AVERAGES = new LinearAveragesMode(IMAQ_RISING_DIAG_AVERAGES_val);
040            public static final LinearAveragesMode IMAQ_FALLING_DIAG_AVERAGES = new LinearAveragesMode(IMAQ_FALLING_DIAG_AVERAGES_val);
041            public static final LinearAveragesMode IMAQ_ALL_LINEAR_AVERAGES = new LinearAveragesMode(IMAQ_ALL_LINEAR_AVERAGES_val);
042            
043            private LinearAveragesMode (int value){
044                this.value = value;
045            }
046        }
047        
048        private class LinearAveragesStruct extends Structure {
049    
050            public void read() {
051                columnCount = backingNativeMemory.getInt(4);
052                columnAveragesPtr = backingNativeMemory.getPointer(0, 4*columnCount);
053                columnAverages = new float[columnCount];
054                columnAveragesPtr.getFloats(0, columnAverages, 0, columnCount);
055                rowCount = backingNativeMemory.getInt(12);
056                rowAveragesPtr = backingNativeMemory.getPointer(8, 4*rowCount);
057                rowAverages = new float[rowCount];
058                rowAveragesPtr.getFloats(0, rowAverages, 0, rowCount);
059                risingDiagCount = backingNativeMemory.getInt(20);
060                risingDiagAveragesPtr = backingNativeMemory.getPointer(16, 4*risingDiagCount);
061                risingDiagAverages = new float[risingDiagCount];
062                risingDiagAveragesPtr.getFloats(0, risingDiagAverages, 0, risingDiagCount);
063                fallingDiagCount = backingNativeMemory.getInt(28);
064                fallingDiagAveragesPtr = backingNativeMemory.getPointer(24, 4*fallingDiagCount);
065                fallingDiagAverages = new float[fallingDiagCount];
066                fallingDiagAveragesPtr.getFloats(0, fallingDiagAverages, 0, fallingDiagCount);
067            }
068    
069            public void write() {
070                backingNativeMemory.setPointer(0, columnAveragesPtr);
071                backingNativeMemory.setInt(4, columnCount);
072                backingNativeMemory.setPointer(8, rowAveragesPtr);
073                backingNativeMemory.setInt(12, rowCount);
074                backingNativeMemory.setPointer(16, risingDiagAveragesPtr);
075                backingNativeMemory.setInt(20, risingDiagCount);
076                backingNativeMemory.setPointer(24, fallingDiagAveragesPtr);
077                backingNativeMemory.setInt(28, fallingDiagCount);
078            }
079    
080            public int size() {
081                return 32;
082            }
083    
084            /**
085             * Free the memory used by this range
086             */
087            public void free() {
088                release();
089            }
090    
091            /**
092             * Create a new range with the specified upper and lower boundaries
093             * @param lower The lower limit
094             * @param upper The upper limit
095             */
096            public LinearAveragesStruct(int address) {
097                useMemory(new Pointer(address, size()));
098                read();
099            }
100        }
101        
102        LinearAverages(int address){
103            new LinearAveragesStruct(address);
104        }
105        
106        public float[] getColumnAverages(){
107            return columnAverages;
108        }
109        
110        public float[] getRowAverages(){
111            return rowAverages;
112        }
113        
114        public float[] getRisingDiagAverages(){
115            return risingDiagAverages;
116        }
117        
118        public float[] getFallingDiagAverages(){
119            return fallingDiagAverages;
120        }
121    }