Skip to content
Snippets Groups Projects
Commit 7de728f1 authored by Udo Eisenbarth's avatar Udo Eisenbarth :speech_balloon:
Browse files

Add MeterType to properties of EnergyMeter

parent 187c281a
No related branches found
No related tags found
No related merge requests found
#![warn(missing_docs)] #![warn(missing_docs)]
use serde_derive::{Deserialize, Serialize};
use serde_json::{json, Number}; use serde_json::{json, Number};
use crate::dottable::Dottable; use crate::dottable::Dottable;
...@@ -15,7 +16,7 @@ use std::fmt::Debug; ...@@ -15,7 +16,7 @@ use std::fmt::Debug;
type Result<T> = std::result::Result<T, OpossumError>; type Result<T> = std::result::Result<T, OpossumError>;
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, Default, PartialEq, Clone, Copy)] #[derive(Debug, Default, PartialEq, Clone, Copy, Serialize, Deserialize)]
/// Type of the [`EnergyMeter`]. This is currently not used. /// Type of the [`EnergyMeter`]. This is currently not used.
pub enum Metertype { pub enum Metertype {
/// an ideal energy meter /// an ideal energy meter
...@@ -38,7 +39,7 @@ pub enum Metertype { ...@@ -38,7 +39,7 @@ pub enum Metertype {
/// different dectector nodes can be "stacked" or used somewhere in between arbitrary optic nodes. /// different dectector nodes can be "stacked" or used somewhere in between arbitrary optic nodes.
pub struct EnergyMeter { pub struct EnergyMeter {
light_data: Option<LightData>, light_data: Option<LightData>,
meter_type: Metertype, //meter_type: Metertype,
props: Properties, props: Properties,
} }
...@@ -46,6 +47,7 @@ fn create_default_props() -> Properties { ...@@ -46,6 +47,7 @@ fn create_default_props() -> Properties {
let mut props = Properties::default(); let mut props = Properties::default();
props.set("name", "energy meter".into()); props.set("name", "energy meter".into());
props.set("inverted", false.into()); props.set("inverted", false.into());
props.set("meter type", Metertype::default().into());
props props
} }
...@@ -53,7 +55,7 @@ impl Default for EnergyMeter { ...@@ -53,7 +55,7 @@ impl Default for EnergyMeter {
fn default() -> Self { fn default() -> Self {
Self { Self {
light_data: Default::default(), light_data: Default::default(),
meter_type: Default::default(), //meter_type: Default::default(),
props: create_default_props(), props: create_default_props(),
} }
} }
...@@ -63,19 +65,24 @@ impl EnergyMeter { ...@@ -63,19 +65,24 @@ impl EnergyMeter {
pub fn new(name: &str, meter_type: Metertype) -> Self { pub fn new(name: &str, meter_type: Metertype) -> Self {
let mut props = create_default_props(); let mut props = create_default_props();
props.set("name", name.into()); props.set("name", name.into());
props.set("meter type", meter_type.into());
EnergyMeter { EnergyMeter {
light_data: None, light_data: None,
meter_type,
props, props,
} }
} }
/// Returns the meter type of this [`EnergyMeter`]. /// Returns the meter type of this [`EnergyMeter`].
pub fn meter_type(&self) -> Metertype { pub fn meter_type(&self) -> Metertype {
self.meter_type let meter_type=self.props.get("meter type").unwrap().prop.clone();
if let Proptype::Metertype(meter_type)=meter_type {
meter_type
} else {
panic!("wrong data format")
}
} }
/// Sets the meter type of this [`EnergyMeter`]. /// Sets the meter type of this [`EnergyMeter`].
pub fn set_meter_type(&mut self, meter_type: Metertype) { pub fn set_meter_type(&mut self, meter_type: Metertype) {
self.meter_type = meter_type; self.props.set("meter type", meter_type.into());
} }
} }
impl Optical for EnergyMeter { impl Optical for EnergyMeter {
...@@ -140,7 +147,7 @@ impl Optical for EnergyMeter { ...@@ -140,7 +147,7 @@ impl Optical for EnergyMeter {
impl Debug for EnergyMeter { impl Debug for EnergyMeter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match &self.light_data { match &self.light_data {
Some(data) => write!(f, "{} (Type: {:?})", data, self.meter_type), Some(data) => write!(f, "{} (Type: {:?})", data, self.meter_type()),
None => write!(f, "no data"), None => write!(f, "no data"),
} }
} }
...@@ -160,13 +167,13 @@ mod test { ...@@ -160,13 +167,13 @@ mod test {
fn new() { fn new() {
let meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter); let meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter);
assert!(meter.light_data.is_none()); assert!(meter.light_data.is_none());
assert_eq!(meter.meter_type, Metertype::IdealEnergyMeter); assert_eq!(meter.meter_type(), Metertype::IdealEnergyMeter);
} }
#[test] #[test]
fn default() { fn default() {
let meter = EnergyMeter::default(); let meter = EnergyMeter::default();
assert!(meter.light_data.is_none()); assert!(meter.light_data.is_none());
assert_eq!(meter.meter_type, Metertype::IdealEnergyMeter); assert_eq!(meter.meter_type(), Metertype::IdealEnergyMeter);
assert_eq!(meter.node_type(), "energy meter"); assert_eq!(meter.node_type(), "energy meter");
assert_eq!(meter.is_detector(), true); assert_eq!(meter.is_detector(), true);
assert_eq!(meter.node_color(), "whitesmoke"); assert_eq!(meter.node_color(), "whitesmoke");
...@@ -181,7 +188,7 @@ mod test { ...@@ -181,7 +188,7 @@ mod test {
fn set_meter_type() { fn set_meter_type() {
let mut meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter); let mut meter = EnergyMeter::new("test", Metertype::IdealEnergyMeter);
meter.set_meter_type(Metertype::IdealPowerMeter); meter.set_meter_type(Metertype::IdealPowerMeter);
assert_eq!(meter.meter_type, Metertype::IdealPowerMeter); assert_eq!(meter.meter_type(), Metertype::IdealPowerMeter);
} }
#[test] #[test]
fn ports() { fn ports() {
......
...@@ -4,7 +4,7 @@ use std::collections::HashMap; ...@@ -4,7 +4,7 @@ use std::collections::HashMap;
use crate::{ use crate::{
error::OpossumError, error::OpossumError,
lightdata::LightData, lightdata::LightData,
nodes::{FilterType, SpectrometerType}, nodes::{FilterType, SpectrometerType, Metertype},
optical::OpticGraph, optical::OpticGraph,
}; };
...@@ -96,6 +96,13 @@ impl From<SpectrometerType> for Property { ...@@ -96,6 +96,13 @@ impl From<SpectrometerType> for Property {
} }
} }
} }
impl From<Metertype> for Property {
fn from(value: Metertype) -> Self {
Property {
prop: Proptype::Metertype(value),
}
}
}
#[non_exhaustive] #[non_exhaustive]
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub enum Proptype { pub enum Proptype {
...@@ -107,4 +114,5 @@ pub enum Proptype { ...@@ -107,4 +114,5 @@ pub enum Proptype {
OpticGraph(OpticGraph), OpticGraph(OpticGraph),
FilterType(FilterType), FilterType(FilterType),
SpectrometerType(SpectrometerType), SpectrometerType(SpectrometerType),
Metertype(Metertype)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment