Example usage for java.nio ByteBuffer clear

List of usage examples for java.nio ByteBuffer clear

Introduction

In this page you can find the example usage for java.nio ByteBuffer clear.

Prototype

public final Buffer clear() 

Source Link

Document

Clears this buffer.

Usage

From source file:edu.hawaii.soest.kilonalu.dvp2.DavisWxSource.java

/**
 * A method that executes the streaming of data from the source to the RBNB
 * server after all configuration of settings, connections to hosts, and
 * thread initiatizing occurs.  This method contains the detailed code for 
 * streaming the data and interpreting the stream.
 *///from w  w w .  jav a 2 s  .  co  m
protected boolean execute() {
    logger.debug("DavisWxSource.execute() called.");
    // do not execute the stream if there is no connection
    if (!isConnected())
        return false;

    boolean failed = false;

    // while data are being sent, read them into the buffer
    try {

        this.socketChannel = getSocketConnection();

        // create four byte placeholders used to evaluate up to a four-byte 
        // window.  The FIFO layout looks like:
        //           -------------------------
        //   in ---> | One | Two |Three|Four |  ---> out
        //           -------------------------
        byte byteOne = 0x00, // set initial placeholder values
                byteTwo = 0x00, byteThree = 0x00, byteFour = 0x00;

        // Create a buffer that will store the sample bytes as they are read
        ByteBuffer sampleBuffer = ByteBuffer.allocate(getBufferSize());

        // create a byte buffer to store bytes from the TCP stream
        ByteBuffer buffer = ByteBuffer.allocateDirect(getBufferSize());

        // add a channel of data that will be pushed to the server.  
        // Each sample will be sent to the Data Turbine as an rbnb frame.
        ChannelMap rbnbChannelMap = new ChannelMap();
        int channelIndex = 0;

        // add the raw binary LOOP packet data
        //channelIndex = rbnbChannelMap.Add(getRBNBChannelName());
        //rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the barTrendAsString field data
        channelIndex = rbnbChannelMap.Add("barTrendAsString"); // Falling Slowly
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the barometer field data
        channelIndex = rbnbChannelMap.Add("barometer"); // 29.9
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch Hg");

        // add the insideTemperature field data
        channelIndex = rbnbChannelMap.Add("insideTemperature"); // 83.9
        rbnbChannelMap.PutUserInfo(channelIndex, "units=degrees F");

        // add the insideHumidity field data
        channelIndex = rbnbChannelMap.Add("insideHumidity"); // 51
        rbnbChannelMap.PutUserInfo(channelIndex, "units=percent");

        // add the outsideTemperature field data
        channelIndex = rbnbChannelMap.Add("outsideTemperature"); // 76.7
        rbnbChannelMap.PutUserInfo(channelIndex, "units=degrees F");

        // add the windSpeed field data
        channelIndex = rbnbChannelMap.Add("windSpeed"); // 5
        rbnbChannelMap.PutUserInfo(channelIndex, "units=mph");

        // add the tenMinuteAverageWindSpeed field data
        channelIndex = rbnbChannelMap.Add("tenMinuteAverageWindSpeed"); // 4
        rbnbChannelMap.PutUserInfo(channelIndex, "units=mph");

        // add the windDirection field data
        channelIndex = rbnbChannelMap.Add("windDirection"); // 80
        rbnbChannelMap.PutUserInfo(channelIndex, "units=degrees");

        // add the outsideHumidity field data
        channelIndex = rbnbChannelMap.Add("outsideHumidity"); // 73
        rbnbChannelMap.PutUserInfo(channelIndex, "units=percent");

        // add the rainRate field data
        channelIndex = rbnbChannelMap.Add("rainRate"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch/hour");

        // add the uvRadiation field data
        channelIndex = rbnbChannelMap.Add("uvRadiation"); // 0
        rbnbChannelMap.PutUserInfo(channelIndex, "UV index");

        // add the solarRadiation field data
        channelIndex = rbnbChannelMap.Add("solarRadiation"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "watt/m^2");

        // add the stormRain field data
        channelIndex = rbnbChannelMap.Add("stormRain"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "inch");

        // add the currentStormStartDate field data
        channelIndex = rbnbChannelMap.Add("currentStormStartDate"); // -1--1-1999
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the dailyRain field data
        channelIndex = rbnbChannelMap.Add("dailyRain"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the monthlyRain field data
        channelIndex = rbnbChannelMap.Add("monthlyRain"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the yearlyRain field data
        channelIndex = rbnbChannelMap.Add("yearlyRain"); // 15.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the dailyEvapoTranspiration field data
        channelIndex = rbnbChannelMap.Add("dailyEvapoTranspiration"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the monthlyEvapoTranspiration field data
        channelIndex = rbnbChannelMap.Add("monthlyEvapoTranspiration"); // 0.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the yearlyEvapoTranspiration field data
        channelIndex = rbnbChannelMap.Add("yearlyEvapoTranspiration"); // 93.0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=inch");

        // add the transmitterBatteryStatus field data
        channelIndex = rbnbChannelMap.Add("transmitterBatteryStatus"); // 0
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the consoleBatteryVoltage field data
        channelIndex = rbnbChannelMap.Add("consoleBatteryVoltage"); // 4.681640625
        rbnbChannelMap.PutUserInfo(channelIndex, "units=volts");

        // add the forecastAsString field data
        channelIndex = rbnbChannelMap.Add("forecastAsString"); // Partially Cloudy
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the forecastRuleNumberAsString field data
        //channelIndex = rbnbChannelMap.Add("forecastRuleNumberAsString");      // Increasing clouds with little temperature change.
        //rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the timeOfSunrise field data
        channelIndex = rbnbChannelMap.Add("timeOfSunrise"); // 05:49
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // add the timeOfSunset field data
        channelIndex = rbnbChannelMap.Add("timeOfSunset"); // 19:11
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        channelIndex = rbnbChannelMap.Add("DecimalASCIISampleData"); // sample data as ASCII
        rbnbChannelMap.PutUserInfo(channelIndex, "units=none");

        // register the channel map of variables and units with the DataTurbine
        getSource().Register(rbnbChannelMap);
        // reset variables for use with the incoming data
        rbnbChannelMap.Clear();
        channelIndex = 0;

        // wake the instrument with an initial '\n' command
        this.command = this.commandSuffix;
        this.sentCommand = queryInstrument(this.command);

        // allow time for the instrument response
        streamingThread.sleep(2000);
        this.command = this.commandPrefix + this.takeSampleCommand + this.commandSuffix;
        this.sentCommand = queryInstrument(command);

        // while there are bytes to read from the socket ...
        while (this.socketChannel.read(buffer) != -1 || buffer.position() > 0) {
            // prepare the buffer for reading
            buffer.flip();

            // while there are unread bytes in the ByteBuffer
            while (buffer.hasRemaining()) {
                byteOne = buffer.get();
                //logger.debug("b1: " + new String(Hex.encodeHex((new byte[]{byteOne})))   + "\t" + 
                //             "b2: " + new String(Hex.encodeHex((new byte[]{byteTwo})))   + "\t" + 
                //             "b3: " + new String(Hex.encodeHex((new byte[]{byteThree}))) + "\t" + 
                //             "b4: " + new String(Hex.encodeHex((new byte[]{byteFour})))  + "\t" +
                //             "sample pos: "   + sampleBuffer.position()                  + "\t" +
                //             "sample rem: "   + sampleBuffer.remaining()                 + "\t" +
                //             "sample cnt: "   + sampleByteCount                          + "\t" +
                //             "buffer pos: "   + buffer.position()                        + "\t" +
                //             "buffer rem: "   + buffer.remaining()                       + "\t" +
                //             "state: "        + state
                //);

                // Use a State Machine to process the byte stream.
                // Start building an rbnb frame for the entire sample, first by 
                // inserting a timestamp into the channelMap.  This time is merely
                // the time of insert into the data turbine, not the time of
                // observations of the measurements.  That time should be parsed out
                // of the sample in the Sink client code

                switch (state) {

                case 0:

                    // sample line is begun by "ACK L" (the first part of ACK + "LOOP")
                    // note bytes are in reverse order in the FIFO window
                    if (byteOne == 0x4C && byteTwo == 0x06) {

                        sampleByteCount++; // add the last byte found to the count

                        // add the last byte found to the sample buffer
                        if (sampleBuffer.remaining() > 0) {
                            sampleBuffer.put(byteOne);

                        } else {
                            sampleBuffer.compact();
                            sampleBuffer.put(byteOne);

                        }

                        // we've found the beginning of a sample, move on
                        state = 1;
                        break;

                    } else {
                        break;
                    }

                case 1: // read the rest of the bytes to the next EOL characters

                    // sample line is terminated by "\n\r"
                    // note bytes are in reverse order in the FIFO window
                    if (byteOne == 0x0D && byteTwo == 0x0A) {

                        sampleByteCount++; // add the last byte found to the count

                        // add the last byte found to the sample buffer
                        if (sampleBuffer.remaining() > 0) {
                            sampleBuffer.put(byteOne);

                        } else {
                            sampleBuffer.compact();
                            sampleBuffer.put(byteOne);

                        }
                        state = 3;
                        break;
                    } else { // not 0x0A0D

                        // still in the middle of the sample, keep adding bytes
                        sampleByteCount++; // add each byte found

                        if (sampleBuffer.remaining() > 0) {
                            sampleBuffer.put(byteOne);
                        } else {
                            sampleBuffer.compact();
                            logger.debug("Compacting sampleBuffer ...");
                            sampleBuffer.put(byteOne);

                        }

                        break;
                    } // end if for 0x0A0D EOL

                case 3:

                    // At this point, we've found the \n\r delimiter, read the first
                    // of 2 CRC bytes
                    sampleByteCount++; // add the last byte found to the count

                    // add the last byte found to the sample buffer
                    if (sampleBuffer.remaining() > 0) {
                        sampleBuffer.put(byteOne);

                    } else {
                        sampleBuffer.compact();
                        sampleBuffer.put(byteOne);

                    }
                    state = 4;
                    break;

                case 4:

                    // At this point, we've found the \n\r delimiter, read the second
                    // of 2 CRC bytes
                    sampleByteCount++; // add the last byte found to the count

                    // add the last byte found to the sample buffer
                    if (sampleBuffer.remaining() > 0) {
                        sampleBuffer.put(byteOne);

                    } else {
                        sampleBuffer.compact();
                        sampleBuffer.put(byteOne);

                    }
                    state = 0;

                    // extract just the length of the sample bytes out of the
                    // sample buffer, and place it in the channel map as a 
                    // byte array.  Then, send it to the data turbine.
                    byte[] sampleArray = new byte[sampleByteCount];

                    try {
                        sampleBuffer.flip();
                        sampleBuffer.get(sampleArray);

                        // parse and send the sample to the data turbine
                        this.davisWxParser = new DavisWxParser(sampleBuffer);

                    } catch (java.lang.Exception e) {
                        logger.info(
                                "There was a problem parsing the binary weather LOOP packet. Skipping this sample.");
                        byteOne = 0x00;
                        byteTwo = 0x00;
                        byteThree = 0x00;
                        byteFour = 0x00;
                        sampleBuffer.clear();
                        sampleByteCount = 0;
                        rbnbChannelMap.Clear();
                        break;
                    }

                    // create a character string to store characters from the TCP stream
                    StringBuilder decimalASCIISampleData = new StringBuilder();

                    rbnbChannelMap.PutTimeAuto("server");

                    // add the raw binary LOOP packet data
                    //channelIndex = rbnbChannelMap.Add(getRBNBChannelName());
                    //rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    //rbnbChannelMap.PutDataAsByteArray(channelIndex, sampleArray);         // raw binary LOOP packet

                    // add the barTrendAsString field data
                    channelIndex = rbnbChannelMap.Add("barTrendAsString"); // Falling Slowly
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, davisWxParser.getBarTrendAsString());
                    decimalASCIISampleData.append(
                            String.format("\"%16s\"", (Object) davisWxParser.getBarTrendAsString()) + ", ");

                    // add the packetType field to the ASCII string only
                    decimalASCIISampleData.append(
                            String.format("%1d", (Object) new Integer(davisWxParser.getPacketType())) + ", ");

                    // add the nextRecord field to the ASCII string only
                    decimalASCIISampleData.append(
                            String.format("%04d", (Object) new Integer(davisWxParser.getNextRecord())) + ", ");

                    // add the barometer field data
                    channelIndex = rbnbChannelMap.Add("barometer"); // 29.9
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex, new float[] { davisWxParser.getBarometer() });
                    decimalASCIISampleData.append(
                            String.format("%06.4f", (Object) new Float(davisWxParser.getBarometer())) + ", ");

                    // add the insideTemperature field data
                    channelIndex = rbnbChannelMap.Add("insideTemperature"); // 83.9
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getInsideTemperature() });
                    decimalASCIISampleData.append(
                            String.format("%05.2f", (Object) new Float(davisWxParser.getInsideTemperature()))
                                    + ", ");

                    // add the insideHumidity field data
                    channelIndex = rbnbChannelMap.Add("insideHumidity"); // 51
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex,
                            new int[] { davisWxParser.getInsideHumidity() });
                    decimalASCIISampleData.append(
                            String.format("%03d", (Object) new Integer(davisWxParser.getInsideHumidity()))
                                    + ", ");

                    // add the outsideTemperature field data
                    channelIndex = rbnbChannelMap.Add("outsideTemperature"); // 76.7
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getOutsideTemperature() });
                    decimalASCIISampleData.append(
                            String.format("%05.2f", (Object) new Float(davisWxParser.getOutsideTemperature()))
                                    + ", ");

                    // add the windSpeed field data
                    channelIndex = rbnbChannelMap.Add("windSpeed"); // 5
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex, new int[] { davisWxParser.getWindSpeed() });
                    decimalASCIISampleData.append(
                            String.format("%03d", (Object) new Integer(davisWxParser.getWindSpeed())) + ", ");

                    // add the tenMinuteAverageWindSpeed field data
                    channelIndex = rbnbChannelMap.Add("tenMinuteAverageWindSpeed"); // 4
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex,
                            new int[] { davisWxParser.getTenMinuteAverageWindSpeed() });
                    decimalASCIISampleData.append(String.format("%03d",
                            (Object) new Integer(davisWxParser.getTenMinuteAverageWindSpeed())) + ", ");

                    // add the windDirection field data
                    channelIndex = rbnbChannelMap.Add("windDirection"); // 80
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex, new int[] { davisWxParser.getWindDirection() });
                    decimalASCIISampleData.append(
                            String.format("%03d", (Object) new Integer(davisWxParser.getWindDirection()))
                                    + ", ");

                    // add the extraTemperature fields as ASCII only
                    float[] extraTemperatures = davisWxParser.getExtraTemperatures();
                    for (float temperature : extraTemperatures) {
                        decimalASCIISampleData
                                .append(String.format("%05.2f", (Object) new Float(temperature)) + ", ");

                    }

                    // add the soilTemperature fields as ASCII only
                    float[] soilTemperatures = davisWxParser.getSoilTemperatures();
                    for (float soil : soilTemperatures) {
                        decimalASCIISampleData.append(String.format("%05.2f", (Object) new Float(soil)) + ", ");

                    }

                    // add the leafTemperature fields as ASCII only
                    float[] leafTemperatures = davisWxParser.getLeafTemperatures();
                    for (float leaf : leafTemperatures) {
                        decimalASCIISampleData.append(String.format("%05.2f", (Object) new Float(leaf)) + ", ");

                    }

                    // add the outsideHumidity field data
                    channelIndex = rbnbChannelMap.Add("outsideHumidity"); // 73
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex,
                            new int[] { davisWxParser.getOutsideHumidity() });
                    decimalASCIISampleData.append(
                            String.format("%03d", (Object) new Integer(davisWxParser.getOutsideHumidity()))
                                    + ", ");

                    // add the rainRate field data
                    channelIndex = rbnbChannelMap.Add("rainRate"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex, new float[] { davisWxParser.getRainRate() });
                    decimalASCIISampleData.append(
                            String.format("%04.2f", (Object) new Float(davisWxParser.getRainRate())) + ", ");

                    // add the uvRadiation field data
                    channelIndex = rbnbChannelMap.Add("uvRadiation"); // 0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsInt32(channelIndex, new int[] { davisWxParser.getUvRadiation() });
                    decimalASCIISampleData.append(
                            String.format("%03d", (Object) new Integer(davisWxParser.getUvRadiation())) + ", ");

                    // add the solarRadiation field data
                    channelIndex = rbnbChannelMap.Add("solarRadiation"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getSolarRadiation() });
                    decimalASCIISampleData.append(
                            String.format("%04.1f", (Object) new Float(davisWxParser.getSolarRadiation()))
                                    + ", ");

                    // add the stormRain field data
                    channelIndex = rbnbChannelMap.Add("stormRain"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex, new float[] { davisWxParser.getStormRain() });
                    decimalASCIISampleData.append(
                            String.format("%04.2f", (Object) new Float(davisWxParser.getStormRain())) + ", ");

                    // add the currentStormStartDate field data
                    channelIndex = rbnbChannelMap.Add("currentStormStartDate"); // -1--1-1999
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, davisWxParser.getCurrentStormStartDate());
                    decimalASCIISampleData.append(
                            String.format("%10s", (Object) davisWxParser.getCurrentStormStartDate()) + ", ");

                    // add the dailyRain field data
                    channelIndex = rbnbChannelMap.Add("dailyRain"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex, new float[] { davisWxParser.getDailyRain() });
                    decimalASCIISampleData.append(
                            String.format("%04.2f", (Object) new Float(davisWxParser.getDailyRain())) + ", ");

                    // add the monthlyRain field data
                    channelIndex = rbnbChannelMap.Add("monthlyRain"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getMonthlyRain() });
                    decimalASCIISampleData.append(
                            String.format("%04.2f", (Object) new Float(davisWxParser.getMonthlyRain())) + ", ");

                    // add the yearlyRain field data
                    channelIndex = rbnbChannelMap.Add("yearlyRain"); // 15.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getYearlyRain() });
                    decimalASCIISampleData.append(
                            String.format("%04.2f", (Object) new Float(davisWxParser.getYearlyRain())) + ", ");

                    // add the dailyEvapoTranspiration field data
                    channelIndex = rbnbChannelMap.Add("dailyEvapoTranspiration"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getDailyEvapoTranspiration() });
                    decimalASCIISampleData.append(String.format("%04.2f",
                            (Object) new Float(davisWxParser.getDailyEvapoTranspiration())) + ", ");

                    // add the monthlyEvapoTranspiration field data
                    channelIndex = rbnbChannelMap.Add("monthlyEvapoTranspiration"); // 0.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getMonthlyEvapoTranspiration() });
                    decimalASCIISampleData.append(String.format("%04.2f",
                            (Object) new Float(davisWxParser.getMonthlyEvapoTranspiration())) + ", ");

                    // add the yearlyEvapoTranspiration field data
                    channelIndex = rbnbChannelMap.Add("yearlyEvapoTranspiration"); // 93.0
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getYearlyEvapoTranspiration() });
                    decimalASCIISampleData.append(String.format("%04.2f",
                            (Object) new Float(davisWxParser.getYearlyEvapoTranspiration())) + ", ");

                    // add the consoleBatteryVoltage field data
                    channelIndex = rbnbChannelMap.Add("consoleBatteryVoltage"); // 4.681640625
                    rbnbChannelMap.PutMime(channelIndex, "application/octet-stream");
                    rbnbChannelMap.PutDataAsFloat32(channelIndex,
                            new float[] { davisWxParser.getConsoleBatteryVoltage() });
                    decimalASCIISampleData.append(String.format("%04.2f",
                            (Object) new Float(davisWxParser.getConsoleBatteryVoltage())) + ", ");

                    // add the forecastAsString field data
                    channelIndex = rbnbChannelMap.Add("forecastAsString"); // Partially Cloudy
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, davisWxParser.getForecastAsString());
                    decimalASCIISampleData.append(
                            String.format("\"%47s\"", (Object) davisWxParser.getForecastAsString()) + ", ");

                    // add the forecastRuleNumberAsString field data as ASCII only
                    decimalASCIISampleData.append(
                            String.format("\"%167s\"", (Object) davisWxParser.getForecastRuleNumberAsString())
                                    + ", ");

                    // add the timeOfSunrise field data
                    channelIndex = rbnbChannelMap.Add("timeOfSunrise"); // 05:49
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, davisWxParser.getTimeOfSunrise());
                    decimalASCIISampleData
                            .append(String.format("%5s", (Object) davisWxParser.getTimeOfSunrise()) + ", ");

                    // add the timeOfSunset field data
                    channelIndex = rbnbChannelMap.Add("timeOfSunset"); // 19:11
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, davisWxParser.getTimeOfSunset());
                    decimalASCIISampleData
                            .append(String.format("%5s", (Object) davisWxParser.getTimeOfSunset()) + ", ");

                    // then add a timestamp to the end of the sample
                    DATE_FORMAT.setTimeZone(TZ);
                    String sampleDateAsString = DATE_FORMAT.format(new Date()).toString();
                    decimalASCIISampleData.append(sampleDateAsString);
                    decimalASCIISampleData.append("\n");

                    // add the ASCII CSV string of selected fields as a channel
                    channelIndex = rbnbChannelMap.Add(getRBNBChannelName()); // 19:11
                    rbnbChannelMap.PutMime(channelIndex, "text/plain");
                    rbnbChannelMap.PutDataAsString(channelIndex, decimalASCIISampleData.toString());

                    // finally, send the channel map of data to the DataTurbine
                    getSource().Flush(rbnbChannelMap);
                    String sampleString = new String(Hex.encodeHex(sampleArray));
                    logger.info("Sample: " + sampleString);
                    logger.debug("barTrendAsString:               " + davisWxParser.getBarTrendAsString());
                    logger.debug("barometer:                      " + davisWxParser.getBarometer());
                    logger.debug("insideTemperature:              " + davisWxParser.getInsideTemperature());
                    logger.debug("insideHumidity:                 " + davisWxParser.getInsideHumidity());
                    logger.debug("outsideTemperature:             " + davisWxParser.getOutsideTemperature());
                    logger.debug("windSpeed:                      " + davisWxParser.getWindSpeed());
                    logger.debug(
                            "tenMinuteAverageWindSpeed:      " + davisWxParser.getTenMinuteAverageWindSpeed());
                    logger.debug("windDirection:                  " + davisWxParser.getWindDirection());
                    logger.debug("outsideHumidity:                " + davisWxParser.getOutsideHumidity());
                    logger.debug("rainRate:                       " + davisWxParser.getRainRate());
                    logger.debug("uvRadiation:                    " + davisWxParser.getUvRadiation());
                    logger.debug("solarRadiation:                 " + davisWxParser.getSolarRadiation());
                    logger.debug("stormRain:                      " + davisWxParser.getStormRain());
                    logger.debug("currentStormStartDate:          " + davisWxParser.getCurrentStormStartDate());
                    logger.debug("dailyRain:                      " + davisWxParser.getDailyRain());
                    logger.debug("monthlyRain:                    " + davisWxParser.getMonthlyRain());
                    logger.debug("yearlyRain:                     " + davisWxParser.getYearlyRain());
                    logger.debug(
                            "dailyEvapoTranspiration:        " + davisWxParser.getDailyEvapoTranspiration());
                    logger.debug(
                            "monthlyEvapoTranspiration:      " + davisWxParser.getMonthlyEvapoTranspiration());
                    logger.debug(
                            "yearlyEvapoTranspiration:       " + davisWxParser.getYearlyEvapoTranspiration());
                    logger.debug("transmitterBatteryStatus:       "
                            + Arrays.toString(davisWxParser.getTransmitterBatteryStatus()));
                    logger.debug("consoleBatteryVoltage:          " + davisWxParser.getConsoleBatteryVoltage());
                    logger.debug("forecastAsString:               " + davisWxParser.getForecastAsString());
                    //logger.debug("forecastRuleNumberAsString:     " + davisWxParser.getForecastRuleNumberAsString());
                    logger.debug("timeOfSunrise:                  " + davisWxParser.getTimeOfSunrise());
                    logger.debug("timeOfSunset:                   " + davisWxParser.getTimeOfSunset());
                    logger.info(" flushed data to the DataTurbine. ");

                    byteOne = 0x00;
                    byteTwo = 0x00;
                    byteThree = 0x00;
                    byteFour = 0x00;
                    sampleBuffer.clear();
                    sampleByteCount = 0;
                    rbnbChannelMap.Clear();
                    //logger.debug("Cleared b1,b2,b3,b4. Cleared sampleBuffer. Cleared rbnbChannelMap.");
                    //state = 0;

                    // Once the sample is flushed, take a new sample
                    // allow time for the instrument response
                    streamingThread.sleep(2000);
                    this.command = this.commandPrefix + this.takeSampleCommand + this.commandSuffix;
                    this.sentCommand = queryInstrument(command);

                } // end switch statement

                // shift the bytes in the FIFO window
                byteFour = byteThree;
                byteThree = byteTwo;
                byteTwo = byteOne;

            } //end while (more unread bytes)

            // prepare the buffer to read in more bytes from the stream
            buffer.compact();

        } // end while (more socket bytes to read)
        this.socketChannel.close();

    } catch (IOException e) {
        // handle exceptions
        // In the event of an i/o exception, log the exception, and allow execute()
        // to return false, which will prompt a retry.
        failed = true;
        e.printStackTrace();
        return !failed;
    } catch (SAPIException sapie) {
        // In the event of an RBNB communication  exception, log the exception, 
        // and allow execute() to return false, which will prompt a retry.
        failed = true;
        sapie.printStackTrace();
        return !failed;
    } catch (java.lang.InterruptedException ine) {
        failed = true;
        ine.printStackTrace();
        return !failed;

    }

    return !failed;
}

