25#include "STAR_ADS126X.h"
29#define PINS_ACTIVE_LAYOUT sense_board_pins::LC_Board
47#define FILTER ADS126X_SINC4
48#define DATA_RATE ADS126X_RATE_20
50#define GAIN ADS126X_GAIN_32
68 for (
int i = 0; i < cycles; i++) {
78 const uint8_t active_count =
coreState.stored_config.num_sensors;
79 if (active_count == 0)
81 const uint8_t* active_ids =
coreState.stored_config.sensor_ids;
84 for (uint8_t i = 0; i < active_count; i++) {
85 const uint8_t connector_id = active_ids[i];
88 if (ch1 < 0 || ch2 < 0)
91 ads126x.setInputMux(
static_cast<uint8_t
>(ch1),
92 static_cast<uint8_t
>(ch2));
108 const auto reading =
ads126x.readADC1();
109 const uint32_t
value =
110 reading.checksumValid ?
static_cast<uint32_t
>(reading.value) : 0u;
113 if (
chunk.size() == active_count &&
119 bool also_to_abort_controller,
121 int abort_controller_port) {
131 const uint8_t num_sensors =
dataChunks[0].num_sensors;
134 if (packetSize == 0) {
135 HF_VERBOSE(
"Send FAIL: create_sensor_data_packet returned 0 (n=");
142 coreState.udp.beginPacket(dest_ip, dest_port);
150 unsigned long now =
millis();
154 for (
size_t i = 0; i <
dataChunks.size(); ++i) {
161 for (
const auto& dp :
chunk.datapoints) {
163 HF_VERBOSE(
static_cast<unsigned>(dp.sensor_id));
172 if (also_to_abort_controller) {
173 coreState.udp.beginPacket(abort_controller_ip, abort_controller_port);
211 bool also_to_abort_controller,
213 int abort_controller_port) {
216 abort_controller_ip, abort_controller_port);
221 std::vector<daq::SelfTestResult>& results_out) {
225 results_out.push_back(daq::SelfTestResult{
226 0u,
static_cast<uint8_t
>(adc_result.passed ? 1 : 0)});
230 for (uint8_t i = 0; i < cfg.num_sensors; i++) {
231 uint8_t
id = cfg.sensor_ids[i];
234 if (ch1 < 0 || ch2 < 0)
238 static_cast<uint8_t
>(ch1),
239 static_cast<uint8_t
>(ch2));
242 results_out.push_back(daq::SelfTestResult{id, pass});
void delayMicroseconds(unsigned int)
#define ADS126X_REF_POS_VDD
#define ADS126X_REF_NEG_VSS
#define ADS126X_REF_POS_INT
#define SENSOR_HOTFIRE_MAX_PACKET_SIZE
Shared sensor hotfire state machine core — PT / TC / LC boards.
#define ADS126X_ASSERT_FILTER_RATE(filter, rate)
constexpr uint8_t settlePulses(uint8_t filter, uint8_t data_rate, bool chop_enabled=false, bool idac_rotation_enabled=false)
std::vector< daq::SensorDataChunkCollection > dataChunks
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]
static unsigned long g_last_sensor_packet_log_ms
static void run_self_test_cb(void *, const SensorHotfire::StoredSensorConfig &cfg, std::vector< daq::SelfTestResult > &results_out)
static const uint8_t LC_ADC1_CONNECTORS[]
static void collect_chunk_cb(void *)
static void flush_cycles(int cycles)
static void send_chunks_to_impl(IPAddress dest_ip, int dest_port, bool also_to_abort_controller, IPAddress abort_controller_ip, int abort_controller_port)
static SensorHotfire::Config coreConfig
static void init_adc_cb(void *)
static SensorHotfire::CoreState coreState
static void on_reference_voltage_cb(void *, uint8_t reference_voltage)
static void collect_chunk_impl()
static void send_chunks_to_cb(void *, IPAddress dest_ip, int dest_port, bool also_to_abort_controller, IPAddress abort_controller_ip, int abort_controller_port)
#define HF_VERBOSELN(...)
void setup(CoreState &s, const Config &cfg)
void loop(CoreState &s, const Config &cfg)
void sensor_bias_disable(ADS126X &adc)
Call once after the connector loop.
BiasReadResult read_sensor_bias(ADS126X &adc, uint8_t drdy_pin, uint8_t adc_channel, uint8_t aincom, uint8_t settle_cycles=5)
Read one connector with sensor bias already active.
void sensor_bias_enable(ADS126X &adc)
Call once before the connector loop.
AdcSelfTestResult run_adc_self_test(ADS126X &adc, uint8_t drdy_pin, uint8_t original_ref_neg, uint8_t original_ref_pos)
size_t create_sensor_data_packet(const std::vector< SensorDataChunkCollection > &chunks, const uint8_t num_sensors, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Sensor Data packet in the provided buffer.
constexpr int getAdcChannel(uint8_t connector, uint8_t pin)
constexpr const Layout & Pins
bool sensorBatchReady(size_t queued, size_t max_chunks, uint32_t oldest_ms, uint32_t now_ms, uint32_t max_age_ms)
#define SENSOR_MAX_CHUNKS_BEFORE_SEND
#define SENSOR_MAX_BATCH_AGE_MS
Represents a single data chunk with timestamp and sensor datapoints.