/* called at 1kHz */ void VRBRAINAnalogIn::_timer_tick(void) { if (_adc_fd == -1) { // not initialised yet return; } // read adc at 100Hz uint32_t now = AP_HAL::micros(); uint32_t delta_t = now - _last_run; if (delta_t < 10000) { return; } _last_run = now; struct adc_msg_s buf_adc[VRBRAIN_ANALOG_MAX_CHANNELS]; // cope with initial setup of stop pin if (_channels[_current_stop_pin_i] == nullptr || _channels[_current_stop_pin_i]->_stop_pin == -1) { next_stop_pin(); } /* read all channels available */ int ret = read(_adc_fd, &buf_adc, sizeof(buf_adc)); if (ret > 0) { // match the incoming channels to the currently active pins for (uint8_t i=0; i<ret/sizeof(buf_adc[0]); i++) { Debug("chan %u value=%u\n", (unsigned)buf_adc[i].am_channel, (unsigned)buf_adc[i].am_data); for (uint8_t j=0; j<VRBRAIN_ANALOG_MAX_CHANNELS; j++) { VRBRAIN::VRBRAINAnalogSource *c = _channels[j]; if (c != nullptr && buf_adc[i].am_channel == c->_pin) { // add a value if either there is no stop pin, or // the stop pin has been settling for enough time if (c->_stop_pin == -1 || (_current_stop_pin_i == j && AP_HAL::millis() - _stop_pin_change_time > c->_settle_time_ms)) { c->_add_value(buf_adc[i].am_data, _board_voltage); if (c->_stop_pin != -1 && _current_stop_pin_i == j) { next_stop_pin(); } } } } } } }
/* called at 1kHz */ void VRBRAINAnalogIn::_timer_tick(void) { // read adc at 100Hz uint32_t now = AP_HAL::micros(); uint32_t delta_t = now - _last_run; if (delta_t < 10000) { return; } _last_run = now; struct adc_msg_s buf_adc[VRBRAIN_ANALOG_MAX_CHANNELS]; // cope with initial setup of stop pin if (_channels[_current_stop_pin_i] == NULL || _channels[_current_stop_pin_i]->_stop_pin == -1) { next_stop_pin(); } /* read all channels available */ int ret = read(_adc_fd, &buf_adc, sizeof(buf_adc)); if (ret > 0) { // match the incoming channels to the currently active pins for (uint8_t i=0; i<ret/sizeof(buf_adc[0]); i++) { Debug("chan %u value=%u\n", (unsigned)buf_adc[i].am_channel, (unsigned)buf_adc[i].am_data); for (uint8_t j=0; j<VRBRAIN_ANALOG_MAX_CHANNELS; j++) { VRBRAIN::VRBRAINAnalogSource *c = _channels[j]; if (c != NULL && buf_adc[i].am_channel == c->_pin) { // add a value if either there is no stop pin, or // the stop pin has been settling for enough time if (c->_stop_pin == -1 || (_current_stop_pin_i == j && AP_HAL::millis() - _stop_pin_change_time > c->_settle_time_ms)) { c->_add_value(buf_adc[i].am_data, _board_voltage); if (c->_stop_pin != -1 && _current_stop_pin_i == j) { next_stop_pin(); } } } } } } // check for new battery data on FMUv1 if (_battery_handle != -1) { struct battery_status_s battery; bool updated = false; if (orb_check(_battery_handle, &updated) == 0 && updated) { orb_copy(ORB_ID(battery_status), _battery_handle, &battery); if (battery.timestamp != _battery_timestamp) { _battery_timestamp = battery.timestamp; for (uint8_t j=0; j<VRBRAIN_ANALOG_MAX_CHANNELS; j++) { VRBRAIN::VRBRAINAnalogSource *c = _channels[j]; if (c == NULL) continue; if (c->_pin == VRBRAIN_ANALOG_ORB_BATTERY_VOLTAGE_PIN) { c->_add_value(battery.voltage_v / VRBRAIN_VOLTAGE_SCALING, 0); } if (c->_pin == VRBRAIN_ANALOG_ORB_BATTERY_CURRENT_PIN) { // scale it back to voltage, knowing that the // px4io code scales by 90.0/5.0 c->_add_value(battery.current_a * (5.0f/90.0f) / VRBRAIN_VOLTAGE_SCALING, 0); } } } } } }
/* called at 1kHz */ void VRBRAINAnalogIn::_timer_tick(void) { // read adc at 100Hz uint32_t now = hal.scheduler->micros(); uint32_t delta_t = now - _last_run; if (delta_t < 10000) { return; } _last_run = now; struct adc_msg_s buf_adc[VRBRAIN_ANALOG_MAX_CHANNELS]; /* read all channels available */ int ret = read(_adc_fd, &buf_adc, sizeof(buf_adc)); if (ret > 0) { // match the incoming channels to the currently active pins for (uint8_t i=0; i<ret/sizeof(buf_adc[0]); i++) { } for (uint8_t i=0; i<ret/sizeof(buf_adc[0]); i++) { Debug("chan %u value=%u\n", (unsigned)buf_adc[i].am_channel, (unsigned)buf_adc[i].am_data); for (uint8_t j=0; j<VRBRAIN_ANALOG_MAX_CHANNELS; j++) { VRBRAIN::VRBRAINAnalogSource *c = _channels[j]; if (c != NULL && buf_adc[i].am_channel == c->_pin) { c->_add_value(buf_adc[i].am_data, _board_voltage); } } } } // check for new battery data on FMUv1 if (_battery_handle != -1) { struct battery_status_s battery; bool updated = false; if (orb_check(_battery_handle, &updated) == 0 && updated) { orb_copy(ORB_ID(battery_status), _battery_handle, &battery); if (battery.timestamp != _battery_timestamp) { _battery_timestamp = battery.timestamp; for (uint8_t j=0; j<VRBRAIN_ANALOG_MAX_CHANNELS; j++) { VRBRAIN::VRBRAINAnalogSource *c = _channels[j]; if (c == NULL) continue; if (c->_pin == VRBRAIN_ANALOG_ORB_BATTERY_VOLTAGE_PIN) { c->_add_value(battery.voltage_v / VRBRAIN_VOLTAGE_SCALING, 0); } if (c->_pin == VRBRAIN_ANALOG_ORB_BATTERY_CURRENT_PIN) { // scale it back to voltage, knowing that the // px4io code scales by 90.0/5.0 c->_add_value(battery.current_a * (5.0f/90.0f) / VRBRAIN_VOLTAGE_SCALING, 0); } } } } } }