001    /*----------------------------------------------------------------------------*/
002    /* Copyright (c) FIRST 2008-2012. All Rights Reserved.                        */
003    /* Open Source Software - may be modified and shared by FRC teams. The code   */
004    /* must be accompanied by the FIRST BSD license file in the root directory of */
005    /* the project.                                                               */
006    /*----------------------------------------------------------------------------*/
007    
008    package edu.wpi.first.wpilibj;
009    
010    /**
011     * Interface for counting the number of ticks on a digital input channel.
012     * Encoders, Gear tooth sensors, and counters should all subclass this so it can be used to
013     * build more advanced classes for control and driving.
014     */
015    public interface CounterBase {
016    
017        /**
018         * The number of edges for the counterbase to increment or decrement on
019         */
020        public static class EncodingType {
021    
022            /**
023             * The integer value representing this enumeration
024             */
025            public final int value;
026            static final int k1X_val = 0;
027            static final int k2X_val = 1;
028            static final int k4X_val = 2;
029            /**
030             * Count only the rising edge
031             */
032            public static final EncodingType k1X = new EncodingType(k1X_val);
033            /**
034             * Count both the rising and falling edge
035             */
036            public static final EncodingType k2X = new EncodingType(k2X_val);
037            /**
038             * Count rising and falling on both channels
039             */
040            public static final EncodingType k4X = new EncodingType(k4X_val);
041    
042            private EncodingType(int value) {
043                this.value = value;
044            }
045        }
046    
047        /**
048         * Start the counter
049         */
050        public void start();
051    
052        /**
053         * Get the count
054         * @return the count
055         */
056        int get();
057    
058        /**
059         * Reset the count to zero
060         */
061        void reset();
062    
063        /**
064         * Stop counting
065         */
066        void stop();
067    
068        /**
069         * Get the time between the last two edges counted
070         * @return the time beteween the last two ticks in seconds
071         */
072        double getPeriod();
073    
074        /**
075         * Set the maximum time between edges to be considered stalled
076         * @param maxPeriod the maximum period in seconds
077         */
078        void setMaxPeriod(double maxPeriod);
079    
080        /**
081         * Determine if the counter is not moving
082         * @return true if the counter has not changed for the max period
083         */
084        boolean getStopped();
085    
086        /**
087         * Determine which direction the counter is going
088         * @return true for one direction, false for the other
089         */
090        boolean getDirection();
091    }