source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sKernel.c@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 12.6 KB
Line 
1/*
2 * カーネル関連
3 *
4 * Copyright (c) 2016 Wakayama.rb Ruby Board developers
5 *
6 * This software is released under the MIT License.
7 * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
8 *
9 */
10#include <arduino.h>
11/*#include <util.h>*/
12
13#include <mruby.h>
14
15#include "../llbruby.h"
16
17
18/******************************************************/
19/* デジタルライト*/
20/* digitalWrite(pin, value) */
21/* pin*/
22/* ピンの番号*/
23/* value*/
24/* 0: LOW*/
25/* 1: HIGH*/
26/******************************************************/
27mrb_value mrb_kernel_digitalWrite(mrb_state *mrb, mrb_value self)
28{
29 int pinno, value;
30 struct pin_node *pin;
31
32 mrb_get_args(mrb, "ii", &pinno, &value);
33
34 pin = get_pin(pintype_gpio, pinno);
35 if (pin == NULL)
36 return mrb_nil_value(); /*戻り値は無しですよ。*/
37
38 gpio_write(&pin->gpio, value);
39
40 return mrb_nil_value(); /*戻り値は無しですよ。*/
41}
42
43/******************************************************/
44/* PINのモード設定*/
45/* pinMode(pin, mode) */
46/* pin*/
47/* ピンの番号*/
48/* mode*/
49/* 0: INPUTモード*/
50/* 1: OUTPUTモード*/
51/******************************************************/
52mrb_value mrb_kernel_pinMode(mrb_state *mrb, mrb_value self)
53{
54 int pinno, value;
55 struct pin_node *pin;
56
57 mrb_get_args(mrb, "ii", &pinno, &value);
58
59 pin = get_pin(pintype_gpio, pinno);
60 if (pin == NULL)
61 return mrb_nil_value(); /*戻り値は無しですよ。*/
62
63 gpio_dir(&pin->gpio, value);
64
65 return mrb_nil_value(); /*戻り値は無しですよ。*/
66}
67
68/******************************************************/
69/* ディレイ 強制GCを行っています*/
70/* delay(value) */
71/* value*/
72/* 時間(ms)*/
73/******************************************************/
74mrb_value mrb_kernel_delay(mrb_state *mrb, mrb_value self)
75{
76 int value;
77
78 mrb_get_args(mrb, "i", &value);
79
80 /*試しに強制gcを入れて見る*/
81 mrb_full_gc(mrb);
82
83 if (value > 0) {
84 wait_ms(value);
85 }
86
87 return mrb_nil_value(); /*戻り値は無しですよ。*/
88}
89
90
91/******************************************************/
92/* ミリ秒を取得します: millis*/
93/* millis()*/
94/* 戻り値*/
95/* 起動してからのミリ秒数*/
96/******************************************************/
97mrb_value mrb_kernel_millis(mrb_state *mrb, mrb_value self)
98{
99 return mrb_fixnum_value((mrb_int)(us_ticker_read() / 1000));
100}
101
102/******************************************************/
103/* マイクロ秒を取得します: micros*/
104/* micros()*/
105/* 戻り値*/
106/* 起動してからのマイクロ秒数*/
107/******************************************************/
108mrb_value mrb_kernel_micros(mrb_state *mrb, mrb_value self)
109{
110 return mrb_fixnum_value((mrb_int)us_ticker_read());
111}
112
113/******************************************************/
114/* デジタルリード: digitalRead*/
115/* digitalRead(pin) */
116/* pin: ピンの番号*/
117/* */
118/* 0:LOW*/
119/* 1:HIGH*/
120/******************************************************/
121mrb_value mrb_kernel_digitalRead(mrb_state *mrb, mrb_value self)
122{
123 int pinno, value;
124 struct pin_node *pin;
125
126 mrb_get_args(mrb, "i", &pinno);
127
128 pin = get_pin(pintype_gpio, pinno);
129 if (pin == NULL)
130 return mrb_nil_value(); /*戻り値は無しですよ。*/
131
132 value = gpio_read(&pin->gpio);
133
134 return mrb_fixnum_value(value);
135}
136
137
138/******************************************************/
139/* アナログリファレンス: analogReference*/
140/* analogReference(mode)*/
141/* アナログ入力で使われる基準電圧を設定します*/
142/* mode: 0:DEFAULT:5.0V Arduino互換, 1:INTERNAL:1.1V 内蔵電圧, 2:EXTERNAL:AVREFピン供給電圧, 3:RAW12BIT:3.3V 12ビットA/D変換を行う*/
143/******************************************************/
144mrb_value mrb_kernel_analogReference(mrb_state *mrb, mrb_value self)
145{
146 int mode;
147
148 mrb_get_args(mrb, "i", &mode);
149
150 switch (mode) {
151 case DEFAULT:
152 analogReference(DEFAULT);
153 break;
154 case INTERNAL:
155 analogReference(INTERNAL);
156 break;
157 case EXTERNAL:
158 analogReference(EXTERNAL);
159 break;
160 case RAW12BIT:
161 analogReference(RAW12BIT);
162 break;
163 }
164 return mrb_nil_value(); /*戻り値は無しですよ。*/
165}
166
167/******************************************************/
168/* アナログリード: analogRead*/
169/* analogRead(pin) */
170/* pin: アナログの番号*/
171/* */
172/* 10ビットの値(0~1023)*/
173/******************************************************/
174mrb_value mrb_kernel_analogRead(mrb_state *mrb, mrb_value self)
175{
176 int anapin, value;
177 struct pin_node *pin;
178
179 mrb_get_args(mrb, "i", &anapin);
180
181 pin = get_pin(pintype_analogin, anapin);
182 if (pin == NULL)
183 return mrb_nil_value(); /*戻り値は無しですよ。*/
184
185 value = analogin_read_u16(&pin->analogin);
186
187 return mrb_fixnum_value(value);
188}
189
190#if 0
191/****************************************************/
192/* 出力ピンが並列接続されているピンとショートするかどうか調べます*/
193/**/
194/* true: 衝突している*/
195/* false: 衝突していない。片方がINPUTである。*/
196/****************************************************/
197bool IsWritePinCollision(int pinSub)
198{
199 PinMode modeSub = getPinMode(get_pin(pinSub));
200 if(modeSub == PinModeInput || modeSub== PinModeInputPullUp){
201 return false;
202 }
203 return true;
204}
205#endif
206
207/******************************************************/
208/* PWM出力: pwm*/
209/* pwm(pin, value)*/
210/* pin: ピンの番号(0,1,7,8,11,23ピンがPWM可能)*/
211/* ただし、23ピンは5ピンと24ピン短絡しているので、使用時は5ピンと24ピンをINPUTにしておく*/
212/* value: 出力PWM比率(0~255)*/
213/******************************************************/
214mrb_value mrb_kernel_pwm(mrb_state *mrb, mrb_value self)
215{
216 int pinno, value;
217 struct pin_node *pin;
218
219 mrb_get_args(mrb, "ii", &pinno, &value);
220
221 pin = get_pin(pintype_pwmout, pinno);
222 if (pin == NULL)
223 return mrb_nil_value(); /*戻り値は無しですよ。*/
224
225 pwmout_pulsewidth_us(&pin->pwmout, value);
226
227 return mrb_nil_value(); /*戻り値は無しですよ。*/
228}
229#if 0
230/******************************************************/
231/* PWM周波数設定: pwmHz*/
232/* pwmHz(value)*/
233/* value: 周波数(12~184999)Hz*/
234/******************************************************/
235mrb_value mrb_kernel_pwmHz(mrb_state *mrb, mrb_value self)
236{
237 int pinno, value;
238 struct pin_node *pin;
239
240 mrb_get_args(mrb, "ii", &pinno, &value);
241
242 pin = get_pin(pintype_pwmout, pinno);
243 if (pin == NULL)
244 return mrb_nil_value(); /*戻り値は無しですよ。*/
245
246 if (value >= 12 && value < 18500) {
247#if DEVICE_ANALOGOUT
248 pin->period = 1000000 / value;
249 pwmout_period_us(&pin->pwmout, pin->period);
250#endif
251 }
252
253 return mrb_nil_value(); /*戻り値は無しですよ。*/
254}
255#endif
256/******************************************************/
257/* トーン出力停止: noTone*/
258/* noTone(pin)*/
259/* pin: ピン番号*/
260/******************************************************/
261mrb_value mrb_kernel_noTone(mrb_state *mrb, mrb_value self)
262{
263 int pin;
264
265 mrb_get_args(mrb, "i", &pin);
266
267 if (pin == 4 || pin >= 20) {
268 return mrb_nil_value(); /*戻り値は無しですよ。*/
269 }
270
271 noTone(pin);
272
273 return mrb_nil_value(); /*戻り値は無しですよ。*/
274}
275
276/******************************************************/
277/* トーン出力: tone*/
278/* tone(pin, frequency[,duration])*/
279/* pin: ピン番号*/
280/* frequency: 周波数(2~62500)Hz*/
281/* duration: 出力を維持する時間[ms]。省略時、0指定時は出力し続ける。*/
282/******************************************************/
283mrb_value mrb_kernel_tone(mrb_state *mrb, mrb_value self)
284{
285 int pin;
286 int freq;
287 unsigned long dura;
288
289 int n = mrb_get_args(mrb, "ii|i", &pin, &freq, &dura);
290
291 if (pin == 4 || pin >= 20) {
292 return mrb_nil_value(); /*戻り値は無しですよ。*/
293 }
294
295 dura = n < 3 ? 0 : dura;
296
297 if (freq >= 2 && freq <= 62500) {
298 tone(pin, freq, dura);
299 }
300 return mrb_nil_value(); /*戻り値は無しですよ。*/
301}
302
303/******************************************************/
304/* アナログDACピン初期化: initDac*/
305/* initDac()*/
306/******************************************************/
307mrb_value mrb_kernel_initDac(mrb_state *mrb, mrb_value self)
308{
309 setPinModeDac(RB_PIN9);
310 return mrb_nil_value(); /*戻り値は無しですよ。*/
311}
312
313/******************************************************/
314/* アナログDAC出力: analogDac*/
315/* analogDac(value)*/
316/* value: 10bit精度(0~4095)*/
317/******************************************************/
318mrb_value mrb_kernel_analogDac(mrb_state *mrb, mrb_value self)
319{
320 int value;
321
322 mrb_get_args(mrb, "i", &value);
323
324#if DEVICE_ANALOGOUT
325 if (value >= 0 && value < 4096) {
326 struct pin_node *pin;
327 pin = get_pin(pintype_dac, RB_PIN9);
328 if (pin == NULL)
329 return mrb_nil_value(); /*戻り値は無しですよ。*/
330
331 analogout_write_u16(&pin->dac, (value << 6) | (value >> 4));
332 }
333#endif
334
335 return mrb_nil_value(); /*戻り値は無しですよ。*/
336}
337
338static void led_on(int led, bool on)
339{
340 struct pin_node *pin;
341
342 pin = get_pin(pintype_dac, led);
343 if (pin == NULL)
344 return;
345
346 gpio_write(&pin->gpio, on);
347}
348
349/******************************************************/
350/* LEDオンオフ: led*/
351/* led(sw)*/
352/******************************************************/
353mrb_value mrb_kernel_led(mrb_state *mrb, mrb_value self)
354{
355 int value;
356
357 mrb_get_args(mrb, "i", &value);
358
359#if BOARD == BOARD_GR
360 led_on(PIN_LED0, value & 1);
361 led_on(PIN_LED1, (value >> 1) & 1);
362 led_on(PIN_LED2, (value >> 2) & 1);
363 led_on(PIN_LED3, (value >> 3) & 1);
364#else
365 led_on(RB_LED, value & 1);
366#endif
367
368 return mrb_nil_value(); /*戻り値は無しですよ。*/
369}
370
371/******************************************************/
372/* 乱数を得るための種を与えます: randomSeed*/
373/* randomSeed(value)*/
374/* value: 種となる値*/
375/******************************************************/
376mrb_value mrb_kernel_randomSeed(mrb_state *mrb, mrb_value self)
377{
378 unsigned int value;
379
380 mrb_get_args(mrb, "i", &value);
381
382 randomSeed(value);
383
384 return mrb_nil_value(); /*戻り値は無しですよ。*/
385}
386
387/******************************************************/
388/* 乱数を取得します: random*/
389/* random([min,] max)*/
390/* min: 乱数の取りうる最小値。省略可*/
391/* max: 乱数の取りうる最大値*/
392/******************************************************/
393mrb_value mrb_kernel_random(mrb_state *mrb, mrb_value self)
394{
395 long value1, value2;
396
397 int n = mrb_get_args(mrb, "i|i", &value1, &value2);
398
399 if (n == 1) {
400 return mrb_fixnum_value(arduino_random(0, value1));
401 }
402
403 return mrb_fixnum_value(arduino_random(value1, value2));
404}
405
406/******************************************************/
407/* 隠しコマンドです: El_Psy.Congroo*/
408/* El_Psy.Congroo()*/
409/******************************************************/
410mrb_value mrb_El_Psy_congroo(mrb_state *mrb, mrb_value self)
411{
412 mrb_raise(mrb, mrb_class_get(mrb, "Sys#exit Called"), "Normal Completion");
413
414 return mrb_nil_value(); /*戻り値は無しですよ。*/
415}
416
417/******************************************************/
418/* ライブラリを定義します*/
419/******************************************************/
420void kernel_Init(mrb_state *mrb)
421{
422 mrb_define_method(mrb, mrb->kernel_module, "pinMode", mrb_kernel_pinMode, MRB_ARGS_REQ(2));
423
424 mrb_define_method(mrb, mrb->kernel_module, "digitalWrite", mrb_kernel_digitalWrite, MRB_ARGS_REQ(2));
425 mrb_define_method(mrb, mrb->kernel_module, "pwm", mrb_kernel_pwm, MRB_ARGS_REQ(2));
426 mrb_define_method(mrb, mrb->kernel_module, "digitalRead", mrb_kernel_digitalRead, MRB_ARGS_REQ(1));
427
428 mrb_define_method(mrb, mrb->kernel_module, "analogReference", mrb_kernel_analogReference, MRB_ARGS_REQ(1));
429 mrb_define_method(mrb, mrb->kernel_module, "analogRead", mrb_kernel_analogRead, MRB_ARGS_REQ(1));
430
431 mrb_define_method(mrb, mrb->kernel_module, "tone", mrb_kernel_tone, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
432 mrb_define_method(mrb, mrb->kernel_module, "noTone", mrb_kernel_noTone, MRB_ARGS_REQ(1));
433
434 /*mrb_define_method(mrb, mrb->kernel_module, "pwmHz", mrb_kernel_pwmHz, MRB_ARGS_REQ(1));*/
435 mrb_define_method(mrb, mrb->kernel_module, "initDac", mrb_kernel_initDac, MRB_ARGS_NONE());
436 mrb_define_method(mrb, mrb->kernel_module, "analogDac", mrb_kernel_analogDac, MRB_ARGS_REQ(1));
437
438 mrb_define_method(mrb, mrb->kernel_module, "delay", mrb_kernel_delay, MRB_ARGS_REQ(1));
439 mrb_define_method(mrb, mrb->kernel_module, "millis", mrb_kernel_millis, MRB_ARGS_NONE());
440 mrb_define_method(mrb, mrb->kernel_module, "micros", mrb_kernel_micros, MRB_ARGS_NONE());
441
442 mrb_define_method(mrb, mrb->kernel_module, "led", mrb_kernel_led, MRB_ARGS_REQ(1));
443
444 mrb_define_method(mrb, mrb->kernel_module, "randomSeed", mrb_kernel_randomSeed, MRB_ARGS_REQ(1));
445 mrb_define_method(mrb, mrb->kernel_module, "random", mrb_kernel_random, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
446
447 struct RClass *El_PsyModule = mrb_define_module(mrb, "El_Psy");
448 mrb_define_module_function(mrb, El_PsyModule, "Congroo", mrb_El_Psy_congroo, MRB_ARGS_NONE());
449}
Note: See TracBrowser for help on using the repository browser.