1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use crate::samplic;
use chrono::offset::Utc;
use chrono::DateTime;
use indexmap::IndexMap;
use uuid::Uuid;

pub mod filesystem;
pub mod interface;

mod loadable_device;
mod storable_device;

pub use loadable_device::LoadableDevice;
pub use storable_device::StorableDevice;

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct DeviceSettings {
    pub language: String,
    pub uuid: Uuid,
    pub xio_device: Option<XioDevice>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct XioDevice {
    pub url: String,
    pub uuid: Uuid,
}

#[derive(Clone, Debug)]
pub struct Sampling {
    pub settings: SamplingSettings,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SamplingSettings {
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub preparation: Option<PreparationSettings>,
    pub measurement: MeasurementSettings,
    pub interface: Interface,
    #[serde(
        rename = "idle_before_preparation",
        default,
        skip_serializing_if = "IndexMap::is_empty"
    )]
    pub idle_before_preparation_mapping: IndexMap<String, String>,
    #[serde(
        rename = "idle_before_measurement",
        default,
        skip_serializing_if = "IndexMap::is_empty"
    )]
    pub idle_before_measurement_mapping: IndexMap<String, String>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "PascalCase", tag = "type")]
pub enum Interface {
    SingleAlignmentTabbed(SingleAlignmentTabbedInterface),
    SingleValueWithProperties(SingleValueWithPropertiesInterface),
    MultipleValuesWithProperties(MultipleValuesWithPropertiesInterface),
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SingleAlignmentTabbedInterface {
    grid_columns: usize,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SingleValueWithPropertiesInterface {
    grid_columns: usize,
    properties: Vec<IndexMap<String, samplic::Parameter>>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MultipleValuesWithPropertiesInterface {
    grid_columns: usize,
    properties: Vec<IndexMap<String, samplic::Parameter>>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct PreparationSettings {
    #[serde(rename = "_caption")]
    pub caption: String,
    #[serde(rename = "_description")]
    pub description: String,
    pub icon_id: String,
    pub mode: PreparationMode,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub timeout: Option<usize>,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub enum PreparationMode {
    Disabled,
    BeforeFirstMeasurement,
    BeforeEveryMeasurement,
}

#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct MeasurementSettings {
    pub grid_columns: usize,
}

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct SampleCachedInformation {
    pub identifier: String,
    pub uuid: Uuid,
    pub measurement_count: usize,
    pub moment: DateTime<Utc>,
    pub source: samplic::Source,
}

#[derive(Clone, Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CalibrationDescription {
    #[serde(rename = "_caption")]
    pub caption: String,

    pub icon_id: String,

    pub curve: crate::samplic::Cartesian2dCoordinateSystemDescription,

    pub jobs: IndexMap<String, CalibrationJobDescription>,
}

#[derive(Clone, Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CalibrationJobDescription {
    pub curve_mapping: IndexMap<String, String>,
    #[serde(default, skip_serializing_if = "IndexMap::is_empty")]
    pub parameters: IndexMap<String, crate::samplic::ParameterDescription>,
    #[serde(default, skip_serializing_if = "IndexMap::is_empty")]
    pub profile_parameters:
        IndexMap<String, crate::samplic::ProfileParameterDescription>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub curve: Option<crate::samplic::CoordinateSystemDescription>,
}