diff --git a/mrbgems/machine-pwm/src/pwm.c b/mrbgems/machine-pwm/src/pwm.c index 13ba8a7..d7dd59c 100644 --- a/mrbgems/machine-pwm/src/pwm.c +++ b/mrbgems/machine-pwm/src/pwm.c @@ -117,6 +117,31 @@ static mrb_value mrb_pwm_enabled_set(mrb_state *mrb, mrb_value self) { } } +static mrb_value mrb_pwm_duty_get(mrb_state *mrb, mrb_value self) { + mrb_pwm_t *pwm_ch = mrb_data_get_ptr(mrb, self, &mrb_pwm_type); + if (pwm_ch == NULL) { + mrb_raise(mrb, E_RUNTIME_ERROR, "Uninitialized PWM struct"); + } + + uint16_t duty = mrb_machine_pwm_impl_duty_get(pwm_ch->channel); + + return mrb_int_value(mrb, duty); +} + +static mrb_value mrb_pwm_duty_set(mrb_state *mrb, mrb_value self) { + mrb_value new_duty = mrb_get_arg1(mrb); + mrb_ensure_integer_type(mrb, new_duty); + + mrb_pwm_t *pwm_ch = mrb_data_get_ptr(mrb, self, &mrb_pwm_type); + if (pwm_ch == NULL) { + mrb_raise(mrb, E_RUNTIME_ERROR, "Uninitialized PWM struct"); + } + + mrb_machine_pwm_impl_duty_set(pwm_ch->channel, mrb_integer(new_duty)); + + return mrb_nil_value(); +} + void mrb_machine_pwm_gem_init(mrb_state *mrb) { /** * Example: @@ -139,6 +164,8 @@ void mrb_machine_pwm_gem_init(mrb_state *mrb) { mrb_define_method(mrb, class_pwm, "disable", mrb_pwm_disable, MRB_ARGS_NONE()); mrb_define_method(mrb, class_pwm, "enabled", mrb_pwm_enabled_get, MRB_ARGS_NONE()); mrb_define_method(mrb, class_pwm, "enabled=", mrb_pwm_enabled_set, MRB_ARGS_ARG(1, 0)); + mrb_define_method(mrb, class_pwm, "duty", mrb_pwm_duty_get, MRB_ARGS_NONE()); + mrb_define_method(mrb, class_pwm, "duty=", mrb_pwm_duty_set, MRB_ARGS_ARG(1, 0)); /* TODO: Implement methods */ }