1
// Do not edit this file as it will be overwritten if codegen is rerun
2

            
3
//! C-interface for the component.
4
//! This code must be unsafe.
5
//! Assumptions about correctness are introduced and need to be verified by other means.
6

            
7
use data::*;
8

            
9
#[cfg(test)]
10
use std::sync::Mutex;
11

            
12
#[cfg(not(test))]
13
extern "C" {
14
  fn get_current_temp(value: *mut Isolette_Data_Model::Temp) -> bool;
15
  fn get_desired_temp(value: *mut Isolette_Data_Model::Set_Points) -> bool;
16
  fn put_heat_control(value: *mut Isolette_Data_Model::On_Off) -> bool;
17
}
18

            
19
244
pub fn unsafe_get_current_temp() -> Isolette_Data_Model::Temp
20
244
{
21
244
  unsafe {
22
244
    let value: *mut Isolette_Data_Model::Temp = &mut Isolette_Data_Model::Temp::default();
23
244
    get_current_temp(value);
24
244
    return *value;
25
244
  }
26
244
}
27

            
28
244
pub fn unsafe_get_desired_temp() -> Isolette_Data_Model::Set_Points
29
244
{
30
244
  unsafe {
31
244
    let value: *mut Isolette_Data_Model::Set_Points = &mut Isolette_Data_Model::Set_Points::default();
32
244
    get_desired_temp(value);
33
244
    return *value;
34
244
  }
35
244
}
36

            
37
770
pub fn unsafe_put_heat_control(value: &Isolette_Data_Model::On_Off) -> bool
38
770
{
39
770
  unsafe {
40
770
    return put_heat_control(value as *const Isolette_Data_Model::On_Off as *mut Isolette_Data_Model::On_Off);
41
770
  }
42
770
}
43

            
44
//////////////////////////////////////////////////////////////////////////////////
45
// Testing Versions
46
//////////////////////////////////////////////////////////////////////////////////
47

            
48
#[cfg(test)]
49
lazy_static::lazy_static! {
50
  // simulate the global C variables that point to the microkit shared memory regions.  In a full
51
  // microkit system we would be able to mutate the shared memory for out ports since they're r/w,
52
  // but we couldn't do that for in ports since they are read-only
53
  pub static ref IN_current_temp: Mutex<Option<Isolette_Data_Model::Temp>> = Mutex::new(None);
54
  pub static ref IN_desired_temp: Mutex<Option<Isolette_Data_Model::Set_Points>> = Mutex::new(None);
55
  pub static ref OUT_heat_control: Mutex<Option<Isolette_Data_Model::On_Off>> = Mutex::new(None);
56
}
57

            
58
#[cfg(test)]
59
526
pub fn initialize_test_globals() {
60
526
  unsafe {
61
526
    *IN_current_temp.lock().unwrap_or_else(|e| e.into_inner()) = None;
62
526
    *IN_desired_temp.lock().unwrap_or_else(|e| e.into_inner()) = None;
63
526
    *OUT_heat_control.lock().unwrap_or_else(|e| e.into_inner()) = None;
64
526
  }
65
526
}
66

            
67
#[cfg(test)]
68
244
pub fn get_current_temp(value: *mut Isolette_Data_Model::Temp) -> bool
69
244
{
70
244
  unsafe {
71
244
    let guard = IN_current_temp.lock().unwrap_or_else(|e| e.into_inner());
72
244
    *value = guard.expect("Not expecting None");
73
244
    true
74
244
  }
75
244
}
76

            
77
#[cfg(test)]
78
244
pub fn get_desired_temp(value: *mut Isolette_Data_Model::Set_Points) -> bool
79
244
{
80
244
  unsafe {
81
244
    let guard = IN_desired_temp.lock().unwrap_or_else(|e| e.into_inner());
82
244
    *value = guard.expect("Not expecting None");
83
244
    true
84
244
  }
85
244
}
86

            
87
#[cfg(test)]
88
770
pub fn put_heat_control(value: *mut Isolette_Data_Model::On_Off) -> bool
89
770
{
90
770
  unsafe {
91
770
    *OUT_heat_control.lock().unwrap_or_else(|e| e.into_inner()) = Some(*value);
92
770
    return true;
93
770
  }
94
770
}