mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
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 }
Generated on Tue Jul 12 2022 18:00:34 by 1.7.2