Implement Integral Data Types (#13)

**Rationale:**

Integral Types were missing and are needed for Project Nautilus.

**Changes:**

- Implements Integral Data Types
  - u64 and i64 implemented through bigint

Reviewed-on: #13
Co-authored-by: Sergey Savelyev <sergeysav.nn@gmail.com>
Co-committed-by: Sergey Savelyev <sergeysav.nn@gmail.com>
This commit was merged in pull request #13.
This commit is contained in:
2026-01-03 08:37:26 -08:00
committed by sergeysav
parent 458c94c2ad
commit 167e9d0a01
21 changed files with 343 additions and 56 deletions

View File

@@ -196,9 +196,17 @@ impl HistorySegmentFile {
// Write all the values
for value in &data.values {
match value {
DataValue::Float32(value) => file.write_data::<f32>(*value)?,
DataValue::Float64(value) => file.write_data::<f64>(*value)?,
DataValue::Boolean(value) => file.write_data::<bool>(*value)?,
DataValue::Float32(value) => file.write_data(*value)?,
DataValue::Float64(value) => file.write_data(*value)?,
DataValue::Boolean(value) => file.write_data(*value)?,
DataValue::Int8(value) => file.write_data(*value)?,
DataValue::Int16(value) => file.write_data(*value)?,
DataValue::Int32(value) => file.write_data(*value)?,
DataValue::Int64(value) => file.write_data(*value)?,
DataValue::Unsigned8(value) => file.write_data(*value)?,
DataValue::Unsigned16(value) => file.write_data(*value)?,
DataValue::Unsigned32(value) => file.write_data(*value)?,
DataValue::Unsigned64(value) => file.write_data(*value)?,
}
}
@@ -332,20 +340,20 @@ impl HistorySegmentFile {
}
fn read_telemetry_item(&mut self, telemetry_data_type: DataType) -> anyhow::Result<DataValue> {
match telemetry_data_type {
DataType::Float32 => {
self.file_position += 4;
Ok(DataValue::Float32(self.file.read_data::<f32>()?))
}
DataType::Float64 => {
self.file_position += 8;
Ok(DataValue::Float64(self.file.read_data::<f64>()?))
}
DataType::Boolean => {
self.file_position += 1;
Ok(DataValue::Boolean(self.file.read_data::<bool>()?))
}
}
self.file_position += telemetry_data_type.get_data_length() as i64;
Ok(match telemetry_data_type {
DataType::Float32 => self.file.read_data::<f32>()?.into(),
DataType::Float64 => self.file.read_data::<f64>()?.into(),
DataType::Boolean => self.file.read_data::<bool>()?.into(),
DataType::Int8 => self.file.read_data::<i8>()?.into(),
DataType::Int16 => self.file.read_data::<i16>()?.into(),
DataType::Int32 => self.file.read_data::<i32>()?.into(),
DataType::Int64 => self.file.read_data::<i64>()?.into(),
DataType::Unsigned8 => self.file.read_data::<u8>()?.into(),
DataType::Unsigned16 => self.file.read_data::<u16>()?.into(),
DataType::Unsigned32 => self.file.read_data::<u32>()?.into(),
DataType::Unsigned64 => self.file.read_data::<u64>()?.into(),
})
}
fn get_telemetry_item(
@@ -353,11 +361,7 @@ impl HistorySegmentFile {
index: u64,
telemetry_data_type: DataType,
) -> anyhow::Result<DataValue> {
let item_length = match telemetry_data_type {
DataType::Float32 => 4,
DataType::Float64 => 8,
DataType::Boolean => 1,
};
let item_length = telemetry_data_type.get_data_length();
let desired_position =
Self::HEADER_LENGTH + self.length * Self::TIMESTAMP_LENGTH + index * item_length;
let seek_amount = desired_position as i64 - self.file_position;

View File

@@ -3,8 +3,6 @@ use crate::telemetry::data_item::TelemetryDataItem;
use crate::telemetry::definition::TelemetryDefinition;
use crate::telemetry::history::{TelemetryHistory, TelemetryHistoryService};
use anyhow::bail;
use api::data_type::DataType;
use api::data_value::DataValue;
use api::messages::telemetry_definition::{
TelemetryDefinitionRequest, TelemetryDefinitionResponse,
};
@@ -144,11 +142,7 @@ impl TelemetryManagementService {
bail!("Telemetry Item Not Found");
};
let expected_type = match &tlm_item.value {
DataValue::Float32(_) => DataType::Float32,
DataValue::Float64(_) => DataType::Float64,
DataValue::Boolean(_) => DataType::Boolean,
};
let expected_type = tlm_item.value.to_data_type();
if expected_type != tlm_data.data.definition.data_type {
bail!("Data Type Mismatch");
};