Initial commit

This commit is contained in:
redclawsystems
2026-03-04 00:08:42 +00:00
commit 4d88dc0584
4449 changed files with 1556714 additions and 0 deletions
@@ -0,0 +1,148 @@
//! KIT/Yokogawa Format Constants
//!
//! File offsets, magic numbers, and type definitions for KIT files.
/// Magic bytes for KIT continuous file (.con)
pub const KIT_CON_MAGIC: &[u8; 16] = b"KIT-SYSTEM CON\x00";
/// Magic bytes for KIT segmented file (.sqd)
pub const KIT_SQD_MAGIC: &[u8; 16] = b"KIT-SYSTEM SQD\x00";
/// Version 1 identifier
pub const KIT_VERSION_1: u32 = 1;
/// Version 2 identifier
pub const KIT_VERSION_2: u32 = 2;
// Header offsets
/// Offset to version number
pub const KIT_VERSION_OFFSET: usize = 16;
/// Offset to system ID
pub const KIT_SYSTEM_ID_OFFSET: usize = 20;
/// Offset to number of channels
pub const KIT_NCHAN_OFFSET: usize = 24;
/// Offset to number of samples
pub const KIT_NSAMP_OFFSET: usize = 28;
/// Offset to sampling rate (int in older versions)
pub const KIT_SFREQ_INT_OFFSET: usize = 32;
/// Offset to sampling rate (float in newer versions)
pub const KIT_SFREQ_FLOAT_OFFSET: usize = 36;
/// Offset to number of epochs
pub const KIT_NEPOCH_OFFSET: usize = 44;
/// Offset to samples per epoch
pub const KIT_EPOCH_SIZE_OFFSET: usize = 48;
/// Offset to data type
pub const KIT_DTYPE_OFFSET: usize = 52;
/// Offset to channel info start
pub const KIT_CHANNEL_INFO_OFFSET: usize = 256;
/// Size of each channel info block
pub const KIT_CHANNEL_INFO_SIZE: usize = 128;
/// Offset to data start in file
pub const KIT_DATA_OFFSET: usize = 16384;
// Channel info offsets (within channel block)
/// Offset to channel name
pub const CH_NAME_OFFSET: usize = 0;
/// Maximum channel name length
pub const MAX_CHANNEL_NAME: usize = 32;
/// Offset to channel type
pub const CH_TYPE_OFFSET: usize = 32;
/// Offset to sensor type
pub const CH_SENSOR_OFFSET: usize = 34;
/// Offset to calibration factor
pub const CH_CAL_OFFSET: usize = 40;
/// Offset to position X
pub const CH_POS_X_OFFSET: usize = 48;
/// Offset to position Y
pub const CH_POS_Y_OFFSET: usize = 56;
/// Offset to position Z
pub const CH_POS_Z_OFFSET: usize = 64;
/// Offset to orientation X
pub const CH_ORI_X_OFFSET: usize = 72;
/// Offset to orientation Y
pub const CH_ORI_Y_OFFSET: usize = 80;
/// Offset to orientation Z
pub const CH_ORI_Z_OFFSET: usize = 88;
// Channel types
/// MEG axial gradiometer
pub const KIT_CH_MEG_AXIAL: i16 = 1;
/// MEG planar gradiometer
pub const KIT_CH_MEG_PLANAR: i16 = 2;
/// EEG channel
pub const KIT_CH_EEG: i16 = 3;
/// Reference channel
pub const KIT_CH_REF: i16 = 4;
/// Auxiliary/ADC channel
pub const KIT_CH_AUX: i16 = 5;
/// Trigger channel
pub const KIT_CH_TRIGGER: i16 = 6;
/// Digital input channel
pub const KIT_CH_DIGITAL: i16 = 7;
/// Magnetic stimulus channel
pub const KIT_CH_STIM_MAG: i16 = 8;
// Sensor types
/// Magnetometer
pub const KIT_SENSOR_MAG: i16 = 1;
/// Axial gradiometer
pub const KIT_SENSOR_GRAD_AXIAL: i16 = 2;
/// Planar gradiometer
pub const KIT_SENSOR_GRAD_PLANAR: i16 = 3;
// Data types
/// 16-bit signed integer
pub const KIT_DTYPE_INT16: i16 = 1;
/// 32-bit signed integer
pub const KIT_DTYPE_INT32: i16 = 2;
/// 32-bit float
pub const KIT_DTYPE_FLOAT32: i16 = 3;
/// 64-bit float
pub const KIT_DTYPE_FLOAT64: i16 = 4;
// System IDs
/// KIT-157 system
pub const KIT_SYSTEM_157: u32 = 157;
/// KIT-208 system
pub const KIT_SYSTEM_208: u32 = 208;
/// KIT-64 system
pub const KIT_SYSTEM_64: u32 = 64;
/// Data type enumeration for KIT files
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KitDataType {
/// 16-bit signed integer
Int16,
/// 32-bit signed integer
Int32,
/// 32-bit float
Float32,
/// 64-bit float
Float64,
}
impl TryFrom<i16> for KitDataType {
type Error = &'static str;
fn try_from(value: i16) -> Result<Self, Self::Error> {
match value {
KIT_DTYPE_INT16 => Ok(Self::Int16),
KIT_DTYPE_INT32 => Ok(Self::Int32),
KIT_DTYPE_FLOAT32 => Ok(Self::Float32),
KIT_DTYPE_FLOAT64 => Ok(Self::Float64),
_ => Err("Unknown KIT data type"),
}
}
}
impl KitDataType {
/// Size of this data type in bytes
pub fn size(&self) -> usize {
match self {
Self::Int16 => 2,
Self::Int32 => 4,
Self::Float32 => 4,
Self::Float64 => 8,
}
}
}