Example #1
0
        public bool FillFromFrame(oni.Frame frame, int device_index)
        {
            if (index >= SamplesPerBlock)
            {
                throw new IndexOutOfRangeException();
            }

            // [uint64_t local_clock, uint16_t ephys1, uint16_t ephys2, ... , uint16_t aux1, uint16_t aux2, ...]
            var data = frame.Data <ushort>(device_index);

            clock[index] = ((ulong)data[0] << 48) | ((ulong)data[1] << 32) | ((ulong)data[2] << 16) | ((ulong)data[3] << 0);

            int chan = 0;

            for (; chan < NumChannels; chan++)
            {
                ephysData[chan, index] = data[chan + 4]; // Start at index 4
            }
            for (int k = 0; k < NumAuxInChannels; k++)
            {
                auxiliaryData[k, index] = data[4 + chan++];
            }

            return(++index == SamplesPerBlock);
        }
 public BreakoutDigitalInputDataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
     : base(frame, acq_clk_hz, data_clk_hz)
 {
     Port    = sample[4];
     Buttons = (ushort)(0x00FF & sample[5]);
     Links   = (ushort)((0x0F00 & sample[5]) >> 8);
 }
 public FMCHeadstageControlFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
     : base(frame, acq_clk_hz, data_clk_hz)
 {
     Lock = (sample[4] & 0x0001) == 1;
     Pass = (sample[4] & 0x0002) == 2;
     Code = (sample[4] & 0x0004) == 4 ? (sample[4] & 0xFF00) >> 8 : 0;
 }
Example #4
0
        private static void DisposeFrame(oni.Frame frame)
        {
            long dataSize = frame.DataSize;

            frame.Dispose();
            GC.RemoveMemoryPressure(dataSize);
        }
 public TS4231V1DataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
     : base(frame, acq_clk_hz, data_clk_hz)
 {
     // Data
     Index      = sample[4];
     PulseWidth = ((uint)sample[5] << 16) | ((uint)sample[6] << 0);
     PulseType  = (short)sample[7];
 }
Example #6
0
        public LoadTestingDataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
            : base(frame, acq_clk_hz, data_clk_hz)
        {
            var data = new ushort[sample.Length - 4];

            Array.Copy(sample, 4, data, 0, data.Length);
            Payload = Mat.FromArray(data, data.Length, 1, Depth.U16, 1);
        }
Example #7
0
        public MemoryUsageDataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz, uint total_words)
            : base(frame, acq_clk_hz, data_clk_hz)
        {
            uint words = ((uint)sample[4] << 16) | ((uint)sample[5] << 0);

            MemoryUsagePercentage = 100.0 * (double)words / (double)total_words;
            MemoryUsageBytes      = words * sizeof(uint);
        }
Example #8
0
        public TestDataFrame(oni.Frame frame)
        {
            // NB: Data contents: [uint64_t remote_clock, ...]
            var sample = frame.Data <ushort>();

            FrameClock = frame.Clock();
            DataClock  = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);
            Message    = ((int)sample[4] << 16) | ((int)sample[5] << 0);
        }
        public HeartbeatDataFrame(oni.Frame frame, int device_index, int hardware_clock_hz, int sys_clock_hz)
        {
            // NB: Data contents: [uint64_t remote_clock, uint16_t code]
            var sample = frame.Data <ushort>(device_index);

            FrameClock = frame.Clock();
            FrameTime  = FrameClock / (double)sys_clock_hz;
            Clock      = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);
            Time       = Clock / (double)hardware_clock_hz;
        }
Example #10
0
        public DataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
        {
            sample = frame.Data <ushort>();

            FrameClock = frame.Clock();
            DataClock  = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);

            FrameClockHz = acq_clk_hz;
            DataClockHz  = data_clk_hz;
        }
Example #11
0
 public BNO055DataFrame(oni.Frame frame, double acq_clk_hz, double data_clk_hz)
     : base(frame, acq_clk_hz, data_clk_hz)
 {
     // Convert data packet (output format is hard coded right now)
     Euler              = GetEuler(sample, 4);
     Quaternion         = GetQuat(sample, 7);
     LinearAcceleration = GetAcceleration(sample, 11);
     GravityVector      = GetAcceleration(sample, 14);
     Temperature        = (byte)(sample[17] & 0x00FF); // 1°C = 1 LSB
     Calibration        = (byte)((sample[17] & 0xFF00) >> 8);
 }
Example #12
0
        public bool FillFromFrame(oni.Frame frame, int device_index)
        {
            if (index >= SamplesPerBlock)
            {
                throw new IndexOutOfRangeException();
            }

            // NB: Data contents: [uint64_t remote_clock, uint32_t port_state]
            var sample = frame.Data <ushort>(device_index);

            clock[index]      = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);
            port_state[index] = ((int)sample[4] << 16) | ((int)sample[5] << 0);

            return(++index == SamplesPerBlock);
        }
        public LightHouseDataFrame(oni.Frame frame, int device_index, int sample_clock_hz, int sys_clock_hz)
        {
            // NB: Data contents: [uint64_t remote_clock, uint16_t width, int16_t type]
            var sample = frame.Data <ushort>(device_index);

            // Times
            FrameClock = frame.Clock();
            FrameTime  = FrameClock / (double)sys_clock_hz;
            Clock      = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);
            Time       = Clock / (double)sample_clock_hz;

            // Data
            PulseWidth = sample[4] / (double)sample_clock_hz;
            PulseType  = (short)sample[5];
        }
