Initial commit
This commit is contained in:
@@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user