001/* Copyright (C) Cross The Road Electronics 2024 */
002package com.ctre.phoenix.schedulers;
003import java.util.ArrayList;
004
005/**
006 * Scheduler that will run its ILoopables in sequence
007 */
008public class SequentialScheduler implements com.ctre.phoenix.ILoopable
009{
010        boolean _running = false;
011        ArrayList<com.ctre.phoenix.ILoopable> _loops = new ArrayList<com.ctre.phoenix.ILoopable>();
012        int _periodMs;
013        int _idx;
014        boolean _iterated = false;
015
016        /**
017         * Constructor for SequentialScheduler
018         * @param periodMs Not used, pass 0
019         */
020        public SequentialScheduler(int periodMs)
021        {
022                _periodMs = periodMs;
023        }
024        /**
025         * Add ILoopable to scheduler
026         * @param aLoop ILoopable to add
027         */
028        public void add(com.ctre.phoenix.ILoopable aLoop)
029        {
030                _loops.add(aLoop);
031        }
032
033        /**
034         * Get the currently running ILoopable
035         * @return null, not implemented
036         */
037        public com.ctre.phoenix.ILoopable getCurrent()
038        {
039                return null;
040        }
041
042        /**
043         * Remove all ILoopables
044         */
045        public void removeAll()
046        {
047                _loops.clear();
048        }
049
050        /**
051         * Start next ILoopable
052         */
053        public void start()
054        {
055                _idx = 0;
056                if(_loops.size() > 0)
057                        _loops.get(0).onStart();
058                
059                _running = true;
060        }
061        /**
062         * Stop every ILoopable
063         */
064        public void stop()
065        {
066                for (int i = 0; i < _loops.size(); i++)
067                {
068                        _loops.get(i).onStop();
069                }
070                _running = false;
071        }
072        /**
073         * Process the currently active ILoopable
074         * 
075         * Call this every loop
076         */
077        public void process()
078        {
079                _iterated = false;
080                if (_idx < _loops.size())
081                {
082                        if (_running)
083                        {
084                                com.ctre.phoenix.ILoopable loop = _loops.get(_idx);
085                                loop.onLoop();
086                                if (loop.isDone())
087                                {
088                                        _iterated = true;
089                                        ++_idx;
090                                        if (_idx < _loops.size()) _loops.get(_idx).onStart();
091                                }
092                        }
093                }
094                else
095                {
096                        _running = false;
097                }
098        }
099        /**
100         * @return true if we've just iterated to the next ILoopable
101         */
102        public boolean iterated()
103        {
104                return _iterated;
105        }
106        //--- Loopable ---/
107        /**
108         * Start next ILoopable
109         */
110        public void onStart()
111        {
112                start();
113        }
114
115        /**
116         * Process currently active ILoopable
117         */
118        public void onLoop()
119        {
120                process();
121        }
122
123        /**
124         * @return true when no longer running
125         */
126        public boolean isDone()
127        {
128                /* Have to return something to know if we are done */
129                if (_running == false)
130                        return true;
131                else
132                        return false;
133        }
134
135        /**
136         * Stop all ILoopables
137         */
138        public void onStop()
139        {
140                stop();
141        }
142}