149 lines
4.1 KiB
Rust
149 lines
4.1 KiB
Rust
//! 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,
|
|
}
|
|
}
|
|
}
|