Subversion Repositories Code-Repo

Rev

Blame | Last modification | View Log | 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 implemented
        private InputInterface _lineFollowIn;
        private InputInterface _voltageIn;
        private InputInterface _waveformIn;
        private InputInterface _capacitanceIn;
        private InputInterface _temperatureIn;
        
        // Updater thread
        private Thread _pollingThread;
        
        // Labels
        private TextView _lineFollowLabel;
        private TextView _voltageLabel;
        private TextView _waveformLabel;
        private TextView _capacitanceLabel;
        private TextView _temperatureLabel;
        
        // Plots
        private XYPlot _lineFollowPlot;
        private XYPlot _voltagePlot;
        private XYPlot _waveformPlot;
        private XYPlot _capacitancePlot;
        private XYPlot _temperaturePlot;
        
        // Data for each plot
        private GenericXYSeries _lineFollowData;
        private GenericXYSeries _voltageData;
        private GenericXYSeries _waveformData;
        private GenericXYSeries _capacitanceData;
        private GenericXYSeries _temperatureData;
        
        // Constant values
        private static int _graphHeight = 80;   // Height in dp
        private static int _textSize = 15;              // TextSize for the labels
        private 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 plots
                createView();
        }
        
        /** Starting poing for executing Debug code */
        public void Run() {
                _updateSleepPeriod = Integer.parseInt(_sharedPrefs.getString("pref_UpdateInterval", "100"));
                
                // Initialize the input classes
                initializeInputs();
                
                // Create the updater thread
                setupPollingThread();
                
                _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 format
                        DecimalFormat df = new DecimalFormat("#.####");
                        @Override
                        public void run() {
                                try {
                                        while (true) {
                                                // Run until the interrupt signal is sent to the thread
                                                if (Thread.currentThread().isInterrupted()) {
                                                        break;
                                                }
                                                
                                                if (_connected) {
                                                        // Read in values from input classes
                                                        double 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 time
                                                        redrawGraphs();
                                                }
                                                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 it
                LinearLayout 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 plot
                if (!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 ticks
                plot.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 legend
                plot.getLegendWidget().setVisible(false);
                plot.getDomainLabelWidget().setVisible(false);
                plot.getRangeLabelWidget().setVisible(false);
                plot.getTitleWidget().setVisible(false);
                
                // Remove extra margin space
                plot.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 colors
                plot.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() {
                        @Override
                        public void run() {
                                _lineFollowLabel.setText(message);
                        }
                });
        }
        
        private void updateVoltageText(final String message) {
                _handler.post(new Runnable() {
                        @Override
                        public void run() {
                                _voltageLabel.setText(message);
                        }
                });
        }
        
        private void updateWaveformText(final String message) {
                _handler.post(new Runnable() {
                        @Override
                        public void run() {
                                _waveformLabel.setText(message);
                        }
                });
        }
        
        private void updateCapacitanceText(final String message) {
                _handler.post(new Runnable() {
                        @Override
                        public void run() {
                                _capacitanceLabel.setText(message);
                        }
                });
        }
        
        private void updateTemperatureText(final String message) {
                _handler.post(new Runnable() {
                        @Override
                        public void run() {
                                _temperatureLabel.setText(message);
                        }
                });
        }
        
        /** Redraws the graphs */
        private void redrawGraphs() {
                _handler.post(new Runnable() {
                        @Override
                        public void run() {
                                _lineFollowPlot.redraw();
                                _voltagePlot.redraw();
                                _waveformPlot.redraw();
                                _capacitancePlot.redraw();
                                _temperaturePlot.redraw();
                        }
                });
        }
        
        public View getView() {
                return _view;
        }
}