11#include "mruby.h"
22#include "mruby/string.h"
33#include "mruby/presym.h"
4+ #include "mruby/array.h"
45
56#include "../../include/hal.h"
67
@@ -163,6 +164,38 @@ mrb_kernel_p(mrb_state *mrb, mrb_value self)
163164 }
164165 return mrb_nil_value ();
165166}
167+
168+ #include <time.h>
169+
170+ static mrb_value
171+ mrb_s_set_hwclock (mrb_state * mrb , mrb_value self )
172+ {
173+ mrb_int tv_sec , tv_nsec ;
174+ mrb_get_args (mrb , "ii" , & tv_sec , & tv_nsec );
175+ const struct timespec ts = {
176+ .tv_sec = (time_t )tv_sec ,
177+ .tv_nsec = (long )tv_nsec ,
178+ };
179+ if (Machine_set_hwclock (& ts )) {
180+ return mrb_true_value ();
181+ } else {
182+ mrb_raise (mrb , E_RUNTIME_ERROR , "Failed to set hwclock" );
183+ }
184+ }
185+
186+ static mrb_value
187+ mrb_s_get_hwclock (mrb_state * mrb , mrb_value self )
188+ {
189+ struct timespec ts = {0 };
190+ if (Machine_get_hwclock (& ts )) {
191+ mrb_value ary = mrb_ary_new_capa (mrb , 2 );
192+ mrb_ary_set (mrb , ary , 0 , mrb_int_value (mrb , (mrb_int )ts .tv_sec ));
193+ mrb_ary_set (mrb , ary , 1 , mrb_int_value (mrb , (mrb_int )ts .tv_nsec ));
194+ return ary ;
195+ } else {
196+ mrb_raise (mrb , E_RUNTIME_ERROR , "Failed to get hwclock" );
197+ }
198+ }
166199#endif
167200
168201void
@@ -186,6 +219,9 @@ mrb_picoruby_machine_gem_init(mrb_state* mrb)
186219 mrb_define_method_id (mrb , module_Kernel , MRB_SYM (puts ), mrb_puts , MRB_ARGS_ANY ());
187220 mrb_define_method_id (mrb , module_Kernel , MRB_SYM (print ), mrb_print , MRB_ARGS_ANY ());
188221 mrb_define_method_id (mrb , module_Kernel , MRB_SYM (p ), mrb_kernel_p , MRB_ARGS_ANY ());
222+
223+ mrb_define_class_method_id (mrb , class_Machine , MRB_SYM (set_hwclock ), mrb_s_set_hwclock , MRB_ARGS_REQ (2 ));
224+ mrb_define_class_method_id (mrb , class_Machine , MRB_SYM (get_hwclock ), mrb_s_get_hwclock , MRB_ARGS_REQ (1 ));
189225#endif
190226}
191227
0 commit comments