You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

188 lines
4.0 KiB
Rust

use magic;
use libc::c_void;
use std::rc::Rc;
pub enum OverrideCode {
IssueOverride = 1,
IssuePrivileged = 2,
IssueAdmin = 3,
IssueInputFloor = 4,
IssueManualMode = 5,
IssueNormalMode = 6,
IssueFlash = 7,
IssueToggleLight = 8,
IssueSetLightColor = 9,
}
pub fn toOverrideCode(i: i32) -> OverrideCode {
match i {
1 => OverrideCode::IssueOverride,
2 => OverrideCode::IssuePrivileged,
3 => OverrideCode::IssueAdmin,
4 => OverrideCode::IssueInputFloor,
5 => OverrideCode::IssueManualMode,
6 => OverrideCode::IssueNormalMode,
7 => OverrideCode::IssueFlash,
8 => OverrideCode::IssueToggleLight,
9 => OverrideCode::IssueSetLightColor,
_ => panic!("Unexpected override code: {}", i)
}
}
pub enum ErrorCode {
DoubleAuthorize = 1,
DoubleFree = 2,
AccessDenied = 3,
}
pub fn toErrorCode(i: i32) -> ErrorCode {
match i {
1 => ErrorCode::DoubleAuthorize,
2 => ErrorCode::DoubleFree,
3 => ErrorCode::AccessDenied,
_ => panic!("Unexpected error code: {}", i)
}
}
struct AuthorizedSessionInner(*const c_void);
#[derive(Clone)]
pub struct AuthorizedSession
{
session: Rc<AuthorizedSessionInner>
}
impl Drop for AuthorizedSessionInner {
fn drop(&mut self) {
unsafe {
magic::free_override_session(self.0);
}
}
}
pub fn authorize_override() -> Result<AuthorizedSession,ErrorCode> {
if is_override() || is_privileged() || is_admin() {
return Result::Err(ErrorCode::DoubleAuthorize)
}
let session = unsafe {
magic::issue_override_code(OverrideCode::IssueOverride as i32);
magic::poll_override_session()
};
let session = AuthorizedSession {
session: Rc::new(AuthorizedSessionInner(session))
};
check_error(session)
}
pub fn authorize_privileged() -> Result<AuthorizedSession,ErrorCode> {
if is_override() || is_privileged() || is_admin() {
return Result::Err(ErrorCode::DoubleAuthorize)
}
let session = unsafe {
magic::issue_override_code(OverrideCode::IssuePrivileged as i32);
magic::poll_physical_override_privileged_session()
};
let session = AuthorizedSession {
session: Rc::new(AuthorizedSessionInner(session))
};
check_error(session)
}
pub fn authorize_admin() -> Result<AuthorizedSession,ErrorCode> {
if is_override() || is_privileged() || is_admin() {
return Result::Err(ErrorCode::DoubleAuthorize)
}
let session = unsafe {
magic::issue_override_code(OverrideCode::IssueAdmin as i32);
magic::poll_physical_override_admin_session()
};
let session = AuthorizedSession {
session: Rc::new(AuthorizedSessionInner(session))
};
check_error(session)
}
pub fn reset_state()
{
unsafe {
magic::override_reset_state();
}
}
pub fn check_error<T>(t: T) -> Result<T,ErrorCode>
{
let err = unsafe {
magic::poll_override_error()
};
if err==0 {
Result::Ok(t)
} else {
Result::Err(toErrorCode(err))
}
}
pub fn input_floor(floor: i32) -> Result<(),ErrorCode>
{
unsafe {
magic::override_input_floor(floor);
}
check_error(())
}
pub fn manual_mode() -> Result<(),ErrorCode>
{
unsafe {
magic::override_manual_mode();
}
check_error(())
}
pub fn normal_mode() -> Result<(),ErrorCode>
{
unsafe {
magic::override_normal_mode();
}
check_error(())
}
pub fn flash(pattern: i32) -> Result<(),ErrorCode>
{
unsafe {
magic::elevator_display_flash(pattern);
}
check_error(())
}
pub fn toggle_light(light_id: i32) -> Result<(),ErrorCode>
{
unsafe {
magic::elevator_display_toggle_light(light_id);
}
check_error(())
}
pub fn set_light_color(light_id: i32, color: i32) -> Result<(),ErrorCode>
{
unsafe {
magic::elevator_display_set_light_color(light_id, color);
}
check_error(())
}
pub fn is_override() -> bool
{
unsafe {
magic::is_override() != 0
}
}
pub fn is_privileged() -> bool
{
unsafe {
magic::is_privileged() != 0
}
}
pub fn is_admin() -> bool
{
unsafe {
magic::is_admin() != 0
}
}