use native_db::{native_db, ToKey};
use native_model::{native_model, Model};
use serde::{Deserialize, Serialize};
use super::v1::{AncestorLocal, Syncable};
pub use super::v11::LinkType;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[native_model(id = 15, version = 8, from = super::v14::ConnectivityLocal)]
#[native_db]
pub struct ConnectivityLocalV17 {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub device_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub inserted_at: Option<String>,
pub timestamp_start: String,
pub signal: Option<f64>,
pub noise: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub location: Option<String>,
pub h14_index: String,
pub h13_index: String,
pub h12_index: String,
pub h11_index: String,
pub battery_percentage: Option<f32>,
pub frequency_hz: Option<f32>,
pub bandwidth_hz: Option<f32>,
pub associated_station: Option<String>,
pub mode: Option<String>,
pub battery_volts: Option<f32>,
#[serde(default)]
pub link_type: LinkType,
pub quality_normalized: Option<f32>,
pub secondary_battery_percentage: Option<f32>,
pub secondary_battery_volts: Option<f32>,
pub frame_center_location: Option<String>,
pub frame_center_altitude: Option<f64>,
pub base_device_online: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[native_model(id = 15, version = 9, from = ConnectivityLocalV17)]
#[native_db]
pub struct ConnectivityLocal {
pub id: Option<i64>,
#[primary_key]
pub id_local: Option<String>,
#[secondary_key]
pub session_id: Option<i64>,
#[secondary_key]
pub device_id: Option<i64>,
#[secondary_key]
pub ancestor_id_local: Option<String>,
pub inserted_at: Option<String>,
pub timestamp_start: String,
pub signal: Option<f64>,
pub noise: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub location: Option<String>,
pub h14_index: String,
pub h13_index: String,
pub h12_index: String,
pub h11_index: String,
pub battery_percentage: Option<f32>,
pub frequency_hz: Option<f32>,
pub bandwidth_hz: Option<f32>,
pub associated_station: Option<String>,
pub mode: Option<String>,
pub battery_volts: Option<f32>,
#[serde(default)]
pub link_type: LinkType,
pub quality_normalized: Option<f32>,
pub secondary_battery_percentage: Option<f32>,
pub secondary_battery_volts: Option<f32>,
pub frame_center_location: Option<String>,
pub frame_center_altitude: Option<f64>,
pub base_device_online: Option<bool>,
pub frame_center_h14_index: Option<String>,
pub frame_center_h13_index: Option<String>,
pub frame_center_h12_index: Option<String>,
pub frame_center_h11_index: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Connectivity {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i64>,
pub session_id: Option<i64>,
pub device_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inserted_at: Option<String>,
pub timestamp_start: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub signal: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub noise: Option<f64>,
pub altitude: f64,
pub heading: f64,
pub location: Option<String>,
pub h14_index: String,
pub h13_index: String,
pub h12_index: String,
pub h11_index: String,
pub battery_percentage: Option<f32>,
pub frequency_hz: Option<f32>,
pub bandwidth_hz: Option<f32>,
pub associated_station: Option<String>,
pub mode: Option<String>,
pub battery_volts: Option<f32>,
#[serde(default)]
pub link_type: LinkType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub quality_normalized: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secondary_battery_percentage: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub secondary_battery_volts: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_location: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_altitude: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub base_device_online: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_h14_index: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_h13_index: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_h12_index: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub frame_center_h11_index: Option<String>,
}
impl From<super::v14::ConnectivityLocal> for ConnectivityLocalV17 {
fn from(previous: super::v14::ConnectivityLocal) -> Self {
Self {
id: previous.id,
id_local: previous.id_local,
session_id: previous.session_id,
device_id: previous.device_id,
ancestor_id_local: previous.ancestor_id_local,
inserted_at: previous.inserted_at,
timestamp_start: previous.timestamp_start,
signal: previous.signal,
noise: previous.noise,
altitude: previous.altitude,
heading: previous.heading,
location: previous.location,
h14_index: previous.h14_index,
h13_index: previous.h13_index,
h12_index: previous.h12_index,
h11_index: previous.h11_index,
battery_percentage: previous.battery_percentage,
frequency_hz: previous.frequency_hz,
bandwidth_hz: previous.bandwidth_hz,
associated_station: previous.associated_station,
mode: previous.mode,
battery_volts: previous.battery_volts,
link_type: previous.link_type,
quality_normalized: previous.quality_normalized,
secondary_battery_percentage: previous.secondary_battery_percentage,
secondary_battery_volts: previous.secondary_battery_volts,
frame_center_location: None,
frame_center_altitude: None,
base_device_online: None,
}
}
}
impl From<ConnectivityLocalV17> for super::v14::ConnectivityLocal {
fn from(current: ConnectivityLocalV17) -> Self {
Self {
id: current.id,
id_local: current.id_local,
session_id: current.session_id,
device_id: current.device_id,
ancestor_id_local: current.ancestor_id_local,
inserted_at: current.inserted_at,
timestamp_start: current.timestamp_start,
signal: current.signal,
noise: current.noise,
altitude: current.altitude,
heading: current.heading,
location: current.location,
h14_index: current.h14_index,
h13_index: current.h13_index,
h12_index: current.h12_index,
h11_index: current.h11_index,
battery_percentage: current.battery_percentage,
frequency_hz: current.frequency_hz,
bandwidth_hz: current.bandwidth_hz,
associated_station: current.associated_station,
mode: current.mode,
battery_volts: current.battery_volts,
link_type: current.link_type,
quality_normalized: current.quality_normalized,
secondary_battery_percentage: current.secondary_battery_percentage,
secondary_battery_volts: current.secondary_battery_volts,
}
}
}
impl From<ConnectivityLocalV17> for ConnectivityLocal {
fn from(previous: ConnectivityLocalV17) -> Self {
Self {
id: previous.id,
id_local: previous.id_local,
session_id: previous.session_id,
device_id: previous.device_id,
ancestor_id_local: previous.ancestor_id_local,
inserted_at: previous.inserted_at,
timestamp_start: previous.timestamp_start,
signal: previous.signal,
noise: previous.noise,
altitude: previous.altitude,
heading: previous.heading,
location: previous.location,
h14_index: previous.h14_index,
h13_index: previous.h13_index,
h12_index: previous.h12_index,
h11_index: previous.h11_index,
battery_percentage: previous.battery_percentage,
frequency_hz: previous.frequency_hz,
bandwidth_hz: previous.bandwidth_hz,
associated_station: previous.associated_station,
mode: previous.mode,
battery_volts: previous.battery_volts,
link_type: previous.link_type,
quality_normalized: previous.quality_normalized,
secondary_battery_percentage: previous.secondary_battery_percentage,
secondary_battery_volts: previous.secondary_battery_volts,
frame_center_location: previous.frame_center_location,
frame_center_altitude: previous.frame_center_altitude,
base_device_online: previous.base_device_online,
frame_center_h14_index: None,
frame_center_h13_index: None,
frame_center_h12_index: None,
frame_center_h11_index: None,
}
}
}
impl From<ConnectivityLocal> for ConnectivityLocalV17 {
fn from(current: ConnectivityLocal) -> Self {
Self {
id: current.id,
id_local: current.id_local,
session_id: current.session_id,
device_id: current.device_id,
ancestor_id_local: current.ancestor_id_local,
inserted_at: current.inserted_at,
timestamp_start: current.timestamp_start,
signal: current.signal,
noise: current.noise,
altitude: current.altitude,
heading: current.heading,
location: current.location,
h14_index: current.h14_index,
h13_index: current.h13_index,
h12_index: current.h12_index,
h11_index: current.h11_index,
battery_percentage: current.battery_percentage,
frequency_hz: current.frequency_hz,
bandwidth_hz: current.bandwidth_hz,
associated_station: current.associated_station,
mode: current.mode,
battery_volts: current.battery_volts,
link_type: current.link_type,
quality_normalized: current.quality_normalized,
secondary_battery_percentage: current.secondary_battery_percentage,
secondary_battery_volts: current.secondary_battery_volts,
frame_center_location: current.frame_center_location,
frame_center_altitude: current.frame_center_altitude,
base_device_online: current.base_device_online,
}
}
}
impl From<ConnectivityLocal> for Connectivity {
fn from(local: ConnectivityLocal) -> Self {
Self {
id: local.id,
session_id: local.session_id,
device_id: local.device_id,
inserted_at: local.inserted_at,
timestamp_start: local.timestamp_start,
signal: local.signal,
noise: local.noise,
altitude: local.altitude,
heading: local.heading,
location: local.location,
h14_index: local.h14_index,
h13_index: local.h13_index,
h12_index: local.h12_index,
h11_index: local.h11_index,
battery_percentage: local.battery_percentage,
frequency_hz: local.frequency_hz,
bandwidth_hz: local.bandwidth_hz,
associated_station: local.associated_station,
mode: local.mode,
battery_volts: local.battery_volts,
link_type: local.link_type,
quality_normalized: local.quality_normalized,
secondary_battery_percentage: local.secondary_battery_percentage,
secondary_battery_volts: local.secondary_battery_volts,
frame_center_location: local.frame_center_location,
frame_center_altitude: local.frame_center_altitude,
base_device_online: local.base_device_online,
frame_center_h14_index: local.frame_center_h14_index,
frame_center_h13_index: local.frame_center_h13_index,
frame_center_h12_index: local.frame_center_h12_index,
frame_center_h11_index: local.frame_center_h11_index,
}
}
}
impl From<Connectivity> for ConnectivityLocal {
fn from(remote: Connectivity) -> Self {
Self {
id: remote.id,
id_local: None,
session_id: remote.session_id,
device_id: remote.device_id,
ancestor_id_local: None,
inserted_at: remote.inserted_at,
timestamp_start: remote.timestamp_start,
signal: remote.signal,
noise: remote.noise,
altitude: remote.altitude,
heading: remote.heading,
location: remote.location,
h14_index: remote.h14_index,
h13_index: remote.h13_index,
h12_index: remote.h12_index,
h11_index: remote.h11_index,
battery_percentage: remote.battery_percentage,
frequency_hz: remote.frequency_hz,
bandwidth_hz: remote.bandwidth_hz,
associated_station: remote.associated_station,
mode: remote.mode,
battery_volts: remote.battery_volts,
link_type: remote.link_type,
quality_normalized: remote.quality_normalized,
secondary_battery_percentage: remote.secondary_battery_percentage,
secondary_battery_volts: remote.secondary_battery_volts,
frame_center_location: remote.frame_center_location,
frame_center_altitude: remote.frame_center_altitude,
base_device_online: remote.base_device_online,
frame_center_h14_index: remote.frame_center_h14_index,
frame_center_h13_index: remote.frame_center_h13_index,
frame_center_h12_index: remote.frame_center_h12_index,
frame_center_h11_index: remote.frame_center_h11_index,
}
}
}
impl Default for ConnectivityLocal {
fn default() -> Self {
Self {
id: None,
id_local: None,
session_id: None,
device_id: None,
ancestor_id_local: None,
inserted_at: None,
timestamp_start: String::new(),
signal: None,
noise: None,
altitude: 0.0,
heading: 0.0,
location: None,
h14_index: String::new(),
h13_index: String::new(),
h12_index: String::new(),
h11_index: String::new(),
battery_percentage: None,
frequency_hz: None,
bandwidth_hz: None,
associated_station: None,
mode: None,
battery_volts: None,
link_type: LinkType::Unknown,
quality_normalized: None,
secondary_battery_percentage: None,
secondary_battery_volts: None,
frame_center_location: None,
frame_center_altitude: None,
base_device_online: None,
frame_center_h14_index: None,
frame_center_h13_index: None,
frame_center_h12_index: None,
frame_center_h11_index: None,
}
}
}
impl Default for Connectivity {
fn default() -> Self {
ConnectivityLocal::default().into()
}
}
impl Syncable for ConnectivityLocal {
fn id(&self) -> Option<i64> {
self.id
}
fn set_id(&mut self, id: i64) {
self.id = Some(id);
}
fn id_local(&self) -> Option<String> {
self.id_local.clone()
}
fn set_id_local(&mut self, id_local: String) {
self.id_local = Some(id_local);
}
}
impl AncestorLocal for ConnectivityLocal {
fn ancestor_id_local(&self) -> Option<String> {
self.ancestor_id_local.clone()
}
fn set_ancestor_id_local(&mut self, ancestor_id_local: String) {
self.ancestor_id_local = Some(ancestor_id_local);
}
}
impl Connectivity {
#[allow(clippy::too_many_arguments)]
pub fn new(
session_id: Option<i64>,
device_id: Option<i64>,
timestamp_start: u64,
signal: Option<f64>,
noise: Option<f64>,
altitude: f64,
heading: f64,
location: String,
h14_index: String,
h13_index: String,
h12_index: String,
h11_index: String,
battery_percentage: Option<f32>,
frequency_hz: Option<f32>,
bandwidth_hz: Option<f32>,
associated_station: Option<String>,
mode: Option<String>,
battery_volts: Option<f32>,
link_type: LinkType,
quality_normalized: Option<f32>,
secondary_battery_percentage: Option<f32>,
secondary_battery_volts: Option<f32>,
) -> Self {
use chrono::{DateTime, Utc};
let timestamp_start = DateTime::from_timestamp(timestamp_start as i64, 0)
.unwrap_or_else(|| DateTime::<Utc>::from_timestamp(0, 0).expect("Unix epoch is valid"))
.to_rfc3339();
Self {
session_id,
device_id,
timestamp_start,
signal,
noise,
altitude,
heading,
location: Some(location),
h14_index,
h13_index,
h12_index,
h11_index,
battery_percentage,
frequency_hz,
bandwidth_hz,
associated_station,
mode,
battery_volts,
link_type,
quality_normalized,
secondary_battery_percentage,
secondary_battery_volts,
..Default::default()
}
}
}
impl ConnectivityLocal {
#[allow(clippy::too_many_arguments)]
pub fn new(
session_id: Option<i64>,
device_id: Option<i64>,
timestamp_start: u64,
signal: Option<f64>,
noise: Option<f64>,
altitude: f64,
heading: f64,
location: String,
h14_index: String,
h13_index: String,
h12_index: String,
h11_index: String,
battery_percentage: Option<f32>,
frequency_hz: Option<f32>,
bandwidth_hz: Option<f32>,
associated_station: Option<String>,
mode: Option<String>,
battery_volts: Option<f32>,
link_type: LinkType,
quality_normalized: Option<f32>,
secondary_battery_percentage: Option<f32>,
secondary_battery_volts: Option<f32>,
) -> Self {
Connectivity::new(
session_id,
device_id,
timestamp_start,
signal,
noise,
altitude,
heading,
location,
h14_index,
h13_index,
h12_index,
h11_index,
battery_percentage,
frequency_hz,
bandwidth_hz,
associated_station,
mode,
battery_volts,
link_type,
quality_normalized,
secondary_battery_percentage,
secondary_battery_volts,
)
.into()
}
}