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; }
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]; }
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); }
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); }
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; }
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; }
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); }
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]; }
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); }
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); }
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); }
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; }
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); }
public ONIManagedFrame(oni.Frame frame) { Sample = frame.Data <T>(); FrameClock = frame.Clock; DeviceAddress = frame.DeviceAddress; }