Blame | Last modification | View Log | Download | RSS feed
package IEEERobotics.IOIOAI.VT;import java.text.DecimalFormat;import com.androidplot.Plot.BorderStyle;import com.androidplot.xy.BoundaryMode;import com.androidplot.xy.LineAndPointFormatter;import com.androidplot.xy.StepFormatter;import com.androidplot.xy.XYPlot;import com.androidplot.xy.XYStepMode;import android.content.Context;import android.content.SharedPreferences;import android.graphics.Color;import android.os.Handler;import android.preference.PreferenceManager;import android.view.View;import android.view.ViewGroup;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.TextView;import android.widget.TableRow.LayoutParams;import ioio.lib.api.IOIO;import ioio.lib.api.exception.ConnectionLostException;public class DebugCode {private IOIORoboticsActivity _parent;private IOIO _ioio;private Context _appContext;private View _view;private SharedPreferences _sharedPrefs;private Handler _handler = new Handler();private Boolean _connected = false;// Input classes to be implementedprivate InputInterface _lineFollowIn;private InputInterface _voltageIn;private InputInterface _waveformIn;private InputInterface _capacitanceIn;private InputInterface _temperatureIn;// Updater threadprivate Thread _pollingThread;// Labelsprivate TextView _lineFollowLabel;private TextView _voltageLabel;private TextView _waveformLabel;private TextView _capacitanceLabel;private TextView _temperatureLabel;// Plotsprivate XYPlot _lineFollowPlot;private XYPlot _voltagePlot;private XYPlot _waveformPlot;private XYPlot _capacitancePlot;private XYPlot _temperaturePlot;// Data for each plotprivate GenericXYSeries _lineFollowData;private GenericXYSeries _voltageData;private GenericXYSeries _waveformData;private GenericXYSeries _capacitanceData;private GenericXYSeries _temperatureData;// Constant valuesprivate static int _graphHeight = 80; // Height in dpprivate static int _textSize = 15; // TextSize for the labelsprivate static int _graphLength;private static int _updateSleepPeriod;/** Class initializer */public DebugCode(IOIORoboticsActivity parent) {_parent = parent;_appContext = IOIORoboticsActivity.context_;// Get values from shared preferences_sharedPrefs = PreferenceManager.getDefaultSharedPreferences(_appContext);_graphLength = Integer.parseInt(_sharedPrefs.getString("pref_GraphLength", "100"));// Create the overall view with the labels and plotscreateView();}/** Starting poing for executing Debug code */public void Run() {_updateSleepPeriod = Integer.parseInt(_sharedPrefs.getString("pref_UpdateInterval", "100"));// Initialize the input classesinitializeInputs();// Create the updater threadsetupPollingThread();_parent.logMessage("Updater thread started");_pollingThread.start();}/** Initialize input classes */private void initializeInputs() {_parent.logMessage("Initializing inputs");_ioio = IOIORoboticsActivity.IOIOInstance_;// Initialize each input class (opens pins)try {_lineFollowIn = new InputLineFollower();_lineFollowIn.initialize(_ioio);_voltageIn = new InputVoltage();_voltageIn.initialize(_ioio);_waveformIn = new InputWaveform();_waveformIn.initialize(_ioio);_capacitanceIn = new InputCapacitance();_capacitanceIn.initialize(_ioio);_temperatureIn = new InputTemperature();_temperatureIn.initialize(_ioio);_connected = true;} catch (ConnectionLostException e) {}if (_connected) {// Update the status labels for each graphs_lineFollowLabel.setText("Pin #" + _lineFollowIn.getPinDescription());_voltageLabel.setText("Pin #" + _voltageIn.getPinDescription());_waveformLabel.setText("Pin #" + _waveformIn.getPinDescription());_capacitanceLabel.setText("Pin #" + _capacitanceIn.getPinDescription());_temperatureLabel.setText("Pin #" + _temperatureIn.getPinDescription());}}/** Sets up the updater thread to poll for data */private void setupPollingThread() {// Create a new thread to poll for new data at set interval_pollingThread = new Thread(new Runnable() {// Output decimal formatDecimalFormat df = new DecimalFormat("#.####");@Overridepublic void run() {try {while (true) {// Run until the interrupt signal is sent to the threadif (Thread.currentThread().isInterrupted()) {break;}if (_connected) {// Read in values from input classesdouble ret = _lineFollowIn.getValue();updateLineFollowText(_lineFollowIn.getPinDescription() + " Current Value: " + df.format(ret));_lineFollowData.addDataToList(ret);ret = _voltageIn.getValue();updateVoltageText(_voltageIn.getPinDescription() + " Current Value: " + df.format(ret));_voltageData.addDataToList(ret);ret = _waveformIn.getValue();updateWaveformText(_waveformIn.getPinDescription() + " Current Value: " + df.format(ret));_waveformData.addDataToList(ret);ret = _capacitanceIn.getValue();updateCapacitanceText(_capacitanceIn.getPinDescription() + " Current Value: " + df.format(ret));_capacitanceData.addDataToList(ret);ret = _temperatureIn.getValue();updateTemperatureText(_temperatureIn.getPinDescription() + " Current Value: " + df.format(ret));_temperatureData.addDataToList(ret);// Redraw graph and sleep for set period of timeredrawGraphs();}Thread.sleep(_updateSleepPeriod);}} catch (Exception e) {stopPollingThread();}}});}/** Sends an interrupt signal to the thread and notifies input classes to close pins */public void stopPollingThread() {if (_pollingThread.isAlive()) {_parent.logMessage("Stopping updater thread");_pollingThread.interrupt();}if (_connected) {_lineFollowIn.closePins();_voltageIn.closePins();_waveformIn.closePins();_capacitanceIn.closePins();_temperatureIn.closePins();}_connected = false;}/** Create the view containing the text labels and plots */private void createView() {_lineFollowLabel = new TextView(_appContext);_lineFollowLabel.setText("Line Follow Plot Label");_lineFollowLabel.setTextSize(_textSize);_lineFollowPlot = new XYPlot(_appContext, "LineFollowPlot");_lineFollowPlot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, _graphHeight));_lineFollowData = new GenericXYSeries("Line Follow", _graphLength);setPlotDetails(_lineFollowPlot, _lineFollowData, 3.3, true);_voltageLabel = new TextView(_appContext);_voltageLabel.setText("Voltage Plot Label");_voltageLabel.setTextSize(_textSize);_voltagePlot = new XYPlot(_appContext, "VoltagePlot");_voltagePlot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, _graphHeight));_voltageData = new GenericXYSeries("Voltage Data", _graphLength);setPlotDetails(_voltagePlot, _voltageData, 3.3, false);_waveformLabel = new TextView(_appContext);_waveformLabel.setText("Waveform Plot Label");_waveformLabel.setTextSize(_textSize);_waveformPlot = new XYPlot(_appContext, "WaveformPlot");_waveformPlot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, _graphHeight));_waveformData = new GenericXYSeries("Waveform Data", _graphLength);setPlotDetails(_waveformPlot, _waveformData, 3.3, false);_capacitanceLabel = new TextView(_appContext);_capacitanceLabel.setText("Capacitance Plot Label");_capacitanceLabel.setTextSize(_textSize);_capacitancePlot = new XYPlot(_appContext, "CapacitancePlot");_capacitancePlot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, _graphHeight));_capacitanceData = new GenericXYSeries("Capacitance Data", _graphLength);setPlotDetails(_capacitancePlot, _capacitanceData, 3.3, false);_temperatureLabel = new TextView(_appContext);_temperatureLabel.setText("Temperature Plot Label");_temperatureLabel.setTextSize(_textSize);_temperaturePlot = new XYPlot(_appContext, "TemperaturePlot");_temperaturePlot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, _graphHeight));_temperatureData = new GenericXYSeries("Temperature Data", _graphLength);setPlotDetails(_temperaturePlot, _temperatureData, 3.3, false);// Create the main layout and add each subview to itLinearLayout layout = new LinearLayout(_appContext);layout.setOrientation(LinearLayout.VERTICAL);layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));layout.addView(_lineFollowLabel);layout.addView(_lineFollowPlot);addDivider(layout);layout.addView(_voltageLabel);layout.addView(_voltagePlot);addDivider(layout);layout.addView(_waveformLabel);layout.addView(_waveformPlot);addDivider(layout);layout.addView(_capacitanceLabel);layout.addView(_capacitancePlot);addDivider(layout);layout.addView(_temperatureLabel);layout.addView(_temperaturePlot);ScrollView scroller = new ScrollView(_appContext);scroller.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));scroller.addView(layout);_view = scroller;}/** Adds a divider to the specified layout */private void addDivider(View layout) {View ruler = new View(_appContext);ruler.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 2));ruler.setBackgroundColor(Color.rgb(50, 50, 50));((LinearLayout)layout).addView(ruler);}/** Associates the graph with the data and set how the graph looks */private void setPlotDetails(XYPlot plot, GenericXYSeries data, double range, boolean useStep) {// Associate data with plotif (!useStep)plot.addSeries(data, new LineAndPointFormatter(Color.rgb(0, 0, 200), Color.rgb(0, 0, 100),Color.rgb(150, 150, 190)));else {StepFormatter stepFormatter = new StepFormatter(Color.rgb(0, 0, 0), Color.rgb(150, 190, 150));stepFormatter.getLinePaint().setStrokeWidth(1);plot.addSeries(data, stepFormatter);}// Set boundary and ticksplot.setRangeBoundaries(0, range, BoundaryMode.FIXED);plot.setDomainBoundaries(0, _graphLength, BoundaryMode.FIXED);plot.setDomainStepValue(5);plot.setRangeStep(XYStepMode.SUBDIVIDE, 4);plot.setTicksPerRangeLabel(3);// Remove labels and legendplot.getLegendWidget().setVisible(false);plot.getDomainLabelWidget().setVisible(false);plot.getRangeLabelWidget().setVisible(false);plot.getTitleWidget().setVisible(false);// Remove extra margin spaceplot.getGraphWidget().setMargins(0, 10, 10, 0);plot.getGraphWidget().setRangeLabelWidth(30);plot.getGraphWidget().setDomainLabelWidth(15);plot.getGraphWidget().setMarginLeft(-5);plot.getGraphWidget().setMarginRight(25);plot.setPlotMargins(0, -10, 0, -5);plot.setPlotPadding(0, 0, 0, 0);// Background color for the plot and divider line colorsplot.getGraphWidget().getGridBackgroundPaint().setColor(Color.BLACK);plot.getGraphWidget().getGridLinePaint().setColor(Color.GRAY);plot.getGraphWidget().getDomainOriginLinePaint().setColor(Color.WHITE);plot.getGraphWidget().getRangeOriginLinePaint().setColor(Color.WHITE);// Background for the widget (not the plot itself)plot.getGraphWidget().setBackgroundPaint(null);plot.setBackgroundPaint(null);plot.setBorderPaint(null);plot.setBorderStyle(BorderStyle.SQUARE, null, null);plot.disableAllMarkup();}private void updateLineFollowText(final String message) {_handler.post(new Runnable() {@Overridepublic void run() {_lineFollowLabel.setText(message);}});}private void updateVoltageText(final String message) {_handler.post(new Runnable() {@Overridepublic void run() {_voltageLabel.setText(message);}});}private void updateWaveformText(final String message) {_handler.post(new Runnable() {@Overridepublic void run() {_waveformLabel.setText(message);}});}private void updateCapacitanceText(final String message) {_handler.post(new Runnable() {@Overridepublic void run() {_capacitanceLabel.setText(message);}});}private void updateTemperatureText(final String message) {_handler.post(new Runnable() {@Overridepublic void run() {_temperatureLabel.setText(message);}});}/** Redraws the graphs */private void redrawGraphs() {_handler.post(new Runnable() {@Overridepublic void run() {_lineFollowPlot.redraw();_voltagePlot.redraw();_waveformPlot.redraw();_capacitancePlot.redraw();_temperaturePlot.redraw();}});}public View getView() {return _view;}}