/* 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; }
int main(int argc, char *argv[]) { int blink[3], flip[2] = {0, 0}; int do_ao_only = FALSE; uint8_t i = 0; if (do_ao_only) { if (init_dac(0.0, 25.0, FALSE) < 0) { printf("Missing Analog AO subdevice\n"); return -1; } while (TRUE) { set_dac_volts(1, ((double) sine_wave[i])*0.007); set_dac_volts(0, ((double) sine_wave[255 - i++])*0.007); usleep(10); // printf("%d\n", i); } } else { if (init_daq(0.0, 25.0, FALSE) < 0) { printf("Missing Analog subdevice(s)\n"); return -1; } if (init_dio() < 0) { printf("Missing Digital subdevice(s)\n"); return -1; } set_dio_output(0); set_dio_output(1); set_dio_input(6); set_dio_input(7); put_dio_bit(0, 1); put_dio_bit(1, 1); blink[2] = 0; while (1) { get_data_sample(); if (blink[2]++ >= 100) { printf(" \r"); printf(" %2.3fV %2.3fV %2.3fV %2.3fV %2.3fV %2.3fV %2.3fV %u %u %u %u %u %u raw %x, %x", bmc.pv_voltage, bmc.cc_voltage, bmc.input_voltage, bmc.b1_voltage, bmc.b2_voltage, bmc.system_voltage, bmc.logic_voltage, bmc.datain.D0, bmc.datain.D1, bmc.datain.D2, bmc.datain.D3, bmc.datain.D6, bmc.datain.D7, bmc.adc_sample[0], bmc.adc_sample[1]); // usleep(4990); blink[2] = 0; if ((bmc.datain.D0 == 0)) { if (((blink[0]++) % 150) == 0) { flip[0] = !flip[0]; } printf(" Flip led 0 %x ", flip[0]); bmc.dataout.D0 = flip[0]; set_dac_volts(0, bmc.cc_voltage); } else { set_dac_volts(0, 0.666); bmc.dataout.D0 = 0; } if ((bmc.datain.D1 == 0)) { if (((blink[1]++) % 150) == 0) { flip[1] = !flip[1]; } printf(" Flip led 1 %x ", flip[1]); set_dac_volts(1, 0.333); bmc.dataout.D1 = flip[1]; } else { set_dac_volts(1, 1.666); bmc.dataout.D1 = 0; } } } } return 0; }