Skip to content

Commit fab0b47

Browse files
committed
Most feedback covered
1 parent 7c40dd5 commit fab0b47

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

FprimeZephyrReference/Components/Drv/Rv3028Manager/Rv3028Manager.cpp

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ Rv3028Manager ::~Rv3028Manager() {}
2525
void Rv3028Manager ::timeGetPort_handler(FwIndexType portNum, Fw::Time& time) {
2626
// Check device readiness
2727
if (!device_is_ready(this->rv3028)) {
28-
Fw::Logger::log("Rv2038 not ready");
28+
// Use logger instead of events since this fn is in a critical path for FPrime
29+
// to get time. Events require time, if this method fails an event will fail.
30+
Fw::Logger::log("RV2038 not ready");
2931
return;
3032
}
3133

32-
// Fetch time from RTC
33-
struct rtc_time time_rtc = {};
34-
rtc_get_time(this->rv3028, &time_rtc);
35-
36-
// Convert time to POSIX time_t format
37-
struct tm* time_tm = rtc_time_to_tm(&time_rtc);
38-
time_t time_posix = timeutil_timegm(time_tm);
34+
I32 posix_time = this->getPosixTime();
35+
if (posix_time < 0) {
36+
Fw::Logger::log("getPosixTime returned invalid time");
37+
return;
38+
}
3939

4040
// Set FPrime time object
41-
time.set(TimeBase::TB_WORKSTATION_TIME, 0, static_cast<U32>(time_posix), 0);
41+
time.set(TimeBase::TB_WORKSTATION_TIME, 0, static_cast<U32>(posix_time), 0);
4242
}
4343

4444
U32 Rv3028Manager ::timeRead_handler(FwIndexType portNum) {
@@ -47,16 +47,16 @@ U32 Rv3028Manager ::timeRead_handler(FwIndexType portNum) {
4747
this->log_WARNING_HI_DeviceNotReady();
4848
return 0;
4949
}
50+
this->log_WARNING_HI_DeviceNotReady_ThrottleClear();
5051

51-
// Fetch time from RTC
52-
struct rtc_time time_rtc = {};
53-
rtc_get_time(this->rv3028, &time_rtc);
54-
55-
// Convert time to POSIX time_t format
56-
struct tm* time_tm = rtc_time_to_tm(&time_rtc);
57-
time_t time_posix = timeutil_timegm(time_tm);
52+
I32 posix_time = this->getPosixTime();
53+
if (posix_time < 0) {
54+
this->log_WARNING_HI_InvalidTime();
55+
return 0;
56+
}
57+
this->log_WARNING_HI_InvalidTime_ThrottleClear();
5858

59-
return time_posix;
59+
return static_cast<U32>(posix_time);
6060
}
6161

6262
void Rv3028Manager ::timeSet_handler(FwIndexType portNum, const Drv::TimeData& t) {
@@ -65,20 +65,24 @@ void Rv3028Manager ::timeSet_handler(FwIndexType portNum, const Drv::TimeData& t
6565
this->log_WARNING_HI_DeviceNotReady();
6666
return;
6767
}
68+
this->log_WARNING_HI_DeviceNotReady_ThrottleClear();
6869

6970
// Populate rtc_time structure from TimeData
7071
const struct rtc_time time_rtc = {
7172
.tm_sec = 0,
72-
.tm_min = t.get_Minute(),
73-
.tm_hour = t.get_Hour(),
74-
.tm_mday = t.get_Day(),
75-
.tm_mon = t.get_Month() - 1, // month [0-11]
76-
.tm_year = t.get_Year() - 1900, // year since 1900
73+
.tm_min = static_cast<int>(t.get_Minute()),
74+
.tm_hour = static_cast<int>(t.get_Hour()),
75+
.tm_mday = static_cast<int>(t.get_Day()),
76+
.tm_mon = static_cast<int>(t.get_Month() - 1), // month [0-11]
77+
.tm_year = static_cast<int>(t.get_Year() - 1900), // year since 1900
7778
.tm_wday = 0,
7879
.tm_yday = 0,
7980
.tm_isdst = 0,
8081
};
8182

83+
// Event current time to correlate prior events when new time is set
84+
this->log_ACTIVITY_HI_TimeGet(this->getPosixTime());
85+
8286
// Set time on RTC
8387
const int status = rtc_set_time(this->rv3028, &time_rtc);
8488

@@ -90,4 +94,24 @@ void Rv3028Manager ::timeSet_handler(FwIndexType portNum, const Drv::TimeData& t
9094
}
9195
}
9296

