Files
adcs_api
cbor_protocol
channel_protocol
clyde_3g_eps_api
clyde_3g_eps_service
comms_service
db_test
eps_api
example_rust_c_service
example_rust_service
extern_lib
file_protocol
file_service
gomspace_p31u_api
gomspace_p31u_service
iobc_supervisor_service
isis_ants
isis_ants_api
isis_ants_service
isis_imtq_api
isis_iobc_supervisor
kubos_app
kubos_app_service
kubos_build_helper
kubos_file_client
kubos_service
kubos_shell_client
kubos_system
kubos_telemetry_db
large_download
large_upload
local_comms_service
mai400
mai400_api
mai400_service
monitor_service
novatel_oem6_api
novatel_oem6_service
nsl_duplex_d2
nsl_duplex_d2_comms_service
obc_hs
radio_api
rust_i2c
rust_mission_app
rust_uart
scheduler_service
serial_comms_service
shell_protocol
shell_service
telemetry_service
uart_comms_client
udp_client
utils
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//
// Copyright (C) 2020 Kubos Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License")
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Contributed by Xueliang Bai <x.bai@sydney.edu.au> on behalf of the
// ARC Training Centre for CubeSats, UAVs & Their Applications (CUAVA) team (www.cuava.com.au)
// at the University of Sydney

use crate::eps::*;
use crate::ffi;

/// EPS system configuration structure
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct EpsSystemConfig {
    /// MPPT mode: 0: Hardware default, 1: MPPT, 2 Fixed software powerpoint
    pub ppt_mode: u8,
    /// Batter heater mode: 0 = OFF, 1 = ON
    pub battheater_mode: u8,
    /// Battery heater low
    pub battheater_low: i8,
    /// Battery heater high
    pub battheater_high: i8,
    /// Nominal output level
    pub output_normal_value: [u8; 8],
    /// Safe model output level
    pub output_safe_value: [u8; 8],
    /// Initial power on delay
    pub output_initial_on_delay: [u16; 8],
    /// Initial Power off delay
    pub output_initial_off_delay: [u16; 8],
    /// Set MPPT level
    pub vboost: [u16; 3],
}

impl EpsSystemConfig {
    #[doc(hidden)]
    pub fn new(k_epssysconf: &ffi::EpsSystemConfig) -> Result<EpsSystemConfig, EpsError> {
        Ok(EpsSystemConfig {
            ppt_mode: k_epssysconf.ppt_mode,
            battheater_mode: k_epssysconf.battheater_mode,
            battheater_low: k_epssysconf.battheater_low,
            battheater_high: k_epssysconf.battheater_high,
            output_normal_value: k_epssysconf.output_normal_value,
            output_safe_value: k_epssysconf.output_safe_value,
            output_initial_on_delay: k_epssysconf.output_initial_on_delay,
            output_initial_off_delay: k_epssysconf.output_initial_off_delay,
            vboost: k_epssysconf.vboost,
        })
    }
}

/// EPS battery configuration structure
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct EpsBatteryConfig {
    /// Battery Max level
    pub batt_maxvoltage: u16,
    /// Safe mode level
    pub batt_safevoltage: u16,
    /// Critical mode level
    pub batt_criticalvoltage: u16,
    /// Nominal mode level
    pub batt_normalvoltage: u16,
    /// reserved1
    pub reserved1: [u32; 2],
    /// reserved2
    pub reserved2: [u8; 4],
}

impl EpsBatteryConfig {
    #[doc(hidden)]
    pub fn new(k_epsbatconf: &ffi::EpsBatteryConfig) -> Result<EpsBatteryConfig, EpsError> {
        Ok(EpsBatteryConfig {
            batt_maxvoltage: k_epsbatconf.batt_maxvoltage,
            batt_safevoltage: k_epsbatconf.batt_safevoltage,
            batt_criticalvoltage: k_epsbatconf.batt_criticalvoltage,
            batt_normalvoltage: k_epsbatconf.batt_normalvoltage,
            reserved1: k_epsbatconf.reserved1,
            reserved2: k_epsbatconf.reserved2,
        })
    }
}

/* Changed counter_wdt_gnd and counter_boot from u32 to u16 to match the FFI*/
/// System telemetry fields returned from [`EpsHk`]
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct EpsHk {
    /// MPPT level
    pub vboost: [u16; 3],
    /// Battery Voltage
    pub vbatt: u16,
    /// Battery input current
    pub curin: [u16; 3],
    /// Sun sensor current
    pub cursun: u16,
    /// Total system current
    pub cursys: u16,
    /// Reserved1
    pub reserved1: u16,
    /// Current outputs
    pub curout: [u16; 6],
    /// output status
    pub output: [u8; 8],
    /// output on delay
    pub output_on_delta: [u16; 8],
    /// output off delay
    pub output_off_delta: [u16; 8],
    /// Current latchup setting
    pub latchup: [u16; 6],
    /// i2c watchdog time left
    pub wdt_i2c_time_left: u32,
    /// GND watchdog time left
    pub wdt_gnd_time_left: u32,
    /// CSP watchdog
    pub wdt_csp_pings_left: [u8; 2],
    /// i2c watchdog counter
    pub counter_wdt_i2c: u32,
    /// GND watchdog counter    
    pub counter_wdt_gnd: u16,
    /// CSP watchdog counter
    pub counter_wdt_csp: [u32; 2],
    /// Boot counter
    pub counter_boot: u16,
    /// Temperature
    pub temp: [i16; 6],
    /// Bootcause
    pub boot_cause: u8,
    /// Battery mode
    pub batt_mode: u8,
    /// Power point tracking mode
    pub ppt_mode: u8,
    /// Reserved2
    pub reserved2: u16,
}

impl EpsHk {
    #[doc(hidden)]
    pub fn new(k_epshk: &ffi::EpsHk) -> Result<EpsHk, EpsError> {
        Ok(EpsHk {
            vboost: k_epshk.vboost,
            vbatt: k_epshk.vbatt,
            curin: k_epshk.curin,
            cursun: k_epshk.cursun,
            cursys: k_epshk.cursys,
            reserved1: k_epshk.reserved1,
            curout: k_epshk.curout,
            output: k_epshk.output,
            output_on_delta: k_epshk.output_on_delta,
            output_off_delta: k_epshk.output_off_delta,
            latchup: k_epshk.latchup,
            wdt_i2c_time_left: k_epshk.wdt_i2c_time_left,
            wdt_gnd_time_left: k_epshk.wdt_gnd_time_left,
            wdt_csp_pings_left: k_epshk.wdt_csp_pings_left,
            counter_wdt_i2c: k_epshk.counter_wdt_i2c,
            counter_wdt_gnd: k_epshk.counter_wdt_gnd,
            counter_wdt_csp: k_epshk.counter_wdt_csp,
            counter_boot: k_epshk.counter_boot,
            temp: k_epshk.temp,
            boot_cause: k_epshk.boot_cause,
            batt_mode: k_epshk.batt_mode,
            ppt_mode: k_epshk.ppt_mode,
            reserved2: k_epshk.reserved2,
        })
    }
}