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
4
pub fn unsafe_get_current_temp() -> Isolette_Data_Model::Temp
20
4
{
21
4
  unsafe {
22
4
    let value: *mut Isolette_Data_Model::Temp = &mut Isolette_Data_Model::Temp::default();
23
4
    get_current_temp(value);
24
4
    return *value;
25
4
  }
26
4
}
27

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

            
37
12
pub fn unsafe_put_heat_control(value: &Isolette_Data_Model::On_Off) -> bool
38
12
{
39
12
  unsafe {
40
12
    return put_heat_control(value as *const Isolette_Data_Model::On_Off as *mut Isolette_Data_Model::On_Off);
41
12
  }
42
12
}
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
8
pub fn initialize_test_globals() {
60
8
  unsafe {
61
8
    *IN_current_temp.lock().unwrap_or_else(|e| e.into_inner()) = None;
62
8
    *IN_desired_temp.lock().unwrap_or_else(|e| e.into_inner()) = None;
63
8
    *OUT_heat_control.lock().unwrap_or_else(|e| e.into_inner()) = None;
64
8
  }
65
8
}
66

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

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

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