Skip to content

Commit c09687f

Browse files
committed
Check for SOC_DAC_SUPPORTED and exclude DAC stuff
1 parent b07d44a commit c09687f

File tree

1 file changed

+71
-51
lines changed

1 file changed

+71
-51
lines changed

src/gpio.c

Lines changed: 71 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define GPIO_MODE_INPUT_OUTPUT_OD ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD))
1515
#define GPIO_MODE_INPUT_OUTPUT ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT))
1616

17+
// Pin Mode
1718
static mrb_value
1819
mrb_esp32_gpio_pin_mode(mrb_state *mrb, mrb_value self) {
1920
mrb_value pin, dir;
@@ -34,59 +35,37 @@ mrb_esp32_gpio_pin_mode(mrb_state *mrb, mrb_value self) {
3435
return self;
3536
}
3637

38+
// Digital Read
3739
static mrb_value
38-
mrb_esp32_gpio_digital_write(mrb_state *mrb, mrb_value self) {
39-
mrb_value pin, level;
40+
mrb_esp32_gpio_digital_read(mrb_state *mrb, mrb_value self) {
41+
mrb_value pin;
4042

41-
mrb_get_args(mrb, "oo", &pin, &level);
43+
mrb_get_args(mrb, "o", &pin);
4244

43-
if (!mrb_fixnum_p(pin) || !mrb_fixnum_p(level)) {
45+
if (!mrb_fixnum_p(pin)) {
4446
return mrb_nil_value();
4547
}
4648

47-
gpio_set_level(mrb_fixnum(pin), mrb_fixnum(level));
48-
49-
return self;
49+
return mrb_fixnum_value(gpio_get_level(mrb_fixnum(pin)));
5050
}
5151

52+
// Digital Write
5253
static mrb_value
53-
mrb_esp32_gpio_analog_write(mrb_state *mrb, mrb_value self) {
54-
mrb_value ch, vol;
54+
mrb_esp32_gpio_digital_write(mrb_state *mrb, mrb_value self) {
55+
mrb_value pin, level;
5556

56-
mrb_get_args(mrb, "oo", &ch, &vol);
57+
mrb_get_args(mrb, "oo", &pin, &level);
5758

58-
if (!mrb_fixnum_p(ch) || !mrb_fixnum_p(vol)) {
59+
if (!mrb_fixnum_p(pin) || !mrb_fixnum_p(level)) {
5960
return mrb_nil_value();
6061
}
61-
62-
// Handle
63-
dac_oneshot_handle_t chan_handle;
64-
65-
// Configuration
66-
dac_oneshot_config_t chan_cfg = {
67-
.chan_id = mrb_fixnum(ch),
68-
};
69-
ESP_ERROR_CHECK(dac_oneshot_new_channel(&chan_cfg, &chan_handle));
70-
71-
// Write
72-
ESP_ERROR_CHECK(dac_oneshot_output_voltage(chan_handle, mrb_fixnum(vol)));
73-
74-
return self;
75-
}
7662

77-
static mrb_value
78-
mrb_esp32_gpio_digital_read(mrb_state *mrb, mrb_value self) {
79-
mrb_value pin;
80-
81-
mrb_get_args(mrb, "o", &pin);
82-
83-
if (!mrb_fixnum_p(pin)) {
84-
return mrb_nil_value();
85-
}
63+
gpio_set_level(mrb_fixnum(pin), mrb_fixnum(level));
8664

87-
return mrb_fixnum_value(gpio_get_level(mrb_fixnum(pin)));
65+
return self;
8866
}
8967

68+
// Analog Read
9069
static mrb_value
9170
mrb_esp32_gpio_analog_read(mrb_state *mrb, mrb_value self) {
9271
mrb_value ch;
@@ -120,31 +99,70 @@ mrb_esp32_gpio_analog_read(mrb_state *mrb, mrb_value self) {
12099
return mrb_fixnum_value(adc_result);
121100
}
122101

102+
// Analog Write (DACs not available on some chips)
103+
#ifdef SOC_DAC_SUPPORTED
104+
static mrb_value
105+
mrb_esp32_gpio_analog_write(mrb_state *mrb, mrb_value self) {
106+
mrb_value ch, vol;
107+
108+
mrb_get_args(mrb, "oo", &ch, &vol);
109+
110+
if (!mrb_fixnum_p(ch) || !mrb_fixnum_p(vol)) {
111+
return mrb_nil_value();
112+
}
113+
114+
// Handle
115+
dac_oneshot_handle_t chan_handle;
116+
117+
// Configuration
118+
dac_oneshot_config_t chan_cfg = {
119+
.chan_id = mrb_fixnum(ch),
120+
};
121+
ESP_ERROR_CHECK(dac_oneshot_new_channel(&chan_cfg, &chan_handle));
122+
123+
// Write
124+
ESP_ERROR_CHECK(dac_oneshot_output_voltage(chan_handle, mrb_fixnum(vol)));
125+
126+
return self;
127+
}
128+
#endif
129+
123130
void
124-
mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
125-
{
131+
mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb) {
126132
struct RClass *esp32, *gpio, *constants;
127133

134+
// ESP32 module
128135
esp32 = mrb_define_module(mrb, "ESP32");
129136

137+
// ESP32::GPIO
130138
gpio = mrb_define_module_under(mrb, esp32, "GPIO");
131-
// Ruby-style snake case methods.
139+
140+
// Ruby-style snake-case methods.
132141
mrb_define_module_function(mrb, gpio, "pin_mode", mrb_esp32_gpio_pin_mode, MRB_ARGS_REQ(2));
133142
mrb_define_module_function(mrb, gpio, "digital_write", mrb_esp32_gpio_digital_write, MRB_ARGS_REQ(2));
134143
mrb_define_module_function(mrb, gpio, "digital_read", mrb_esp32_gpio_digital_read, MRB_ARGS_REQ(1));
135-
mrb_define_module_function(mrb, gpio, "analog_write", mrb_esp32_gpio_analog_write, MRB_ARGS_REQ(2));
136144
mrb_define_module_function(mrb, gpio, "analog_read", mrb_esp32_gpio_analog_read, MRB_ARGS_REQ(1));
137145

138-
// Arduino-style camel case methods.
146+
// Arduino-style camel-case methods.
139147
mrb_define_module_function(mrb, gpio, "pinMode", mrb_esp32_gpio_pin_mode, MRB_ARGS_REQ(2));
140148
mrb_define_module_function(mrb, gpio, "digitalWrite", mrb_esp32_gpio_digital_write, MRB_ARGS_REQ(2));
141149
mrb_define_module_function(mrb, gpio, "digitalRead", mrb_esp32_gpio_digital_read, MRB_ARGS_REQ(1));
142-
mrb_define_module_function(mrb, gpio, "analogWrite", mrb_esp32_gpio_analog_write, MRB_ARGS_REQ(2));
143150
mrb_define_module_function(mrb, gpio, "analogRead", mrb_esp32_gpio_analog_read, MRB_ARGS_REQ(1));
144-
151+
152+
// DAC available only on some chips.
153+
#ifdef SOC_DAC_SUPPORTED
154+
mrb_define_const(mrb, esp32, "SOC_DAC_SUPPORTED", mrb_true_value());
155+
mrb_define_module_function(mrb, gpio, "analogWrite", mrb_esp32_gpio_analog_write, MRB_ARGS_REQ(2));
156+
mrb_define_module_function(mrb, gpio, "analog_write", mrb_esp32_gpio_analog_write, MRB_ARGS_REQ(2));
157+
#else
158+
mrb_define_const(mrb, esp32, "SOC_DAC_SUPPORTED", mrb_false_value());
159+
#endif
160+
161+
// ESP32::Constants
145162
constants = mrb_define_module_under(mrb, esp32, "Constants");
146163

147-
#define define_const(SYM) \
164+
// Pass a C constant through to mruby, defined inside ESP32::Constants.
165+
#define define_const(SYM) \
148166
do { \
149167
mrb_define_const(mrb, constants, #SYM, mrb_fixnum_value(SYM)); \
150168
} while (0)
@@ -188,12 +206,6 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
188206
define_const(GPIO_NUM_39);
189207
define_const(GPIO_NUM_MAX);
190208

191-
define_const(DAC_CHAN_0);
192-
define_const(DAC_CHAN_1);
193-
// Old versions of above. Deprecated.
194-
define_const(DAC_CHANNEL_1);
195-
define_const(DAC_CHANNEL_2);
196-
197209
define_const(ADC_CHANNEL_0);
198210
define_const(ADC_CHANNEL_1);
199211
define_const(ADC_CHANNEL_2);
@@ -206,6 +218,15 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
206218
define_const(ADC_CHANNEL_8);
207219
define_const(ADC_CHANNEL_9);
208220

221+
// DAC available only on some chips.
222+
#ifdef SOC_DAC_SUPPORTED
223+
define_const(DAC_CHAN_0);
224+
define_const(DAC_CHAN_1);
225+
// Old versions of above. Deprecated.
226+
define_const(DAC_CHANNEL_1);
227+
define_const(DAC_CHANNEL_2);
228+
#endif
229+
209230
mrb_define_const(mrb, constants, "LOW", mrb_fixnum_value(0));
210231
mrb_define_const(mrb, constants, "HIGH", mrb_fixnum_value(1));
211232

@@ -214,7 +235,6 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
214235
mrb_define_const(mrb, constants, "GPIO_MODE_OUTPUT", mrb_fixnum_value(GPIO_MODE_OUTPUT));
215236
mrb_define_const(mrb, constants, "GPIO_MODE_INPUT_PULLUP", mrb_fixnum_value(GPIO_MODE_INPUT_PULLUP));
216237
mrb_define_const(mrb, constants, "GPIO_MODE_INPUT_PULLDOWN", mrb_fixnum_value(GPIO_MODE_INPUT_PULLDOWN));
217-
218238
}
219239

220240
void

0 commit comments

Comments
 (0)