/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.virbo.datasource.ccsds160;

import java.io.File;
import java.io.FileInputStream;
import org.das2.util.monitor.ProgressMonitor;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel.MapMode;
import org.das2.dataset.DataSetUtil;
import org.das2.datum.Units;
import org.virbo.dataset.DDataSet;
import org.virbo.dataset.IDataSet;
import org.virbo.dataset.MutablePropertyDataSet;
import org.virbo.dataset.QDataSet;
import org.virbo.datasource.AbstractDataSource;
import org.virbo.datasource.DataSetURL;
import org.virbo.dsops.Ops;

/**
 *
 * @author chutter
 */
public class CCSDS160DataSource extends AbstractDataSource {

    public CCSDS160DataSource(URL url) {
        super(url);
    }

    @Override
    public QDataSet getDataSet(ProgressMonitor mon) throws Exception {

        File file160 = getFile(mon);  // JBF Change -- AbstractDataSource is going to provide updating capability

        int headerLength = 0;

        int frameSize = 1554;
        int frameCount = (int) ( ( file160.length() - headerLength ) / frameSize ) / 4;
        int frameXOffset = 18;
        int frameYOffset = 530;
        int frameZOffset = 1042;
//        byte[] header = new byte[18];// coarse time in bytes 6-9
//        int[] frameX = new int[128];// x component
//        int[] frameY = new int[128];// y component
//        int[] frameZ = new int[128];// z component
        int baseTime;

        FileInputStream fin = new FileInputStream(file160);
        ByteBuffer byteBuffer = fin.getChannel().map( MapMode.READ_ONLY, 0, frameSize);
	byteBuffer.order( ByteOrder.BIG_ENDIAN );

        baseTime =  byteBuffer.getInt( 6 );

        QDataSet frameX= org.virbo.binarydatasource.Int( 1, 4, frameXOffset, 128, 1, 1, byteBuffer );
        QDataSet frameY= org.virbo.binarydatasource.Int( 1, 4, frameYOffset, 128, 1, 1, byteBuffer );
        QDataSet frameZ= org.virbo.binarydatasource.Int( 1, 4, frameZOffset, 128, 1, 1, byteBuffer );

        MutablePropertyDataSet frameXYZ= Ops.join( frameX, frameY );
        frameXYZ= frameXYZ= Ops.join( frameXYZ, frameZ );
        //frameXYZ is (3,128) we need to transpose
        frameXYZ= Ops.transpose( frameXYZ );

        QDataSet times= new TagGenDataSet( 128, 0.078125, baseTime, Units.t1970 );
        frameXYZ.putProperty( QDataSet.DEPEND_0, times );
        frameXYZ.putProperty( QDataSet.DEPEND_1, Ops.labels( new String[] { "B-X", "B-Y", "B-Z" } ) );

        return frameXYZ;
    }

}
