#include "ch32fun_adc.h" void c_adc_new(mrb_vm *vm, mrb_value *v, int argc){ v[0] = mrbc_instance_new(vm, v[0].cls, sizeof(ADC_HANDLE)); ADC_HANDLE *handle = (ADC_HANDLE *)v[0].instance->data; if(argc>0){ uint8_t dpin = GET_INT_ARG(1); #if defined(CH32X03x) handle->pin_num = ((dpin>>1)==12)? dpin-16 : ((dpin>>2)==12)? dpin-38 : ((dpin>>3)==0)? dpin : 15; #else handle->pin_num = ((dpin>>1)==8)? dpin-8 : ((dpin>>3)==4)? dpin-22 : ((dpin>>3)==0)? dpin : 16; #endif } } void c_adc_read_raw(mrb_vm *vm, mrb_value *v, int argc){ ADC_HANDLE *handle = (ADC_HANDLE *)v[0].instance->data; SET_INT_RETURN( funAnalogRead( handle->pin_num ) ); } #if MRBC_USE_FLOAT void c_adc_read_voltage(mrb_vm *vm, mrb_value *v, int argc){ ADC_HANDLE *handle = (ADC_HANDLE *)v[0].instance->data; float adc_p = ADC_REF * funAnalogRead( handle->pin_num ) / ADC_RANGE; SET_FLOAT_RETURN(adc_p); } #endif void mrbc_init_class_adc(void){ mrb_class *adc = mrbc_define_class(0, "ADC", mrbc_class_object); mrbc_define_method(0, adc, "new", c_adc_new); mrbc_define_method(0, adc, "read_raw", c_adc_read_raw); #if MRBC_USE_FLOAT mrbc_define_method(0, adc, "read_voltage", c_adc_read_voltage); mrbc_define_method(0, adc, "read", c_adc_read_voltage); #else mrbc_define_method(0, adc, "read", c_adc_read_raw); #endif }