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}