From source file:com.linkedin.databus.core.DbusEventBuffer.java

private int readEventsInternal(ReadableByteChannel readChannel,
        Iterable<InternalDatabusEventsListener> eventListeners, DbusEventsStatisticsCollector statsCollector)
        throws InvalidEventException {
    final boolean logDebugEnabled = _log.isDebugEnabled();

    ReadEventsReadPosition readPos = new ReadEventsReadPosition();
    ReadEventsWritePosition writePos = new ReadEventsWritePosition();

    _readBufferLock.lock();//ww w  . ja v a2s . co m
    try {
        _eventState = WindowState.IN_READ;

        boolean mightHaveMoreData = true;
        //ensuring index is updated correctly if a control event of preceding window doesn't appear
        //first (no start() called)
        if (_scnIndex.isEnabled() && _scnIndex.isEmpty()) {
            _scnIndex.setUpdateOnNext(true);
        }
        try {
            while (mightHaveMoreData) {
                final ByteBuffer readBuffer = readPos.getReadBuffer();
                boolean success = readEventsFromChannel(readChannel, readBuffer, logDebugEnabled);
                readPos.startIteration();

                final int numBytesRead = readPos.bytesRemaining();

                //if there is an error we'll try to process whatever was read but stop after that
                mightHaveMoreData = success && (numBytesRead > 0)
                        && (readBuffer.position() == readBuffer.limit());

                if (numBytesRead > 0) {
                    _queueLock.lock();
                    try {
                        if (isClosed()) {
                            LOG.warn(
                                    "stopping attempt to read more events into a buffer while it is closed. readPos="
                                            + readPos + "; buf=" + this.toString());
                            return 0;
                        }
                        try {
                            _scnIndex.assertHeadPosition(_head.getRealPosition());
                            _bufferPositionParser.assertSpan(_head.getPosition(),
                                    _currentWritePosition.getPosition(), logDebugEnabled);
                        } catch (RuntimeException re) {
                            _log.fatal("Got runtime Exception :", re);
                            _log.fatal("Event Buffer is :" + toString());
                            _scnIndex.printVerboseString(_log, Level.DEBUG);
                            throw re;
                        }

                        readBuffer.flip();
                        boolean hasMoreInStgBuffer = true;
                        while (hasMoreInStgBuffer && readPos.hasNext()) {
                            writePos.startNewIteration();

                            //figure out the boundary of events at which we can write
                            //leave one byte at the end, to distinguish between a finalized full ByteBuffer
                            //(limit <= capacity - 1) and a ByteBuffer that is still being written to
                            //(limit == capacity)
                            final int contiguousCapacity = writePos.getCurBuf().capacity()
                                    - writePos.getCurOfs() - 1;

                            final ReadEventsScanStatus eventScanStatus = readPos.startEventProcessing();
                            switch (eventScanStatus) {
                            case OK: {
                                final int curEventSize = readPos.getCurEvent().size();
                                if (readPos.bytesProcessed() + curEventSize > contiguousCapacity) {
                                    //not enough space to fit event in the target buffer
                                    if (0 == writePos.getCurOfs()) {
                                        //event bigger than the ByteBuffer capacity
                                        throw new InvalidEventException("event too big to fit into buffer"
                                                + "; size:" + curEventSize + "; event:" + readPos.getCurEvent()
                                                + "; " + readPos + "; buffer.capacity:"
                                                + writePos.getCurBuf().capacity());
                                    } else {
                                        if (logDebugEnabled)
                                            _log.debug("unable to fit event with size "
                                                    + readPos.getCurEvent().size());

                                        //if we could not fit all the data in the destination ByteBuffer,
                                        //we should ensure that we clear up any remaining data in the
                                        //ByteBuffer.
                                        long nextBufferPos = _bufferPositionParser
                                                .incrementIndex(writePos.getCurPos(), _buffers);
                                        boolean interrupted = ensureFreeSpace(writePos.getCurPos(),
                                                nextBufferPos, logDebugEnabled);
                                        if (interrupted) {
                                            _log.warn("ensureFree space interrupted: " + readPos + " "
                                                    + writePos);
                                            return readPos.getNumReadEvents();
                                        }
                                        assert assertBuffersLimits();

                                        writePos.moveToNextBuffer();
                                        _tail.copy(_currentWritePosition);
                                        assert assertBuffersLimits();
                                    }
                                } else {
                                    //we can fit the event in the target buffer
                                    readPos.eventAccepted(); //done with processing in the stg buffer

                                    //how are we on free space?
                                    boolean interrupted = ensureFreeSpace(writePos.getCurPos(),
                                            writePos.getCurPos() + curEventSize, logDebugEnabled);
                                    if (interrupted) {
                                        _log.warn("ensureFree space interrupted:" + readPos + " " + writePos);
                                        return readPos.getNumReadEvents();
                                    }

                                    writePos.determineWriteEnd(readPos);

                                    //we are good on free space, about time to copy the damn data
                                    copyReadEventToEventBuffer(readPos, writePos, eventListeners,
                                            statsCollector, logDebugEnabled);
                                }
                                break;
                            }
                            case PARTIAL_EVENT: {
                                final int curCapacity = readBuffer.capacity();
                                if (logDebugEnabled)
                                    _log.debug("partial event at " + readPos);
                                if (0 != readPos.getReadStart()) {
                                    //compact stg buffer and try to read more data from the network
                                    compactStgBuffer(readPos, logDebugEnabled);
                                    hasMoreInStgBuffer = false;
                                } else if (curCapacity >= getMaxReadBufferCapacity()) {
                                    //we couldn't read an entire event in the staging buffer and we are already
                                    //at max allowed size of the read buffer
                                    throw new InvalidEventException(
                                            "event too big to fit in staging buffer with capacity : "
                                                    + curCapacity + "; readPos:" + readPos
                                                    + "; consider increasing connectionDefaults.eventBuffer.maxSize"
                                                    + " or connectionDefaults.eventBuffer.maxEventSize if set explicitly.");
                                } else {
                                    //grow the staging buffer faster for small sizes and slower for big sizes
                                    //intuitively: <= 5K - 3x, 25K - 2x, 125K - 1.6x, 625K - 1.5x and so on
                                    final double growFactor = curCapacity <= 5 * 1024 ? 3.0
                                            : 1.0 + 2.0 * LN_5 / Math.log(curCapacity / 1024.0);
                                    final int newSize = Math.min(getMaxReadBufferCapacity(),
                                            (int) (growFactor * curCapacity));
                                    if (newSize < curCapacity) {
                                        throw new DatabusRuntimeException("unexpected readbuffer size: "
                                                + newSize + "; readBuffer=" + readBuffer
                                                + "; readBufferCapacity=" + getMaxReadBufferCapacity());
                                    }
                                    readPos.growReadBuffer(newSize);
                                    hasMoreInStgBuffer = false;
                                }
                                break;
                            }
                            case SCN_REGRESSION: {
                                // events should be monotonically increasing
                                // skipping the event and all the events before it (same buffer should have
                                // only increasing events)
                                String errMsg = logSequenceErrorPackets(readPos);
                                _log.warn("got an old event: seq=" + readPos.getSeq() + ", " + errMsg);
                                readPos.eventSkipped();
                                break;
                            }
                            case INVALID_EVENT: {
                                if (null != statsCollector)
                                    statsCollector
                                            .registerEventError(DbusEventInternalReadable.EventScanStatus.ERR);
                                throw new InvalidEventException();
                            }
                            case MISSING_EOP: {
                                String errMsg = logSequenceErrorPackets(readPos);
                                _log.error("detected missing EOP: " + errMsg);
                                throw new InvalidEventException(errMsg);
                            }
                            default:
                                throw new IllegalStateException("unknown scan status: " + eventScanStatus);
                            }
                        }

                        if (!readPos.hasNext()) {
                            readBuffer.clear();
                        }
                    } finally {
                        _queueLock.unlock();
                    }
                }
            }
        } finally {
            if (null != statsCollector) {
                statsCollector.registerBufferMetrics(getMinScn(), this.lastWrittenScn(), this.getPrevScn(),
                        this.getBufferFreeSpace());
                statsCollector.registerTimestampOfFirstEvent(_timestampOfFirstEvent);
            }
            _eventState = WindowState.ENDED;
        }
    } catch (RuntimeException re) {
        _log.error("Got runtime exception in readEvents: " + re.getMessage(), re);
        _log.error("Buffer State: " + toString());
        throw re;
    } finally {
        _readBufferLock.unlock();
        writePos.close();
    }

    if (logDebugEnabled)
        _log.debug("readEvents result: " + readPos + " " + writePos);

    return readPos.getNumReadEvents();
}