All Downloads are FREE. Search and download functionalities are using the official Maven repository.

MDSplus.EventStream Maven / Gradle / Ivy

There is a newer version: 7.139.60
Show newest version
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package MDSplus;
import java.util.Vector;
import java.util.Date;
import java.util.Hashtable;
import java.util.StringTokenizer;
import javax.json.*;
import java.io.Writer;
import java.io.StringWriter;
import java.io.StringReader;



/**
 *
 * @author mdsplus
 */
public class EventStream extends Event {
    static boolean debug = false;
    java.lang.String streamName;
    Hashtable> listenerHash = 
                    new Hashtable>();
    public EventStream() throws MdsException
    {
        super("STREAMING");
    }
    public EventStream(java.lang.String streamName) throws MdsException
    {
        super(streamName);
        this.streamName = streamName;
    }
    public synchronized void registerListener(DataStreamListener listener)
    {
        registerListener(streamName, listener);
    }
   
    public synchronized void registerListener(java.lang.String streamName, DataStreamListener listener)
    {
        Vector listenerV = listenerHash.get(streamName);
        if(listenerV == null)
            listenerV = new Vector();
        listenerV.addElement(listener);
        listenerHash.put(streamName, listenerV);
    }
     
    
      
    private static JsonArrayBuilder makeSampleArray(float samples[], int dims[], JsonBuilderFactory factory)
    {
        JsonArrayBuilder samplesArr = factory.createArrayBuilder();
        if(dims.length == 1)
        {
            for(int i = 0; i < samples.length; i++)
                samplesArr.add(samples[i]);
            return samplesArr;
        }
        int sliceSize = 1;
        for(int i = 1; i < dims.length; i++)
            sliceSize *= dims[i];
        int sliceDims[] = new int[dims.length - 1];
        System.arraycopy(dims, 1, sliceDims, 0, dims.length - 1);
        for(int i = 0; i < dims[0]; i++)
        {
            float[] slice = new float[sliceSize];
            System.arraycopy(samples, i * sliceSize, slice, 0, sliceSize);
            samplesArr.add(makeSampleArray(slice, sliceDims, factory));
        }
        return samplesArr;
    }
    static java.util.Hashtable seqHash = new java.util.Hashtable() ;
    static long getSeqNumber(java.lang.String chanName)
    {
        Long seqL;
        try {
            seqL = seqHash.get(chanName);
            if(seqL == null)
                seqL = new Long(0);
        }catch(Exception exc) 
        {
            seqL = new Long(0);
        }
        seqHash.put(chanName, new Long(seqL.longValue() + 1));
        return seqL.longValue();
    }
    private static java.lang.String toJSON(int shot, java.lang.String chanName, float times[], float []samples, int samplesDim[]) 
    {
        JsonBuilderFactory factory = Json.createBuilderFactory(null);
        JsonArrayBuilder timesArr = factory.createArrayBuilder();
        for(int i = 0; i < times.length; i++)
            timesArr.add(times[i]);
        JsonArrayBuilder samplesArr = makeSampleArray(samples, samplesDim, factory);
        JsonObjectBuilder streamObj = factory.createObjectBuilder();
        streamObj.add("name", chanName);
        streamObj.add("timestamp", new Date().getTime());
        streamObj.add("seq_number", getSeqNumber(chanName));
        streamObj.add("shot", shot);
        streamObj.add("absolute_time", 0);
        streamObj.add("times", timesArr.build());
        streamObj.add("samples", samplesArr.build());
        java.lang.String jsonString = "";
        try {
            Writer writer = new StringWriter();
            Json.createWriter(writer).write(streamObj.build());
            jsonString = writer.toString();
        }catch(Exception exc)
        {
            System.out.println(exc);
         }
        return jsonString;
    }
   private static java.lang.String toJSON(int shot, java.lang.String chanName, long times[], float []samples, int samplesDim[]) 
    {
        JsonBuilderFactory factory = Json.createBuilderFactory(null);
        JsonArrayBuilder timesArr = factory.createArrayBuilder();
        for(int i = 0; i < times.length; i++)
            timesArr.add(times[i]);
        JsonArrayBuilder samplesArr = makeSampleArray(samples, samplesDim, factory);
        JsonObjectBuilder streamObj = factory.createObjectBuilder();
        streamObj.add("name", chanName);
        streamObj.add("timestamp", new Date().getTime());
        streamObj.add("seq_number", getSeqNumber(chanName));
        streamObj.add("shot", shot);
        streamObj.add("absolute_time", 1);
        streamObj.add("times", timesArr.build());
        streamObj.add("samples", samplesArr.build());
        java.lang.String jsonString = "";
        try {
            Writer writer = new StringWriter();
            Json.createWriter(writer).write(streamObj.build());
            jsonString = writer.toString();
        }catch(Exception exc)
        {
            System.out.println(exc);
         }
        return jsonString;
    }
    public static void send(int shot, java.lang.String streamName, float time, float sample)
    {
        java.lang.String payload = toJSON(shot, streamName, new float[]{time}, new float[]{sample}, new int[]{1}) ;
        seteventRaw(streamName, payload.getBytes());
    }
   public static void send(int shot, java.lang.String streamName, float time, float samples[])
    {
        java.lang.String payload = toJSON(shot, streamName, new float[]{time}, samples, new int[]{samples.length}) ;
        seteventRaw(streamName, payload.getBytes());
    }
    
