/* typedef struct bmcdata { double pv_voltage,cc_voltage, input_voltage, b1_voltage, b2_voltage, system_voltage,logic_voltage; double pv_current,cc_current,battery_current; struct didata datain; struct dodata dataout; int32_t utc; } */ int get_data_sample(void) { int i; for (i = 0; i < 1; i++) { // several samples per reading bmc.pv_voltage = lp_filter(get_adc_volts(PVV_C), PVV_C, TRUE); bmc.cc_voltage = lp_filter(get_adc_volts(CCV_C), CCV_C, TRUE); // bmc.input_voltage = lp_filter(get_adc_volts(INV_C), INV_C, TRUE); // bmc.b1_voltage = lp_filter(get_adc_volts(B1V_C), B1V_C, TRUE); // bmc.b2_voltage = lp_filter(get_adc_volts(B2V_C), B2V_C, TRUE); // bmc.pv_current = lp_filter(get_adc_volts(PVC_C), PVC_C, TRUE); // bmc.cc_current = lp_filter(get_adc_volts(CCC_C), CCC_C, TRUE); // bmc.battery_current = lp_filter(get_adc_volts(BAC_C), BAC_C, TRUE); } // bmc.system_voltage = get_adc_volts(SYV_C); // bmc.logic_voltage = get_adc_volts(VD5_C); bmc.datain.D0 = get_dio_bit(8); // GPIO 0/2 bmc.datain.D1 = get_dio_bit(9); // GPIO 1/3 bmc.datain.D2 = get_dio_bit(0); // read output bit wpi 0 bmc.datain.D3 = get_dio_bit(1); // read output bit wpi 1 bmc.datain.D4 = get_dio_bit(12); bmc.datain.D5 = get_dio_bit(13); bmc.datain.D6 = get_dio_bit(15); // GPIO 14 bmc.datain.D7 = get_dio_bit(16); // GPIO 15 put_dio_bit(0, bmc.dataout.D0); put_dio_bit(1, bmc.dataout.D1); put_dio_bit(2, bmc.dataout.D2); put_dio_bit(3, bmc.dataout.D3); put_dio_bit(4, bmc.dataout.D4); put_dio_bit(5, bmc.dataout.D5); put_dio_bit(6, bmc.dataout.D6); put_dio_bit(7, bmc.dataout.D7); }
int get_data_sample(void) { int i; static int pv_stable = 0, current_null_reset = FALSE, first_run = TRUE; if (HAVE_AI) { bmc.pv_voltage = lp_filter(get_adc_volts(PVV_C, TRUE, RANGE_10) * PVV_GAIN, PVV_C, TRUE); // read PV voltage on DIFF channels bmc.cm_voltage = lp_filter(get_adc_volts(CMV_C, FALSE, RANGE_5), CMV_C, TRUE); // back to SE channels bmc.cm_current = lp_filter(get_adc_volts(CMA_C, FALSE, RANGE_5), CMA_C, TRUE); if (bmc.pv_voltage < 0.0) bmc.pv_voltage = 0.0; if (bmc.cm_voltage < 0.0) bmc.cm_voltage = 0.0; if (bmc.cm_current < 0.0) bmc.cm_current = 0.0; if (first_run) { first_run = FALSE; bmc.cm_null = CMA_DEFAULT; get_adc_volts(PVV_NULL, TRUE, RANGE_10); } if (bmc.pv_voltage > 3.0) { // use the default current null if we have not reset the null if (!current_null_reset) bmc.cm_null = bmc.cm_voltage * CMA_NULL; pv_stable = 0; // when voltage drops wait a bit until the null update } else { if (pv_stable++ > 64) current_null_reset = TRUE; // wait for readings to be stable if (current_null_reset) { if (bmc.cm_current > 2.0) bmc.cm_null = bmc.cm_current; // make sure we have something real current_null_reset = FALSE; } } bmc.cm_amps = lp_filter((bmc.cm_current - bmc.cm_null) / CMA_GAIN, CMC_C, TRUE); if (bmc.cm_amps < 0.0) bmc.cm_amps = 0.0; } else { return -1; } // FIXME if (HAVE_DIO) { bmc.datain.D0 = get_dio_bit(8); bmc.datain.D1 = get_dio_bit(9); bmc.datain.D2 = get_dio_bit(10); bmc.datain.D3 = get_dio_bit(11); bmc.datain.D4 = get_dio_bit(12); bmc.datain.D5 = get_dio_bit(13); bmc.datain.D6 = get_dio_bit(14); bmc.datain.D7 = get_dio_bit(15); put_dio_bit(0, bmc.dataout.D0); put_dio_bit(1, bmc.dataout.D1); put_dio_bit(2, bmc.dataout.D2); put_dio_bit(3, bmc.dataout.D3); put_dio_bit(4, bmc.dataout.D4); put_dio_bit(5, bmc.dataout.D5); put_dio_bit(6, bmc.dataout.D6); put_dio_bit(7, bmc.dataout.D7); } else { return -2; } return 0; }
int get_data_sample(void) { int i; static int pv_stable = 0, first_run = TRUE, set_range; if (HAVE_AI) { if (bmc.pv_voltage < 0.5) { set_range = RANGE_0_512; gain_adj = ADGAIN2; } else { set_range = RANGE_2_048; gain_adj = ADGAIN1; } if (bmc.pv_voltage < 0.0) bmc.pv_voltage = 0.0; if (first_run) { if (pv_stable++ > PVV_NULL_TIME) first_run = FALSE; if (RAW_DATA) { if (pv_stable > PVV_NULL_TIME_RAW) first_run = FALSE; } bmc.pv_voltage_null = lp_filter(get_adc_volts(PVV_NULL, TRUE, set_range), PVV_NULL, FALSE); ; } else { if (RAW_DATA_NOFIL) { bmc.pv_voltage = get_adc_volts(PVV_C, TRUE, set_range); // read PV voltage on DIFF channels, no filter } else { bmc.pv_voltage = lp_filter(get_adc_volts(PVV_C, TRUE, set_range), PVV_C, FALSE); // read PV voltage on DIFF channels } } } else { return -1; } // FIXME if (HAVE_DIO) { bmc.datain.D0 = get_dio_bit(8); bmc.datain.D1 = get_dio_bit(9); bmc.datain.D2 = get_dio_bit(10); bmc.datain.D3 = get_dio_bit(11); bmc.datain.D4 = get_dio_bit(12); bmc.datain.D5 = get_dio_bit(13); bmc.datain.D6 = get_dio_bit(14); bmc.datain.D7 = get_dio_bit(15); put_dio_bit(0, bmc.dataout.D0); put_dio_bit(1, bmc.dataout.D1); put_dio_bit(2, bmc.dataout.D2); put_dio_bit(3, bmc.dataout.D3); put_dio_bit(4, bmc.dataout.D4); put_dio_bit(5, bmc.dataout.D5); put_dio_bit(6, bmc.dataout.D6); put_dio_bit(7, bmc.dataout.D7); } else { return -2; } return 0; }