Skip to content

Commit fb22e73

Browse files
committed
operate arguments in each method.
1 parent 80081e3 commit fb22e73

File tree

3 files changed

+166
-115
lines changed

3 files changed

+166
-115
lines changed

mrblib/spi.rb

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,70 @@
11
class SPI
2-
def initialize(id = 0, **kwargs)
3-
_initialize(id, **kwargs)
2+
MSB_FIRST = 0
3+
LSB_FIRST = 1
4+
5+
attr_accessor :unit, :frequency, :mode, :first_bit
6+
attr_accessor :outputs
7+
attr_accessor :read_bytes
8+
9+
def initialize(id = nil, **kwargs)
10+
self.unit = id || kwargs[:unit] || 0
11+
self.frequency = kwargs[:frequency] || 1_000_000
12+
self.mode = kwargs[:mode] || 0
13+
self.first_bit = kwargs[:first_bit] || MSB_FIRST
14+
15+
__initialize(self.unit, self.frequency, self.mode, self.first_bit)
416
end
517

618
def setmode(**kwargs)
7-
_setmode(**kwargs)
19+
self.unit = kwargs[:unit] || self.unit
20+
self.frequency = kwargs[:frequency] || self.frequency
21+
self.mode = kwargs[:mode] || self.mode
22+
self.first_bit = kwargs[:first_bit] || self.first_bit
23+
24+
__setmode(self.unit, self.frequency, self.mode, self.first_bit)
25+
end
26+
27+
def write(outputs)
28+
self.outputs =
29+
if outputs.is_a?(String)
30+
outputs
31+
elsif outputs.is_a?(Array)
32+
outputs.pack("c*")
33+
elsif outputs.is_a?(Integer)
34+
[outputs].pack("c*")
35+
else
36+
raise data_type_error
37+
end
38+
39+
__write(self.outputs)
40+
nil
841
end
942

10-
def write(obj)
11-
_write(obj)
43+
def read(read_bytes)
44+
self.read_bytes = read_bytes
45+
46+
__read(read_bytes)
1247
end
1348

14-
def read(obj)
15-
_read(obj)
49+
def transfer(outputs, additional_read_bytes = 0)
50+
self.outputs =
51+
if outputs.is_a?(String)
52+
outputs
53+
elsif outputs.is_a?(Array)
54+
outputs.pack("c*")
55+
elsif outputs.is_a?(Integer)
56+
[outputs].pack("c*")
57+
else
58+
raise data_type_error
59+
end
60+
61+
additional_read_bytes.times { self.outputs += "\0" }
62+
63+
__write(self.outputs)
64+
__read(self.outputs.size)
1665
end
1766

18-
def transfer(obj, additional_read_bytes = 0)
19-
_transfer(obj, additional_read_bytes)
67+
def data_type_error
68+
TypeError.new("wrong argument type (expected Integer or String or Array<String>)")
2069
end
2170
end

src/mruby_esp32_spi.c

Lines changed: 15 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,17 @@
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-
2721
typedef 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-
7835
static void
7936
mrb_spi_free(mrb_state *mrb, void *p) {
8037
spi_t *spi = (spi_t *)p;
@@ -86,12 +43,12 @@ static mrb_value
8643
mrb_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
10360
mrb_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) {
12785
static mrb_value
12886
mrb_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
18696
mrb_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

196105
void

test/spi.rb

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
assert('SPI.new') do
2+
spi = SPI.new()
3+
assert_equal(spi.unit, 0)
4+
assert_equal(spi.frequency, 1_000_000)
5+
assert_equal(spi.mode, 0)
6+
assert_equal(spi.first_bit, SPI::MSB_FIRST)
7+
8+
spi = SPI.new(1)
9+
assert_equal(spi.unit, 1)
10+
assert_equal(spi.frequency, 1_000_000)
11+
assert_equal(spi.mode, 0)
12+
assert_equal(spi.first_bit, SPI::MSB_FIRST)
13+
14+
spi = SPI.new(1, unit: 2, frequency: 2_000_000, mode: 1, first_bit: SPI::LSB_FIRST)
15+
assert_equal(spi.unit, 1)
16+
assert_equal(spi.frequency, 2_000_000)
17+
assert_equal(spi.mode, 1)
18+
assert_equal(spi.first_bit, SPI::LSB_FIRST)
19+
20+
spi = SPI.new(unit: 2, frequency: 2_000_000, mode: 1, first_bit: SPI::LSB_FIRST)
21+
assert_equal(spi.unit, 2)
22+
assert_equal(spi.frequency, 2_000_000)
23+
assert_equal(spi.mode, 1)
24+
assert_equal(spi.first_bit, SPI::LSB_FIRST)
25+
26+
spi = SPI.new(frequency: 3_000_000)
27+
assert_equal(spi.unit, 0)
28+
assert_equal(spi.frequency, 3_000_000)
29+
assert_equal(spi.mode, 0)
30+
assert_equal(spi.first_bit, SPI::MSB_FIRST)
31+
end
32+
33+
assert('SPI#setmode') do
34+
spi = SPI.new()
35+
spi.setmode(unit: 2, frequency: 2_000_000, mode: 1, first_bit: SPI::LSB_FIRST)
36+
assert_equal(spi.unit, 2)
37+
assert_equal(spi.frequency, 2_000_000)
38+
assert_equal(spi.mode, 1)
39+
assert_equal(spi.first_bit, SPI::LSB_FIRST)
40+
41+
spi = SPI.new()
42+
spi.setmode(frequency: 2_000_000)
43+
assert_equal(spi.unit, 0)
44+
assert_equal(spi.frequency, 2_000_000)
45+
assert_equal(spi.mode, 0)
46+
assert_equal(spi.first_bit, SPI::MSB_FIRST)
47+
end
48+
49+
assert('SPI#write') do
50+
spi = SPI.new()
51+
ret = spi.write("writedata")
52+
assert_nil(ret)
53+
assert_equal("writedata", spi.outputs)
54+
55+
ret = spi.write(0x12)
56+
assert_nil(ret)
57+
assert_equal("\x12", spi.outputs)
58+
59+
ret = spi.write([0x34, 0x56])
60+
assert_nil(ret)
61+
assert_equal("\x34\x56", spi.outputs)
62+
63+
assert_raise(TypeError) do
64+
spi.write(nil)
65+
assert_nil(ret)
66+
end
67+
end
68+
69+
assert('SPI#read') do
70+
spi = SPI.new()
71+
ret = spi.read(64)
72+
assert_equal(64, spi.read_bytes)
73+
end
74+
75+
assert('SPI#transfer') do
76+
spi = SPI.new()
77+
ret = spi.transfer("writedata")
78+
assert_equal("writedata", spi.outputs)
79+
80+
ret = spi.transfer(0x12)
81+
assert_equal("\x12", spi.outputs)
82+
83+
ret = spi.transfer([0x34, 0x56])
84+
assert_equal("\x34\x56", spi.outputs)
85+
86+
ret = spi.transfer([0x34, 0x56], 3)
87+
assert_equal("\x34\x56\x00\x00\x00", spi.outputs)
88+
89+
assert_raise(TypeError) do
90+
spi.write(nil)
91+
assert_nil(ret)
92+
end
93+
end

0 commit comments

Comments
 (0)