Example #14
0
        public bool FillFromFrame(oni.Frame frame)
        {
            if (index >= SamplesPerBlock)
            {
                throw new IndexOutOfRangeException();
            }

            var data = frame.Data <ushort>();

            frame_clock[index] = frame.Clock();
            data_clock[index]  = ((ulong)data[0] << 48) | ((ulong)data[1] << 32) | ((ulong)data[2] << 16) | ((ulong)data[3] << 0);

            FillFromData(data);

            return(++index == SamplesPerBlock);
        }
Example #15
0
        public BNO055DataFrame(oni.Frame frame, int device_index, int sample_clock_hz, int sys_clock_hz)
        {
            // NB: Data contents: [uint64_t remote_clock, uint16_t code]
            var sample = frame.Data <ushort>(device_index);

            FrameClock = frame.Clock();
            FrameTime  = FrameClock / (double)sys_clock_hz;
            Clock      = ((ulong)sample[0] << 48) | ((ulong)sample[1] << 32) | ((ulong)sample[2] << 16) | ((ulong)sample[3] << 0);
            Time       = Clock / (double)sample_clock_hz;

            // Convert data packet (output format is hard coded right now)
            Euler              = GetEuler(sample, 4);
            Quaternion         = GetQuat(sample, 7);
            LinearAcceleration = GetAcceleration(sample, 11);
            GravityVector      = GetAcceleration(sample, 14);
            Temperature        = (byte)(sample[17] & 0x00FF); // 1°C = 1 LSB
            Calibration        = (byte)((sample[17] & 0xFF00) >> 8);
        }
Example #16
0
        public bool FillFromFrame(oni.Frame frame, int device_index)
        {
            if (index >= SamplesPerBlock)
            {
                throw new IndexOutOfRangeException();
            }

            // [uint64_t local_clock, uint16_t ephys1, uint16_t ephys2, ... , uint16_t aux1, uint16_t aux2, ...]
            var raw = frame.Data <short>(device_index);

            clock[index] = ((ulong)raw[0] << 48) | ((ulong)raw[1] << 32) | ((ulong)raw[2] << 16) | ((ulong)raw[3] << 0);

            for (int chan = 0; chan < NumChannels; chan++)
            {
                data[chan, index] = raw[chan + 4]; // Start at index 4
            }

            return(++index == SamplesPerBlock);
        }