97+
// ----------------------------------------------------------------------
98+
// Private helper methods
99+
// ----------------------------------------------------------------------
100+
I32 Rv3028Manager ::getPosixTime() {
101+
struct rtc_time time_rtc = {};
102+
rtc_get_time(this->rv3028, &time_rtc);
103+
104+
// Convert time to POSIX time_t format
105+
struct tm* time_tm = rtc_time_to_tm(&time_rtc);
106+
107+
errno = 0;
108+
time_t posix_time = timeutil_timegm(time_tm);
109+
if (errno == ERANGE) {
110+
Fw::Logger::log("RV2038 returned invalid time");
111+
return -1;
112+
}
113+
114+
return posix_time;
115+
}
116+
93117
} // namespace Drv

FprimeZephyrReference/Components/Drv/Rv3028Manager/Rv3028Manager.fpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,21 @@ module Drv {
3333
##############################################################################
3434

3535
@ DeviceNotReady event indicates that the RV3028 is not ready
36-
event DeviceNotReady() severity warning high id 0 format "RV3028 not ready"
36+
event DeviceNotReady() severity warning high id 0 format "RV3028 not ready" throttle 5
37+
38+
@ InvalidTime event indicates that the RV3028 returned an invalid time
39+
event InvalidTime() severity warning high id 1 format "RV3028 returned invalid time" throttle 5
40+
41+
@ TimeGet event indicates that the time was read successfully
42+
event TimeGet(
43+
t: U32 @< POSIX time read from RTC
44+
) severity activity high id 2 format "RV3028 Time: {}"
3745

3846
@ TimeSet event indicates that the time was set successfully
39-
event TimeSet() severity activity high id 1 format "Time set on RV3028"
47+
event TimeSet() severity activity high id 3 format "Time set on RV3028"
4048

4149
@ TimeNotSet event indicates that the time was not set successfully
42-
event TimeNotSet() severity warning high id 2 format "Time not set on RV3028"
50+
event TimeNotSet() severity warning high id 4 format "Time not set on RV3028"
4351

4452
###############################################################################
4553
# Standard AC Ports: Required for Channels, Events, Commands, and Parameters #

FprimeZephyrReference/Components/Drv/Rv3028Manager/Rv3028Manager.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#define Components_Rv3028Manager_HPP
88

99
#include "FprimeZephyrReference/Components/Drv/Rv3028Manager/Rv3028ManagerComponentAc.hpp"
10+
11+
#include <cerrno>
12+
1013
#include <Fw/Logger/Logger.hpp>
1114

1215
#include <zephyr/device.h>
@@ -56,6 +59,13 @@ class Rv3028Manager final : public Rv3028ManagerComponentBase {
5659
void timeSet_handler(FwIndexType portNum, //!< The port number
5760
const Drv::TimeData& time) override;
5861

62+
// ----------------------------------------------------------------------
63+
// Private helper methods
64+
// ----------------------------------------------------------------------
65+
66+
//! Helper method to get POSIX time from RTC
67+
I32 getPosixTime();
68+
5969
//! Zephyr device stores the initialized RV2038 sensor
6070
const struct device* rv3028;
6171
};

FprimeZephyrReference/Components/RtcManager/docs/sdd.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ classDiagram
6666
sequenceDiagram
6767
participant Ground Station
6868
participant RtcManager
69-
participant RV3028 Driver
69+
participant RV3028 Manager
7070
Ground Station-->>RtcManager: Send SET_TIME command with time data
71-
RtcManager->>RV3028 Driver: Call timeSet port with time data
71+
RtcManager->>RV3028 Manager: Call timeSet port with time data
7272
```
7373

7474
### `GET_TIME` Command
@@ -78,10 +78,10 @@ sequenceDiagram
7878
participant Ground Station
7979
participant Event Log
8080
participant RtcManager
81-
participant RV3028 Driver
81+
participant RV3028 Manager
8282
Ground Station-->>RtcManager: Send GET_TIME command
83-
RtcManager->>RV3028 Driver: Call timeRead port
84-
RV3028 Driver->>RtcManager: Return time data
83+
RtcManager->>RV3028 Manager: Call timeRead port
84+
RV3028 Manager->>RtcManager: Return time data
8585
RtcManager->>Event Log: Emit GetTime event with retrieved time
8686
```
8787

0 commit comments

Comments
 (0)