11#pragma once
22
3+ #include < ctime>
34#include < functional>
45
56#include " base_peripheral.hpp"
@@ -96,13 +97,79 @@ class Bm8563 : public BasePeripheral<> {
9697 }
9798 }
9899
99- // / @brief Get the date and time.
100+ // ///////////////////////////////////////////////////////////////////////////
101+ // std::tm based APIs (recommended for portability)
102+ // ///////////////////////////////////////////////////////////////////////////
103+
104+ // / @brief Set the time using std::tm structure
105+ // / @param time The time to set
106+ // / @param ec The error code to set if an error occurs
107+ // / @return True if the time was set successfully, false otherwise
108+ bool set_time (const std::tm &time, std::error_code &ec) {
109+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
110+
111+ // Validate time values
112+ if (time.tm_year < 0 || time.tm_year > 199 || // Years 1900-2099
113+ time.tm_mon < 0 || time.tm_mon > 11 || time.tm_mday < 1 || time.tm_mday > 31 ||
114+ time.tm_hour < 0 || time.tm_hour > 23 || time.tm_min < 0 || time.tm_min > 59 ||
115+ time.tm_sec < 0 || time.tm_sec > 59 ) {
116+ ec = std::make_error_code (std::errc::invalid_argument);
117+ return false ;
118+ }
119+
120+ // Convert std::tm to device-specific format and set
121+ DateTime dt;
122+ dt.date .year = time.tm_year + 1900 ;
123+ dt.date .month = time.tm_mon + 1 ;
124+ dt.date .weekday = time.tm_wday ;
125+ dt.date .day = time.tm_mday ;
126+ dt.time .hour = time.tm_hour ;
127+ dt.time .minute = time.tm_min ;
128+ dt.time .second = time.tm_sec ;
129+
130+ set_date_time (dt, ec);
131+ return !ec;
132+ }
133+
134+ // / @brief Get the time using std::tm structure
135+ // / @param ec The error code to set if an error occurs
136+ // / @return The time from the device
137+ std::tm get_time (std::error_code &ec) {
138+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
139+
140+ auto dt = get_date_time (ec);
141+ if (ec) {
142+ return {};
143+ }
144+
145+ std::tm time = {};
146+ time.tm_sec = dt.time .second ;
147+ time.tm_min = dt.time .minute ;
148+ time.tm_hour = dt.time .hour ;
149+ time.tm_mday = dt.date .day ;
150+ time.tm_mon = dt.date .month - 1 ;
151+ time.tm_year = dt.date .year - 1900 ;
152+ time.tm_wday = dt.date .weekday ;
153+ time.tm_yday = -1 ; // Let mktime calculate it
154+ time.tm_isdst = -1 ; // Let system determine DST
155+
156+ // Normalize the time structure
157+ mktime (&time);
158+
159+ return time;
160+ }
161+
162+ // ///////////////////////////////////////////////////////////////////////////
163+ // Device-specific APIs (for backward compatibility)
164+ // ///////////////////////////////////////////////////////////////////////////
165+
166+ // / @brief Get the date and time (device-specific format).
100167 // / @param ec The error code.
101168 // / @return The date and time.
102169 DateTime get_date_time (std::error_code &ec) {
103170 std::lock_guard<std::recursive_mutex> lock (base_mutex_);
104171 DateTime dt;
105- dt.time = get_time (ec);
172+ dt.time = get_time_device (ec);
106173 if (ec)
107174 return {};
108175 dt.date = get_date (ec);
@@ -111,18 +178,18 @@ class Bm8563 : public BasePeripheral<> {
111178 return dt;
112179 }
113180
114- // / @brief Set the date and time.
181+ // / @brief Set the date and time (device-specific format) .
115182 // / @param dt The date and time.
116183 // / @param ec The error code.
117184 void set_date_time (const DateTime &dt, std::error_code &ec) {
118185 std::lock_guard<std::recursive_mutex> lock (base_mutex_);
119186 set_date (dt.date , ec);
120187 if (ec)
121188 return ;
122- set_time (dt.time , ec);
189+ set_time_device (dt.time , ec);
123190 }
124191
125- // / @brief Get the date.
192+ // / @brief Get the date (device-specific format) .
126193 // / @param ec The error code.
127194 // / @return The date.
128195 Date get_date (std::error_code &ec) {
@@ -141,7 +208,7 @@ class Bm8563 : public BasePeripheral<> {
141208 return d;
142209 }
143210
144- // / @brief Set the date.
211+ // / @brief Set the date (device-specific format) .
145212 // / @param d The date.
146213 // / @param ec The error code.
147214 void set_date (const Date &d, std::error_code &ec) {
@@ -152,10 +219,10 @@ class Bm8563 : public BasePeripheral<> {
152219 write_many_to_register ((uint8_t )Registers::DATE, data, 4 , ec);
153220 }
154221
155- // / @brief Get the time.
222+ // / @brief Get the time (device-specific format) .
156223 // / @param ec The error code.
157224 // / @return The time.
158- Time get_time (std::error_code &ec) {
225+ Time get_time_device (std::error_code &ec) {
159226 logger_.info (" getting time" );
160227 uint8_t data[3 ];
161228 read_many_from_register ((uint8_t )Registers::TIME, data, 3 , ec);
@@ -169,10 +236,10 @@ class Bm8563 : public BasePeripheral<> {
169236 return t;
170237 }
171238
172- // / @brief Set the time.
239+ // / @brief Set the time (device-specific format) .
173240 // / @param t The time.
174241 // / @param ec The error code.
175- void set_time (const Time &t, std::error_code &ec) {
242+ void set_time_device (const Time &t, std::error_code &ec) {
176243 logger_.info (" Setting time" );
177244 const uint8_t data[] = {decimal_to_bcd (t.second ), decimal_to_bcd (t.minute ),
178245 decimal_to_bcd (t.hour )};
0 commit comments