#![allow(non_snake_case)]
#![allow(non_upper_case_globals)] #![allow(dead_code)]
use crate::ported::crt::ColorElements;
use crate::ported::meter::{Meter, MeterClass, Meter_class, LED_METERMODE, TEXT_METERMODE};
use crate::ported::object::ObjectClass;
pub fn DateTimeMeter_updateValues(this: &mut Meter) {
let secs = unsafe { ((*this.host).realtimeMs / 1000) as libc::time_t };
let mut result: libc::tm = unsafe { std::mem::zeroed() };
unsafe {
libc::localtime_r(&secs, &mut result);
}
let fmt: &str = match this.uiName {
"Clock" => "%H:%M:%S",
"Date" => "%F",
_ => "%F %H:%M:%S", };
let cfmt = std::ffi::CString::new(fmt).expect("static strftime format has no NUL");
let mut buf = [0u8; 64]; let n = unsafe {
libc::strftime(
buf.as_mut_ptr() as *mut libc::c_char,
buf.len(),
cfmt.as_ptr(),
&result,
)
};
this.txtBuffer = String::from_utf8_lossy(&buf[..n]).into_owned();
}
static ClockMeter_attributes: [i32; 1] = [ColorElements::CLOCK as i32];
static DateMeter_attributes: [i32; 1] = [ColorElements::DATE as i32];
static DateTimeMeter_attributes: [i32; 1] = [ColorElements::DATETIME as i32];
pub static ClockMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: None,
init: None,
done: None,
updateMode: None,
updateValues: Some(DateTimeMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: TEXT_METERMODE,
supportedModes: (1 << TEXT_METERMODE) | (1 << LED_METERMODE),
total: 0.0,
attributes: &ClockMeter_attributes,
name: "Clock",
uiName: "Clock",
caption: "Time: ",
description: None,
maxItems: 0,
isMultiColumn: false,
isPercentChart: false,
};
pub static DateMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: None,
init: None,
done: None,
updateMode: None,
updateValues: Some(DateTimeMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: TEXT_METERMODE,
supportedModes: (1 << TEXT_METERMODE) | (1 << LED_METERMODE),
total: 0.0,
attributes: &DateMeter_attributes,
name: "Date",
uiName: "Date",
caption: "Date: ",
description: None,
maxItems: 0,
isMultiColumn: false,
isPercentChart: false,
};
pub static DateTimeMeter_class: MeterClass = MeterClass {
super_: ObjectClass {
extends: Some(&Meter_class.super_),
},
display: None,
init: None,
done: None,
updateMode: None,
updateValues: Some(DateTimeMeter_updateValues),
draw: None,
getCaption: None,
getUiName: None,
defaultMode: TEXT_METERMODE,
supportedModes: (1 << TEXT_METERMODE) | (1 << LED_METERMODE),
total: 0.0,
attributes: &DateTimeMeter_attributes,
name: "DateTime",
uiName: "Date and Time",
caption: "Date & Time: ",
description: None,
maxItems: 0,
isMultiColumn: false,
isPercentChart: false,
};
#[cfg(test)]
mod tests {
use super::*;
use crate::ported::linux::linuxmachine::LinuxMachine;
use crate::ported::machine::Machine;
fn meter(ui_name: &'static str, realtime_ms: u64) -> Meter {
let host = Box::leak(Box::new(LinuxMachine {
super_: Machine {
realtimeMs: realtime_ms,
..Default::default()
},
..Default::default()
}));
Meter {
uiName: ui_name,
host: &host.super_ as *const crate::ported::machine::Machine,
..Meter::empty()
}
}
#[test]
fn clock_is_hh_mm_ss() {
let mut m = meter("Clock", 1_000_000_000_000); DateTimeMeter_updateValues(&mut m);
assert_eq!(m.txtBuffer.len(), 8);
assert_eq!(m.txtBuffer.matches(':').count(), 2);
}
#[test]
fn date_is_iso_ymd() {
let mut m = meter("Date", 1_000_000_000_000);
DateTimeMeter_updateValues(&mut m);
assert_eq!(m.txtBuffer.len(), 10);
assert_eq!(m.txtBuffer.matches('-').count(), 2);
}
#[test]
fn datetime_is_date_space_time() {
let mut m = meter("Date and Time", 1_000_000_000_000);
DateTimeMeter_updateValues(&mut m);
assert_eq!(m.txtBuffer.len(), 19);
assert_eq!(m.txtBuffer.matches(':').count(), 2);
assert_eq!(m.txtBuffer.matches('-').count(), 2);
}
}