Example #17
0
        internal void Start()
        {
            lock (runLock)
            {
                if (running)
                {
                    return;
                }

                // NB: Stuff related to sync mode is 100% ONIX, not ONI, so long term another place
                // to do this separation might be needed
                int addr = ctx.HardwareAddress;
                int mode = (addr & 0x00FF0000) >> 16;
                if (mode == 0) // Standalone mode
                {
                    ctx.Start(true);
                }
                else // If synchronized mode, reset counter independently
                {
                    ctx.ResetFrameClock();
                    ctx.Start(false);
                }
                TokenSource        = new CancellationTokenSource();
                CollectFramesToken = TokenSource.Token;

                FrameQueue = new BlockingCollection <oni.Frame>(MaxQueuedFrames);

                readFrames = Task.Factory.StartNew(() =>
                {
                    while (!CollectFramesToken.IsCancellationRequested)
                    {
                        oni.Frame frame = ReadFrame();

                        // TODO: This should not be needed since we are calling Dispose()
                        // But somehow it seems to improve performance (coupled with GC.RemovePressure)
                        // More investigation might be needed
                        GC.AddMemoryPressure(frame.DataSize);

                        try
                        {
                            FrameQueue.Add(frame, CollectFramesToken);
                        }
                        catch (OperationCanceledException)
                        {
                            DisposeFrame(frame);
                        };
                    }
                },
                                                   CollectFramesToken,
                                                   TaskCreationOptions.LongRunning,
                                                   TaskScheduler.Default);

                distributeFrames = Task.Factory.StartNew(() =>
                {
                    while (!CollectFramesToken.IsCancellationRequested)
                    {
                        try
                        {
                            if (FrameQueue.TryTake(out oni.Frame frame, QueueTimeoutMilliseconds, CollectFramesToken))
                            {
                                OnFrameReceived(new FrameReceivedEventArgs(frame));
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            // If the thread stops no frame has been collected
                        }
                    }
                },
                                                         CollectFramesToken,
                                                         TaskCreationOptions.LongRunning,
                                                         TaskScheduler.Default);
            }
            running = true;
        }
        public bool FillFromFrame(oni.Frame frame, int device_index)
        {
            if (block_idx >= HyperFramesPerBlock)
            {
                throw new IndexOutOfRangeException();
            }

            // [uint64_t local_clock, uint16_t frame_type, ephys1, uint16_t ephys2, ... , uint16_t aux1, uint16_t aux2, ...]
            var data = frame.Data <ushort>(device_index);

            // TODO: This should be done automatically by firmware, seems like buffers are not getting cleared during reset
            if (total_frame_cnt == 0 && data[4] == 207)
            {
                return(false);
            }

            // Frame type and counter
            frameTypeData[total_frame_cnt] = data[4];
            //counterData[total_frame_cnt] = ((uint)data[27] << 16) | ((uint)data[34] << 0);
            counterData[total_frame_cnt] = ((uint)data[21 + data_offset] << 16) | ((uint)data[28 + data_offset] << 0);

            if (frame_cnt == 0)     // This one is LFP data
            {
                if (super_cnt == 0) // Use the first superframe in hyperframe as time of this spike-data round robin
                {
                    lfpClock[hyper_cnt] = ((ulong)data[0] << 48) | ((ulong)data[1] << 32) | ((ulong)data[2] << 16) | ((ulong)data[3] << 0);
                }

                for (int chan = 0; chan < 32; chan++)
                {
                    lfpData[chan + super_cnt * 32, hyper_cnt] = data[chan_map[chan] + data_offset]; // Start at index 6
                }
            }
            else     // Spike data

            {
                if (frame_cnt == 1) // Use the first frame in superframe as time of this spike-data round robin
                {
                    spikeClock[super_cnt] = ((ulong)data[0] << 48) | ((ulong)data[1] << 32) | ((ulong)data[2] << 16) | ((ulong)data[3] << 0);
                }

                //spikeClock[block_idx] = ((ulong)data[0] << 48) | ((ulong)data[1] << 32) | ((ulong)data[2] << 16) | ((ulong)data[3] << 0);

                for (int chan = 0; chan < 32; chan++)
                {
                    spikeData[chan + spike_frame_cnt * 32, total_super_cnt] = data[chan_map[chan] + data_offset]; // Start at index 6
                }

                spike_frame_cnt++;
            }

            if (frame_cnt == 12)
            {
                total_super_cnt++;
                if (++super_cnt == 12)
                {
                    hyper_cnt++;
                    super_cnt = 0;
                }

                spike_frame_cnt = 0;
                frame_cnt       = 0;
            }
            else
            {
                frame_cnt++;
            }
            total_frame_cnt++;
            return(hyper_cnt == HyperFramesPerBlock);
        }
 public FrameReceivedEventArgs(oni.Frame frame)
 {
     Value = frame;
 }
Example #20
0
        internal bool FillFromFrame(oni.Frame frame, int device_index)
        {
            // [uint16_t row idx, uint16_t frame number, uint8_t px0, uint8_t px1, ....]
            var data = frame.Data <ushort>(device_index);

            // Which row is this data from?
            // Data packed big endian
            var row = data[0];

            // Sanity check
            if (row < 0 || row >= Rows)
            {
                throw new IndexOutOfRangeException();
            }

            // We need to start at row 0
            if (alignment_needed && row == 0)
            {
                // Log times
                Clock            = frame.Clock();
                Time             = Clock / fs;
                alignment_needed = false;
            }

            // Loop through pixels looking for which to update
            for (int i = 0; i < Cols; i++)
            {
                if (data[i + 1] != NO_UPDATE)
                {
                    image_data[row * Cols + i] = data[i + 1];
                }
            }

            // Copy data into current row
            //Array.Copy(data, 1, image_data, row * Cols, Cols);

            // TODO: remove.....\
            //if (row != last_row + 1)
            //    System.Console.WriteLine("zero row!");

            //last_row = row;

            //int sr = 0;
            //for (int i = 1; i < data.Length; i++)
            //    sr += data[i];

            //if (sr == 0)
            //    System.Console.WriteLine("zero row!");

            //s_raw += sr;

            //var row_data = image_data.Skip(row * Cols).Take(Cols).ToArray();
            //if (Enumerable.SequenceEqual(row_data, Enumerable.Repeat<ushort>(0, row_data.Length).ToArray()))
            //    System.Console.WriteLine("zero row: { }!", row); // throw new IndexOutOfRangeException();

            //int s = 0;
            //for (int i = 0; i < row_data.Length; i++)
            //    s += row_data[i];

            //if (s == 0)
            //    System.Console.WriteLine("zero row: { }!", row);

            // If we are at last row and started at first
            //var done = (row == Rows - 1 && !alignment_needed);

            //if (done) {

            //    int s = 0;
            //    for (int i = 0; i < image_data.Length; i++)
            //        s += image_data[i];



            //    if (s != 256)
            //        System.Console.WriteLine("zero row!");

            //}
            //......

            return(row == Rows - 1 && !alignment_needed);
        }
Example #21
0
 public ONIManagedFrame(oni.Frame frame)
 {
     Sample        = frame.Data <T>();
     FrameClock    = frame.Clock;
     DeviceAddress = frame.DeviceAddress;
 }