88#include <stdio.h>
99#include <string.h>
1010
11+ #ifdef ESP_PLATFORM
1112#include "freertos/FreeRTOS.h"
1213#include "freertos/task.h"
1314#include "esp_log.h"
14-
15- // #define ESP_LOGI(tag, fmt, ...) printf(fmt, __VA_ARGS__)
15+ #else
16+ #define ESP_LOGI (tag , fmt , ...) printf(fmt, __VA_ARGS__)
17+ #endif
1618
1719#define TAG ("mruby-esp32-spi")
1820
19- enum {
20- KWARGS_UNIT = 0 ,
21- KWARGS_MODE ,
22- KWARGS_FIRST_BIT ,
23- KWARGS_FREQUENCY ,
24- KWARGS_NUM ,
25- };
26-
2721typedef struct spi_t {
28- mrb_int id ;
2922 mrb_int frequency ;
3023 mrb_int unit ;
3124 mrb_int mode ;
@@ -39,42 +32,6 @@ static const struct mrb_data_type mrb_spi = {
3932 "mrb_mruby_esp32_spi" , mrb_spi_free
4033};
4134
42- static const mrb_sym mrb_spi_setmode_kw_names [KWARGS_NUM ] = {
43- MRB_SYM (unit ),
44- MRB_SYM (mode ),
45- MRB_SYM (first_bit ),
46- MRB_SYM (frequency )
47- };
48-
49- static void
50- mrb_spi_set_keyword_values (spi_t * spi , mrb_value * kw_values ) {
51- spi -> unit = mrb_undef_p (kw_values [KWARGS_UNIT ]) ? 0 : mrb_fixnum (kw_values [KWARGS_UNIT ]);
52- spi -> mode = mrb_undef_p (kw_values [KWARGS_MODE ]) ? 1 : mrb_fixnum (kw_values [KWARGS_MODE ]);
53- spi -> first_bit = mrb_undef_p (kw_values [KWARGS_FIRST_BIT ]) ? 2 : mrb_fixnum (kw_values [KWARGS_FIRST_BIT ]);
54- spi -> frequency = mrb_undef_p (kw_values [KWARGS_FREQUENCY ]) ? 3 : mrb_fixnum (kw_values [KWARGS_FREQUENCY ]);
55- }
56-
57- static void
58- mrb_spi_get_init_args (mrb_state * mrb , spi_t * spi ) {
59- mrb_bool given ;
60- mrb_value kw_values [KWARGS_NUM ];
61- const mrb_kwargs kw = { KWARGS_NUM , 0 , mrb_spi_setmode_kw_names , kw_values , NULL };
62-
63- mrb_get_args (mrb , "|i?:" , & spi -> id , & given , & kw );
64-
65- if (!given ) { spi -> id = 0 ; }
66- mrb_spi_set_keyword_values (spi , kw_values );
67- }
68-
69- static void
70- mrb_spi_get_setmode_args (mrb_state * mrb , spi_t * spi ) {
71- mrb_value kw_values [KWARGS_NUM ];
72- const mrb_kwargs kw = { KWARGS_NUM , 0 , mrb_spi_setmode_kw_names , kw_values , NULL };
73-
74- mrb_get_args (mrb , ":" , & kw );
75- mrb_spi_set_keyword_values (spi , kw_values );
76- }
77-
7835static void
7936mrb_spi_free (mrb_state * mrb , void * p ) {
8037 spi_t * spi = (spi_t * )p ;
@@ -86,12 +43,12 @@ static mrb_value
8643mrb_spi_init (mrb_state * mrb , mrb_value self ) {
8744 spi_t * spi = mrb_malloc (mrb , sizeof (spi_t ));
8845
46+ mrb_get_args (mrb , "iiii" , & spi -> unit , & spi -> frequency , & spi -> mode , & spi -> first_bit );
8947
90- mrb_spi_get_init_args (mrb , spi );
9148 ESP_LOGI (
9249 TAG ,
93- "initialize(%d, unit: %d, mode: %d, first_bit: %d, frequency: %d)" ,
94- spi -> id , spi -> unit , spi -> mode , spi -> first_bit , spi -> frequency
50+ "initialize(unit: %d, mode: %d, first_bit: %d, frequency: %d)" ,
51+ spi -> unit , spi -> mode , spi -> first_bit , spi -> frequency
9552 );
9653
9754 mrb_data_init (self , spi , & mrb_spi );
@@ -103,7 +60,8 @@ static mrb_value
10360mrb_spi_setmode (mrb_state * mrb , mrb_value self ) {
10461 spi_t * spi = (spi_t * ) DATA_PTR (self );
10562
106- mrb_spi_get_setmode_args (mrb , spi );
63+ mrb_get_args (mrb , "iiii" , & spi -> unit , & spi -> frequency , & spi -> mode , & spi -> first_bit );
64+
10765 ESP_LOGI (
10866 TAG ,
10967 "setmode(unit: %d, mode: %d, first_bit: %d, frequency: %d)" ,
@@ -127,57 +85,9 @@ mrb_spi_read(mrb_state *mrb, mrb_value self) {
12785static mrb_value
12886mrb_spi_write (mrb_state * mrb , mrb_value self ) {
12987 spi_t * spi = (spi_t * ) DATA_PTR (self );
130- mrb_value obj ;
131- mrb_value str ;
132-
133- mrb_get_args (mrb , "o" , & obj );
134- switch (mrb_type (obj )) {
135- case MRB_TT_INTEGER :
136- ESP_LOGI (TAG , "write(%d)" , mrb_fixnum (obj ));
137- break ;
138- case MRB_TT_ARRAY :
139- RARRAY_LEN (obj );
140- str = mrb_ary_join (mrb , obj , mrb_str_new_cstr (mrb , ", " ));
141- ESP_LOGI (TAG , "write([%s])" , mrb_string_cstr (mrb , str ));
142- break ;
143- case MRB_TT_STRING :
144- ESP_LOGI (TAG , "write(\"%s\")" , mrb_str_to_cstr (mrb , obj ));
145- break ;
146- default :
147- mrb_raise (mrb , E_TYPE_ERROR , "wrong argument type (expected Integer or String or Array<String>)" );
148- break ;
149- }
150-
151- return self ;
152- }
88+ mrb_value data ;
15389
154- static mrb_value
155- mrb_spi_transfer (mrb_state * mrb , mrb_value self ) {
156- spi_t * spi = (spi_t * ) DATA_PTR (self );
157- mrb_bool given ;
158- mrb_int additional_read_bytes = 0 ;
159- mrb_value obj ;
160- mrb_value str ;
161-
162- mrb_get_args (mrb , "o|i" , & obj , & additional_read_bytes , & given );
163- if (!given ) { additional_read_bytes = 0 ; }
164-
165- switch (mrb_type (obj )) {
166- case MRB_TT_INTEGER :
167- ESP_LOGI (TAG , "transfer(%d, %d)" , mrb_fixnum (obj ), additional_read_bytes );
168- break ;
169- case MRB_TT_ARRAY :
170- RARRAY_LEN (obj );
171- str = mrb_ary_join (mrb , obj , mrb_str_new_cstr (mrb , ", " ));
172- ESP_LOGI (TAG , "transfer([%s], %d)" , mrb_string_cstr (mrb , str ), additional_read_bytes );
173- break ;
174- case MRB_TT_STRING :
175- ESP_LOGI (TAG , "transfer(\"%s\", %d)" , mrb_str_to_cstr (mrb , obj ), additional_read_bytes );
176- break ;
177- default :
178- mrb_raise (mrb , E_TYPE_ERROR , "wrong argument type (expected Integer or String or Array<String>)" );
179- break ;
180- }
90+ mrb_get_args (mrb , "S" , & data );
18191
18292 return self ;
18393}
@@ -186,11 +96,10 @@ void
18696mrb_mruby_esp32_spi_gem_init (mrb_state * mrb ) {
18797 struct RClass * client_class = mrb_define_class (mrb , "SPI" , mrb -> object_class );
18898
189- mrb_define_method (mrb , client_class , "_initialize" , mrb_spi_init , MRB_ARGS_ANY ());
190- mrb_define_method (mrb , client_class , "_setmode" , mrb_spi_setmode , MRB_ARGS_ANY ());
191- mrb_define_method (mrb , client_class , "_read" , mrb_spi_read , MRB_ARGS_REQ (1 ));
192- mrb_define_method (mrb , client_class , "_write" , mrb_spi_write , MRB_ARGS_REQ (1 ));
193- mrb_define_method (mrb , client_class , "_transfer" , mrb_spi_transfer , MRB_ARGS_REQ (1 ) | MRB_ARGS_OPT (1 ));
99+ mrb_define_method (mrb , client_class , "__initialize" , mrb_spi_init , MRB_ARGS_REQ (4 ));
100+ mrb_define_method (mrb , client_class , "__setmode" , mrb_spi_setmode , MRB_ARGS_REQ (4 ));
101+ mrb_define_method (mrb , client_class , "__read" , mrb_spi_read , MRB_ARGS_REQ (1 ));
102+ mrb_define_method (mrb , client_class , "__write" , mrb_spi_write , MRB_ARGS_REQ (1 ));
194103}
195104
196105void
0 commit comments