gov.redhawk.bulkio.ui.internal.SriDataViewReceiver.java Source code

Java tutorial

Introduction

Here is the source code for gov.redhawk.bulkio.ui.internal.SriDataViewReceiver.java

Source

/**
 * This file is protected by Copyright.
 * Please refer to the COPYRIGHT file distributed with this source distribution.
 *
 * This file is part of REDHAWK IDE.
 *
 * All rights reserved.  This program and the accompanying materials are made available under
 * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html.
 *
 */
package gov.redhawk.bulkio.ui.internal;

import gov.redhawk.bulkio.ui.BulkIOUIActivator;
import gov.redhawk.bulkio.ui.views.SriDataView;
import gov.redhawk.bulkio.util.AbstractUberBulkIOPort;
import gov.redhawk.bulkio.util.BulkIOType;
import gov.redhawk.bulkio.util.BulkIOUtilActivator;
import gov.redhawk.model.sca.ScaUsesPort;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.ui.progress.WorkbenchJob;

import BULKIO.PrecisionUTCTime;
import BULKIO.StreamSRI;

public class SriDataViewReceiver extends AbstractUberBulkIOPort {
    private ScaUsesPort port;
    private TreeViewer viewer;
    private SriDataView sriDataView;
    private String activeSriStreamID;
    private String connectionId;
    private Map<String, SriWrapper> modelStreamMap = new HashMap<String, SriWrapper>(); // contains real time stream data
    private Map<String, SriWrapper> viewStreamMap = modelStreamMap; // contains stream data available to the view UI
    private Object[] expandedItems;
    private boolean inputSet;
    private final Job refreshView;

    public SriDataViewReceiver(BulkIOType type, TreeViewer treeViewer, SriDataView view) {
        super(type);
        this.viewer = treeViewer;
        this.sriDataView = view;
        this.refreshView = new WorkbenchJob(treeViewer.getControl().getDisplay(), "Updating SRI view...") {

            @Override
            public IStatus runInUIThread(IProgressMonitor monitor) {
                if (viewer != null & !viewer.getControl().isDisposed()) {

                    // Capture expanded state to persist after setInput
                    setExpandedItems(viewer.getExpandedElements());
                    viewer.getControl().setRedraw(false);

                    // Send input to content provider
                    if (!inputSet) {
                        viewer.setInput(viewStreamMap);
                        inputSet = true;
                    } else {
                        viewer.refresh();
                    }

                    // Rebuild expanded state
                    viewer.setExpandedElements(getExpandedItems());
                    viewer.getControl().setRedraw(true);

                    // Bold tabs of views with modified content, rebuild menus and toolbars
                    sriDataView.contentChanged();
                }
                return Status.OK_STATUS;
            }
        };
        refreshView.setUser(false);
        refreshView.setSystem(true);
    }

    public void setPort(@NonNull ScaUsesPort port) {
        setBulkIOType(BulkIOType.getType(port.getRepid()));
        this.port = port;
    }

    @NonNull
    public Map<String, SriWrapper> getStreamMap() {
        return viewStreamMap;
    }

    public void setActiveStreamID(@NonNull String newStreamID) {
        activeSriStreamID = newStreamID;
        refreshView.schedule();
    }

    @Override
    protected void handleStreamSRIChanged(@NonNull String streamID, @Nullable final StreamSRI oldSri,
            @NonNull final StreamSRI newSri) {
        super.handleStreamSRIChanged(streamID, oldSri, newSri);

        // store the incoming SRI data in the modelStreamMap
        if (modelStreamMap.containsKey(streamID)) {
            SriWrapper stream = modelStreamMap.get(streamID);
            stream.setSri(newSri);
            stream.setPushSriDate(new Date());
        } else {
            SriWrapper sriWrapper = new SriWrapper(newSri, new Date());
            modelStreamMap.put(streamID, sriWrapper);
        }
        if (activeSriStreamID == null) {
            activeSriStreamID = streamID;
        }

        if (activeSriStreamID.equals(streamID)) {
            refreshView.schedule(100);
        }
    }

    // updates the viewStreamMap from modelStreamMap when the pause button is selected
    public void updateViewStreamMap() {
        if (sriDataView.isPaused()) {
            viewStreamMap = deepcopy(modelStreamMap);
            inputSet = false;
        } else {
            viewStreamMap = modelStreamMap;
            inputSet = false;
        }
        refreshView.schedule();
    }

    private Map<String, SriWrapper> deepcopy(Map<String, SriWrapper> modelStreamMap) {
        Map<String, SriWrapper> copy = new HashMap<String, SriWrapper>();
        for (Entry<String, SriWrapper> entry : modelStreamMap.entrySet()) {
            copy.put(entry.getKey(), new SriWrapper(entry.getValue()));
        }
        return copy;
    }

    public void setConnectionID(String connectionId) {
        this.connectionId = connectionId;
    }

    public void connect() throws CoreException {
        if (port == null) {
            throw new IllegalStateException("Port must not be null");
        }
        if (connectionId == null) {
            BulkIOUtilActivator.getBulkIOPortConnectionManager().connect(port.getIor(), getBulkIOType(), this);
        } else {
            BulkIOUtilActivator.getBulkIOPortConnectionManager().connect(port.getIor(), getBulkIOType(), this,
                    connectionId);
        }
    }

    public void disconnect() {
        final SriDataViewReceiver receiver = this;
        Job disconnectJob = new Job("Disconnecting SRI Receiver...") {
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                BulkIOUtilActivator.getBulkIOPortConnectionManager().disconnect(port.getIor(), getBulkIOType(),
                        receiver);
                return Status.OK_STATUS;
            }
        };
        disconnectJob.setUser(false);
        disconnectJob.setSystem(true);
        disconnectJob.schedule();
    }

    private void setPrecisionTime(@NonNull PrecisionUTCTime time, String streamID) {
        // sets precision time to latest pushPacket
        SriWrapper stream = modelStreamMap.get(streamID);
        if (stream == null) {
            return;
        }
        if (time != null) {
            // Build packet's precision time stamp
            final String precisionString;
            final double seconds = (time.twsec * 1000 + time.tfsec);
            if (Double.isInfinite(seconds) || Double.isNaN(seconds)) {
                precisionString = Double.toString(seconds);
            } else {
                Date precisionTime = new Date((long) seconds);
                precisionString = BulkIOUIActivator.toISO8601TimeStr(precisionTime);
            }

            // Assign to SriWrapper object
            modelStreamMap.get(streamID).setPrecisionTime(precisionString);

            if (!sriDataView.isPaused()) {
                viewStreamMap.get(streamID).setPrecisionTime(precisionString);
                refreshView.schedule(250);
            }
        }
    }

    private void checkForEOS(boolean eos, String streamID) {
        SriWrapper stream = modelStreamMap.get(streamID);
        if (stream == null || !eos) {
            return;
        } else {
            stream.setEOS(true);
            sriDataView.setTerminatedStreams(true);
            refreshView.schedule(100);
        }
    }

    public String getActiveStreamID() {
        return activeSriStreamID;
    }

    @Override
    public void pushPacket(short[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(char[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(double[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(float[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(long[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(int[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    @Override
    public void pushPacket(byte[] data, PrecisionUTCTime time, boolean eos, String streamID) {
        setPrecisionTime(time, streamID);
        checkForEOS(eos, streamID);
    }

    public Object[] getExpandedItems() {
        return expandedItems;
    }

    public void setExpandedItems(Object[] expandedItems) {
        this.expandedItems = expandedItems;
    }
}