    public static void send(int shot, java.lang.String streamName, long time, float sample)
    {
        java.lang.String payload = toJSON(shot, streamName, new long[]{time}, new float[]{sample}, new int[]{1}) ;
        seteventRaw(streamName, payload.getBytes());
    }
     public static void send(int shot, java.lang.String streamName, long time, float samples[])
    {
        java.lang.String payload = toJSON(shot, streamName, new long[]{time}, samples, new int[]{samples.length}) ;
        seteventRaw(streamName, payload.getBytes());
    }
    
             
    public static void send(int shot, java.lang.String streamName, long[] times, float[] samples)
    {
        java.lang.String payload = toJSON(shot, streamName, times, samples, new int[]{samples.length}) ;
        seteventRaw(streamName, payload.getBytes());
   }
   public static void send(int shot, java.lang.String streamName, float[] times, float[] samples)
    {
        java.lang.String payload = toJSON(shot, streamName, times, samples, new int[]{samples.length}) ;
        seteventRaw(streamName, payload.getBytes());
   }
   public static void send(int shot, java.lang.String streamName, long[] times, float[] samples, int samplesDim[])
    {
        java.lang.String payload = toJSON(shot, streamName, times, samples, samplesDim) ;
        seteventRaw(streamName, payload.getBytes());
   }
   public static void send(int shot, java.lang.String streamName, float[] times, float[] samples, int samplesDim[])
    {
        java.lang.String payload = toJSON(shot, streamName, times, samples, samplesDim) ;
        seteventRaw(streamName, payload.getBytes());
   }
  
    public static void send(int shot, java.lang.String streamName, Data timesD, Data samplesD)
    {
        long absTimes[];
        float relTimes[];
        float samples[];
        int samplesDim[];
        java.lang.String payload;
        try {
            if(samplesD instanceof Array)
            {
                samples = samplesD.getFloatArray();
                samplesDim = samplesD.getShape();
            }
            else
            {
                samples = new float[]{samplesD.getFloat()};
                samplesDim = new int[]{1};
            }
        
            if(timesD instanceof Uint64 )
            {
                absTimes = new long[]{timesD.getLong()};
                payload = toJSON(shot, streamName, absTimes, samples, samplesDim) ;
            }
            else if(timesD instanceof Uint64Array)
            {
                absTimes = timesD.getLongArray();
                payload = toJSON(shot, streamName, absTimes, samples, samplesDim) ;
            }
            else if (timesD instanceof Array)
            {
                relTimes = timesD.getFloatArray();
                payload = toJSON(shot, streamName, relTimes, samples, samplesDim) ;
            }
            else
            {
                relTimes = new float[]{timesD.getFloat()};
                payload = toJSON(shot, streamName, relTimes, samples, samplesDim) ;
            }
            System.out.println(payload);
            seteventRaw(streamName, payload.getBytes());
        }catch(Exception exc) //If scalar
        {
            System.out.println("Cannot send stream: " + exc);
        
        }
    }
    
