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

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

mruby版ECNLプロトタイピング・ツールを追加

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