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}