    static int countArraySamples(JsonArray array)
    {
        try {
            double firstVal = array.getJsonNumber(0).doubleValue();
            return array.size();
        }catch(Exception exc){}
        //if we arrive here, it is an array of arrays
        return array.size() * countArraySamples(array.getJsonArray(0));

    }
    static int countArrayDims(JsonArray array)
    {
        try {
            double firstVal = array.getJsonNumber(0).doubleValue();
            return 1;
        }catch(Exception exc){}
        //if we arrive here, it is an array of arrays
        return countArrayDims(array.getJsonArray(0)) + 1;

    }
    static void readSamplesArr(JsonArray array, float samples[], int samplesIdx, int dims[], int dimIdx) 
    {
        dims[dimIdx] = array.size();
        try {
            for(int i = 0; i < array.size(); i++)
                samples[samplesIdx + i] = (float)array.getJsonNumber(i).doubleValue();
            return;
        }catch(Exception exc){}
        //if we arrive here, it is an array of arrays
        int sliceSamples = countArraySamples(array.getJsonArray(0));
        for(int i = 0; i < array.size(); i++)
            readSamplesArr(array.getJsonArray(i), samples, samplesIdx + i * sliceSamples, dims, dimIdx - 1);
    }
    
    private void handleEventJSON(java.lang.String evString)
    {
        JsonReader reader = Json.createReader(new StringReader(evString));
        JsonObject evObj = reader.readObject();
        int shot = evObj.getInt("shot");
        java.lang.String streamName = evObj.getString("name");
        boolean isAbsTime = evObj.getInt("absolute_time") == 1;
        JsonArray samplesArr = evObj.getJsonArray("samples");
        JsonArray timesArr = evObj.getJsonArray("times");
        float samples[] = new float[countArraySamples(samplesArr)];
        int dims[] = new int[countArrayDims(samplesArr)];
        readSamplesArr(samplesArr, samples, 0, dims, dims.length - 1); 
        Data samplesD;
        if(samples.length == 1)
            samplesD = new Float32(samples[0]);
        else
        {
            try {
                samplesD = new Float32Array(samples, dims);
            }catch(Exception exc)
            {
                System.out.println("Wrong sample array in data stream");
                return;
            }
        }
        Data timesD;
        if (isAbsTime)
        {
            long times[] = new long[timesArr.size()];
            for(int i = 0; i < timesArr.size(); i++)
                times[i] = timesArr.getJsonNumber(i).longValue();
            if(times.length == 1)
                timesD = new Uint64(times[0]);
            else
                timesD = new Uint64Array(times);
        }
        else
        {
            float times[] = new float[timesArr.size()];
            for(int i = 0; i < timesArr.size(); i++)
                times[i] = (float)timesArr.getJsonNumber(i).doubleValue();
            if(times.length == 1)
                timesD = new Float32(times[0]);
            else
                timesD = new Float32Array(times);
        }
        Vectorlisteners = listenerHash.get(streamName);
        for(int i = 0; i < listeners.size(); i++)
            listeners.elementAt(i).dataReceived(streamName, shot,timesD, samplesD);
   }
    public synchronized void run()
    {
        java.lang.String evName = getName();
        byte[] rawMsg = getRaw();
        java.lang.String evMessage = new java.lang.String(rawMsg);
        if(evMessage.charAt(0) == '{')
        {
            handleEventJSON(evMessage);
            return;
        }
        int byteIdx = 0;
        if(debug) System.out.println(evMessage);
        StringTokenizer st = new StringTokenizer(evMessage);
        try {
            java.lang.String currStr = st.nextToken();
            byteIdx = currStr.length() + 1; //A single blank between header fields
            int shot = Integer.parseInt(currStr);
            java.lang.String streamName = st.nextToken();
            byteIdx += streamName.length() + 1; 
            Vectorlisteners = listenerHash.get(streamName);
            if(listeners != null && listeners.size() > 0)
            {
                java.lang.String mode = st.nextToken();
                byteIdx += 2;
                currStr = st.nextToken();
                byteIdx += currStr.length() + 1;
                int numSamples = Integer.parseInt(currStr);
                if(mode.equals("B")) //Serialized times and values
                {
                    byte [] serTimes = new byte[numSamples];
                    byte [] serSamples = new byte[rawMsg.length - byteIdx - numSamples];
                    System.arraycopy(rawMsg, byteIdx, serTimes, 0, numSamples);
                    System.arraycopy(rawMsg, byteIdx + numSamples, serSamples, 0, rawMsg.length - byteIdx - numSamples);
                    Data timesD = Data.deserialize(serTimes);
                    Data samplesD = Data.deserialize(serSamples);
                    for(int i = 0; i < listeners.size(); i++)
                        listeners.elementAt(i).dataReceived(streamName, shot,timesD, samplesD);
                    return; //All done
                }
                if(numSamples == 1)
                {
                    Data timeD, sampleD;
                    if(mode.equals("A") || mode.equals("F")) //Float times
                        timeD = new Float32(Float.parseFloat(st.nextToken()));
                    else
                        timeD = new Uint64(Long.parseLong(st.nextToken()));
                    sampleD = new Float32(Float.parseFloat(st.nextToken()));
                    for(int i = 0; i < listeners.size(); i++)
                    {
                        DataStreamListener listener = listeners.elementAt(i);
                        listener.dataReceived(streamName, shot,timeD, sampleD);
                    }
                }
                else
                {
                    Data timesD, samplesD;
                    if(mode.equals("A") || mode.equals("F"))
                    {
                        float times[] = new float[numSamples];
                        for(int i = 0; i < numSamples; i++)
                            times[i] = Float.parseFloat(st.nextToken());
                        timesD = new Float32Array(times);
                    }
                    else
                    {
                        long times[] = new long[numSamples];
                        for(int i = 0; i < numSamples; i++)
                            times[i] = Long.parseLong(st.nextToken());
                        timesD = new Uint64Array(times);
                    }
                    float samples[] = new float[numSamples];
                    for(int i = 0; i < numSamples; i++)
                        samples[i] = Float.parseFloat(st.nextToken());
                    samplesD = new Float32Array(samples);
                    for(int i = 0; i < listeners.size(); i++)
                        listeners.elementAt(i).dataReceived(streamName, shot,timesD, samplesD);
                    
                }
            }
       }catch(Exception exc)
       {
           System.out.println("Error getting data from stream: "+exc);
       }
    }
    public static void main(java.lang.String args[])
    {
 /*      try {
            EventStream es = new EventStream("CH1");
            es.registerListener(new DataStreamListener() {
                public void dataReceived(java.lang.String streamName, int shot, Data times, Data samples)
                {
                    System.out.println(streamName+" Time: "+times + "Sample: " + samples);
                }
            });
            Thread.currentThread().sleep(1000000);
        }catch(Exception exc){System.out.println(exc);}
 */     
   try {
   EventStream.send(0, "Channel1", new Float32Array(new float[]{0,1}),new Float32Array(new float[]{10,20, 30, 40, 50, 60}, new int[]{2,3}));   
 /*   EventStream.send(0, "Channel2", new Uint64Array(new long[]{0,1}),new Float32Array(new float[]{10,20}));   
    EventStream.send(0, "Channel3", new Uint64(123),new Float32Array(new float[]{10,20}));   
    EventStream.send(0, "Channel4", new Float32(666),new Float32Array(new float[]{10,20}));   
    EventStream.send(0, "Channel5", new Float32(666),new Float32(212));   */ 
   }catch(Exception exc){System.out.println(exc);}
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy