//! 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 for KitDataType { type Error = &'static str; fn try_from(value: i16) -> Result { 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, } } }