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
//! Trait das die Eigenschaften aller vom Server unterstützten Sensoren beschreibt.
//!
use prelude::*;


mod metz_connect_ci4;
mod ra_gas_co_no2_mod;
mod test_sensor;

// Reexports
pub use self::metz_connect_ci4::MetzConnectCI4;
pub use self::ra_gas_co_no2_mod::RaGasCONO2Mod;
pub use self::test_sensor::TestSensor;

pub type BoxedSensor = Box<Sensor + Send + Sync>;
pub type SensorList = Vec<Arc<RwLock<BoxedSensor>>>;


/// Verfügbare Sensor Typen
///
/// Von der 'xMZ-Plattform' unterstützte Sensor Module.
/// Ein Sensor Modul beherbergt eine oder mehrere `Messzellen` sowie ein BUS Interface über das der
/// Sensor mit der Zentrale verbunden ist (Modbus RTU/ TCP/IP).
///
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum SensorType {
    #[serde(rename="Metz Connect CI4 Modul")]
    MetzConnectCI4,
    #[serde(rename="RA-GAS GmbH CO/ NO₂ Kombisensor mit Modbus Interface")]
    RaGasCONO2Mod,
    #[serde(rename="Test Sensor")]
    TestSensor,
}

/// Trait das die Eigenschaften aller Sensoren beschreibt.
///
/// Jeder Sensor kann meherer Messzellen besitzen. So verfügt beispielsweise der
/// "CO/NO2 Kombisensor mit Modbus Interface" der Firma RA-GAS GmbH über 2 Messzellen, je eine
/// für CO (Kohlenmonoxid) und NO2 (Stickstoffdioxid).
pub trait Sensor: fmt::Debug + fmt::Display {
    /// In der Update Funktion werden die Sensoren ausgelesen
    ///
    /// In dieser Funktion sollten auch die Werte (`values`) der Messzellen aktualisiert werden.
    fn update(&self);

    /// Gibt die Sensor ID wieder
    ///
    /// Die Sensor ID wird u.a. in der Konfigurationsdatei verwendet um die Messzellen den Sensoren
    /// zuzuordnen.
    ///
    fn get_id(&self) -> u32;

    /// Gibt den Sensor Type wieder
    ///
    fn get_sensor_type(&self) -> SensorType;

    /// Liefert eine Referenz auf den Vector der Messzellen
    ///
    fn get_messzellen(&self) -> Vec<Arc<RwLock<BoxedMesszelle>>>;

    /// Liefert Optional eine Messzelle (wenn vorhanden)
    ///
    /// Gibt `None` zurück wenn der Sensor keine Messzelle an Position `num` besizt.
    fn get_messzelle(&self, num: usize) -> Option<&Arc<RwLock<BoxedMesszelle>>>;
}