14
14
#define GPIO_MODE_INPUT_OUTPUT_OD ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD))
15
15
#define GPIO_MODE_INPUT_OUTPUT ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT))
16
16
17
+ // Pin Mode
17
18
static mrb_value
18
19
mrb_esp32_gpio_pin_mode (mrb_state * mrb , mrb_value self ) {
19
20
mrb_value pin , dir ;
@@ -34,59 +35,37 @@ mrb_esp32_gpio_pin_mode(mrb_state *mrb, mrb_value self) {
34
35
return self ;
35
36
}
36
37
38
+ // Digital Read
37
39
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 ;
40
42
41
- mrb_get_args (mrb , "oo " , & pin , & level );
43
+ mrb_get_args (mrb , "o " , & pin );
42
44
43
- if (!mrb_fixnum_p (pin ) || ! mrb_fixnum_p ( level ) ) {
45
+ if (!mrb_fixnum_p (pin )) {
44
46
return mrb_nil_value ();
45
47
}
46
48
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 )));
50
50
}
51
51
52
+ // Digital Write
52
53
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 ;
55
56
56
- mrb_get_args (mrb , "oo" , & ch , & vol );
57
+ mrb_get_args (mrb , "oo" , & pin , & level );
57
58
58
- if (!mrb_fixnum_p (ch ) || !mrb_fixnum_p (vol )) {
59
+ if (!mrb_fixnum_p (pin ) || !mrb_fixnum_p (level )) {
59
60
return mrb_nil_value ();
60
61
}
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
- }
76
62
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 ));
86
64
87
- return mrb_fixnum_value ( gpio_get_level ( mrb_fixnum ( pin ))) ;
65
+ return self ;
88
66
}
89
67
68
+ // Analog Read
90
69
static mrb_value
91
70
mrb_esp32_gpio_analog_read (mrb_state * mrb , mrb_value self ) {
92
71
mrb_value ch ;
@@ -120,31 +99,70 @@ mrb_esp32_gpio_analog_read(mrb_state *mrb, mrb_value self) {
120
99
return mrb_fixnum_value (adc_result );
121
100
}
122
101
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
+
123
130
void
124
- mrb_mruby_esp32_gpio_gem_init (mrb_state * mrb )
125
- {
131
+ mrb_mruby_esp32_gpio_gem_init (mrb_state * mrb ) {
126
132
struct RClass * esp32 , * gpio , * constants ;
127
133
134
+ // ESP32 module
128
135
esp32 = mrb_define_module (mrb , "ESP32" );
129
136
137
+ // ESP32::GPIO
130
138
gpio = mrb_define_module_under (mrb , esp32 , "GPIO" );
131
- // Ruby-style snake case methods.
139
+
140
+ // Ruby-style snake-case methods.
132
141
mrb_define_module_function (mrb , gpio , "pin_mode" , mrb_esp32_gpio_pin_mode , MRB_ARGS_REQ (2 ));
133
142
mrb_define_module_function (mrb , gpio , "digital_write" , mrb_esp32_gpio_digital_write , MRB_ARGS_REQ (2 ));
134
143
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 ));
136
144
mrb_define_module_function (mrb , gpio , "analog_read" , mrb_esp32_gpio_analog_read , MRB_ARGS_REQ (1 ));
137
145
138
- // Arduino-style camel case methods.
146
+ // Arduino-style camel- case methods.
139
147
mrb_define_module_function (mrb , gpio , "pinMode" , mrb_esp32_gpio_pin_mode , MRB_ARGS_REQ (2 ));
140
148
mrb_define_module_function (mrb , gpio , "digitalWrite" , mrb_esp32_gpio_digital_write , MRB_ARGS_REQ (2 ));
141
149
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 ));
143
150
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
145
162
constants = mrb_define_module_under (mrb , esp32 , "Constants" );
146
163
147
- #define define_const (SYM ) \
164
+ // Pass a C constant through to mruby, defined inside ESP32::Constants.
165
+ #define define_const (SYM ) \
148
166
do { \
149
167
mrb_define_const(mrb, constants, #SYM, mrb_fixnum_value(SYM)); \
150
168
} while (0)
@@ -188,12 +206,6 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
188
206
define_const (GPIO_NUM_39 );
189
207
define_const (GPIO_NUM_MAX );
190
208
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
-
197
209
define_const (ADC_CHANNEL_0 );
198
210
define_const (ADC_CHANNEL_1 );
199
211
define_const (ADC_CHANNEL_2 );
@@ -206,6 +218,15 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
206
218
define_const (ADC_CHANNEL_8 );
207
219
define_const (ADC_CHANNEL_9 );
208
220
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
+
209
230
mrb_define_const (mrb , constants , "LOW" , mrb_fixnum_value (0 ));
210
231
mrb_define_const (mrb , constants , "HIGH" , mrb_fixnum_value (1 ));
211
232
@@ -214,7 +235,6 @@ mrb_mruby_esp32_gpio_gem_init(mrb_state* mrb)
214
235
mrb_define_const (mrb , constants , "GPIO_MODE_OUTPUT" , mrb_fixnum_value (GPIO_MODE_OUTPUT ));
215
236
mrb_define_const (mrb , constants , "GPIO_MODE_INPUT_PULLUP" , mrb_fixnum_value (GPIO_MODE_INPUT_PULLUP ));
216
237
mrb_define_const (mrb , constants , "GPIO_MODE_INPUT_PULLDOWN" , mrb_fixnum_value (GPIO_MODE_INPUT_PULLDOWN ));
217
-
218
238
}
219
239
220
240
void
0 commit comments