mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mrbSPISlave.cpp Source File

mrbSPISlave.cpp

00001 #include "mbed.h"
00002 #include "mrbSPISlave.h"
00003 
00004 static struct mrb_data_type mbed_spis_type = {
00005     "SPISlave", mrb_mbed_spis_free
00006 };
00007 
00008 mrb_value
00009 mrb_mbed_spis_init(mrb_state *mrb, mrb_value self)
00010 {
00011     mrb_int mosi, miso, sclk, ssel;
00012 
00013     mrb_get_args(mrb, "iiii", &mosi, &miso, &sclk, &ssel);
00014     PinName pin_mosi = static_cast<PinName>(mosi);
00015     PinName pin_miso = static_cast<PinName>(miso);
00016     PinName pin_sclk = static_cast<PinName>(sclk);
00017     PinName pin_ssel = static_cast<PinName>(ssel);
00018 
00019     DATA_TYPE(self) = &mbed_spis_type;
00020     DATA_PTR(self) = new SPISlave(pin_mosi, pin_miso, pin_sclk, pin_ssel);
00021 
00022     return self;
00023 }
00024 
00025 void
00026 mrb_mbed_spis_free(mrb_state *mrb, void *ptr)
00027 {
00028     SPISlave *obj = static_cast<SPISlave*>(ptr);
00029     delete obj;
00030 }
00031 
00032 mrb_value
00033 mrb_mbed_spis_freq(mrb_state *mrb, mrb_value self)
00034 {
00035     SPISlave *obj = static_cast<SPISlave*>(DATA_PTR(self));
00036 
00037     mrb_int freq;
00038     if (mrb_get_args(mrb, "|i", &freq) == 0) {
00039         obj->frequency();
00040     } else {
00041         obj->frequency(freq);
00042     }
00043 
00044     return self;
00045 }
00046 
00047 mrb_value
00048 mrb_mbed_spis_format(mrb_state *mrb, mrb_value self)
00049 {
00050     SPISlave *obj = static_cast<SPISlave*>(DATA_PTR(self));
00051 
00052     mrb_int bits, mode;
00053     if (mrb_get_args(mrb, "i|i", &bits, &mode) == 1) {
00054         obj->format(bits);
00055     } else {
00056         obj->format(bits, mode);    
00057     }
00058 
00059     return self;
00060 }
00061 
00062 mrb_value
00063 mrb_mbed_spis_reply(mrb_state *mrb, mrb_value self)
00064 {
00065     SPISlave *obj = static_cast<SPISlave*>(DATA_PTR(self));
00066 
00067     mrb_int value;
00068     mrb_get_args(mrb, "i", &value);
00069     obj->reply(value);
00070 
00071     return self;
00072 }
00073 
00074 mrb_value
00075 mrb_mbed_spis_read(mrb_state *mrb, mrb_value self)
00076 {
00077     SPISlave *obj = static_cast<SPISlave*>(DATA_PTR(self));
00078 
00079     return mrb_fixnum_value(obj->read());
00080 }
00081 
00082 mrb_value
00083 mrb_mbed_spis_receive(mrb_state *mrb, mrb_value self)
00084 {
00085     SPISlave *obj = static_cast<SPISlave*>(DATA_PTR(self));
00086 
00087     mrb_value blk;
00088     mrb_get_args(mrb, "&", &blk);
00089     if (mrb_nil_p(blk)) {
00090         mrb_raise(mrb, E_ARGUMENT_ERROR, "without a block");
00091     } else {
00092         while (obj->receive()) {
00093             mrb_value ret = mrb_yield(mrb, blk, mrb_nil_value());
00094             if (mrb_fixnum(ret)!= 0) {
00095                 break;
00096             } 
00097         }
00098     }
00099     return self;
00100 }