001package com.ctre.phoenix.schedulers;
002import java.util.ArrayList;
003
004import com.ctre.phoenix.ILoopable;
005
006/**
007 * Scheduler that wil run its ILoopables in concurrency
008 */
009public class ConcurrentScheduler implements ILoopable {
010        ArrayList<ILoopable> _loops = new ArrayList<ILoopable>();
011        ArrayList<Boolean> _enabs = new ArrayList<Boolean>();
012
013        /**
014         * Add ILoopable to schedule
015         * @param aLoop ILoopable to add to schedule
016         * @param enable Whether to enable ILoopable
017         */
018        public void add(ILoopable aLoop, boolean enable) {
019                _loops.add(aLoop);
020                _enabs.add(enable);
021        }
022        /**
023         * Add ILoopable to scheduler
024         * @param aLoop ILoopable to add
025         */
026        public void add(ILoopable aLoop) {
027                add(aLoop, true);
028        }
029
030        /**
031         * Remove all ILoopables from scheduler
032         */
033        public void removeAll() {
034                _loops.clear();
035                _enabs.clear();
036        }
037
038        /**
039         * Start an ILoopable
040         * @param toStart ILoopable to start
041         */
042        public void start(ILoopable toStart) {
043                for (int i = 0; i < _loops.size(); ++i) {
044                        ILoopable lp = (ILoopable) _loops.get(i);
045
046                        if (lp == toStart) {
047                                _enabs.set(i, true);
048                                lp.onStart();
049                                return;
050                        }
051                }
052
053        }
054
055        /**
056         * Stop an ILoopable
057         * @param toStop ILoopable to stop
058         */
059        public void stop(ILoopable toStop) {
060                for (int i = 0; i < (int) _loops.size(); ++i) {
061                        ILoopable lp = (ILoopable) _loops.get(i);
062
063                        if (lp == toStop) {
064                                _enabs.set(i, false);
065                                lp.onStop();
066                                return;
067                        }
068                }
069        }
070
071        //--- Loopable ---/
072        /**
073         * Start all ILoopables
074         */
075        public void startAll() { // All Loops
076
077                for (ILoopable loop : _loops) {
078                        loop.onStart();
079                }
080                for (int i = 0; i < _enabs.size(); ++i) {
081                        _enabs.set(i,  true);
082                }
083        }
084
085        /**
086         * Stop all ILoopables
087         */
088        public void stopAll() { // All Loops
089                for (ILoopable loop : _loops) {
090                        loop.onStop();
091                }
092                for (int i = 0; i < _enabs.size(); ++i) {
093                        _enabs.set(i,  false);
094                }
095        }
096
097        /**
098         * Process every ILoopable
099         * 
100         * Call this every loop
101         */
102        public void process() {
103                for (int i = 0; i < (int) _loops.size(); ++i) {
104                        ILoopable loop = (ILoopable) _loops.get(i);
105                        boolean en = (boolean) _enabs.get(i);
106                        if (en) {
107                                loop.onLoop();
108                        } else {
109                                /* Current ILoopable is turned off, don't call onLoop for it */
110                        }
111                }
112        }
113
114        /**
115         * Start all ILoopables
116         */
117        public void onStart() {
118                startAll();
119        }
120
121        /**
122         * Process all ILoopables
123         */
124        public void onLoop() {
125                process();
126        }
127
128        /**
129         * Stop all ILoopables
130         */
131        public void onStop() {
132                stopAll();
133        }
134
135        /**
136         * @return false, this is never done
137         */
138        public boolean isDone() {
139                return false;
140        }
141}