// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause // SPDX-FileCopyrightText: 2022 Linaro Ltd. // SPDX-FileCopyrightText: 2022 Viresh Kumar mod common; mod line_config { use gpiosim_sys::Sim; use libgpiod::chip::Chip; use libgpiod::line::{ self, Bias, Direction, Drive, Edge, EventClock, SettingKind, SettingVal, Value, }; #[test] fn settings() { let mut lsettings1 = line::Settings::new().unwrap(); lsettings1 .set_direction(Direction::Input) .unwrap() .set_edge_detection(Some(Edge::Both)) .unwrap() .set_bias(Some(Bias::PullDown)) .unwrap() .set_drive(Drive::PushPull) .unwrap(); let mut lsettings2 = line::Settings::new().unwrap(); lsettings2 .set_direction(Direction::Output) .unwrap() .set_active_low(true) .set_event_clock(EventClock::Realtime) .unwrap() .set_output_value(Value::Active) .unwrap(); // Add settings for multiple lines let mut lconfig = line::Config::new().unwrap(); lconfig.add_line_settings(&[0, 1, 2], lsettings1).unwrap(); lconfig.add_line_settings(&[4, 5], lsettings2).unwrap(); let settings_map = lconfig.line_settings().unwrap(); // Retrieve settings let lsettings = settings_map.get(1).unwrap(); assert_eq!( lsettings.prop(SettingKind::Direction).unwrap(), SettingVal::Direction(Direction::Input) ); assert_eq!( lsettings.prop(SettingKind::EdgeDetection).unwrap(), SettingVal::EdgeDetection(Some(Edge::Both)) ); assert_eq!( lsettings.prop(SettingKind::Bias).unwrap(), SettingVal::Bias(Some(Bias::PullDown)) ); assert_eq!( lsettings.prop(SettingKind::Drive).unwrap(), SettingVal::Drive(Drive::PushPull) ); let lsettings = settings_map.get(5).unwrap(); assert_eq!( lsettings.prop(SettingKind::Direction).unwrap(), SettingVal::Direction(Direction::Output) ); assert_eq!( lsettings.prop(SettingKind::ActiveLow).unwrap(), SettingVal::ActiveLow(true) ); assert_eq!( lsettings.prop(SettingKind::EventClock).unwrap(), SettingVal::EventClock(EventClock::Realtime) ); assert_eq!( lsettings.prop(SettingKind::OutputValue).unwrap(), SettingVal::OutputValue(Value::Active) ); } #[test] fn set_global_output_values() { let sim = Sim::new(Some(4), None, true).unwrap(); let mut settings = line::Settings::new().unwrap(); settings.set_direction(Direction::Output).unwrap(); let mut config = line::Config::new().unwrap(); config .add_line_settings(&[0, 1, 2, 3], settings) .unwrap() .set_output_values(&[ Value::Active, Value::InActive, Value::Active, Value::InActive, ]) .unwrap(); let chip = Chip::open(&sim.dev_path()).unwrap(); let _request = chip.request_lines(None, &config); assert_eq!(sim.val(0).unwrap(), gpiosim_sys::Value::Active); assert_eq!(sim.val(1).unwrap(), gpiosim_sys::Value::InActive); assert_eq!(sim.val(2).unwrap(), gpiosim_sys::Value::Active); assert_eq!(sim.val(3).unwrap(), gpiosim_sys::Value::InActive); } #[test] fn read_back_global_output_values() { let mut settings = line::Settings::new().unwrap(); settings .set_direction(Direction::Output) .unwrap() .set_output_value(Value::Active) .unwrap(); let mut config = line::Config::new().unwrap(); config .add_line_settings(&[0, 1, 2, 3], settings) .unwrap() .set_output_values(&[ Value::Active, Value::InActive, Value::Active, Value::InActive, ]) .unwrap(); assert_eq!( config .line_settings() .unwrap() .get(1) .unwrap() .output_value() .unwrap(), Value::InActive ); } }