STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include "main.h"
2
3#include <Arduino.h>
4#include <Ethernet.h>
5#include <EthernetUdp.h>
6#include <SPI.h>
7#include <daq-protocol.h>
8
9#include <cstring>
10
11#include "STAR_ADS126X.h"
12#include "adc_mappings.h"
13#include "esp_mac.h"
14
15// Change the following line to automatically use the correct pins for the board
16// being tested (PT_Board, LC_Board, RTD_Board, or TC_Board)
17#define PINS_ACTIVE_LAYOUT sense_board_pins::RTD_Board
18
19// These lines MUST be after the #define PINS_ACTIVE_LAYOUT or they will
20// overwrite it with the default value!
21#include "connector_adc_map.h"
22#include "sense_board_pins.h"
23
24// RTD board: cycle connectors 1 and 2 only. Each connector is differential (pin
25// 1 vs pin 2) with IDAC excitation.
26#define NUM_CONNECTORS 2
27#define MAX_CHUNKS_PER_PACKET 8
28
29using namespace sense_board_pins;
30
31// Ethernet configuration
32byte mac[6];
33IPAddress staticIP(192, 168, 2, 101);
34IPAddress gateway(0, 0, 0, 0);
35IPAddress subnet(255, 255, 255, 0);
36IPAddress dns(192, 168, 2, 1);
37IPAddress receiverIP(192, 168, 2, 20);
38const int receiverPort = 5006;
39EthernetUDP udp;
40
42SPIClass ADC_SPI(HSPI);
43
44// Forward declarations
45void flush_adc_cycles(int cycles);
46void read_single_connector(uint8_t connector_id, int num_readings,
48void set_connector_rtd(uint8_t connector_id);
49void collect_chunk();
51
52std::vector<daq::SensorDataChunkCollection> chunks;
53
54float convert_code_to_voltage(int32_t code) {
55 return ((float)code * 2.5f) / 2147483648.0f;
56}
57
58void setup() {
59 Serial.begin(115200);
60 Serial.println("Starting RTD streaming (connectors 1 & 2)...");
61
62 // Setup ADC SPI
63 ADC_SPI.begin(Pins.ADC_SCLK, Pins.ADC_MISO, Pins.ADC_MOSI, Pins.ADC_CS_1);
64 ADC_SPI.setDataMode(SPI_MODE1);
65 pinMode(Pins.ADC_DRDY_1, INPUT);
66
67 ads126x.begin(Pins.ADC_CS_1, &ADC_SPI);
68 ads126x.stopADC1();
69
70 // Initial mux/IDAC will be set per connector in collect_chunk
71 ads126x.setInputMux(getAdcChannel(1, 1), getAdcChannel(1, 2));
72 ads126x.bypassPGA();
73 ads126x.setFilter(FILTER);
74 ads126x.setRate(DATA_RATE);
75
76 {
77 const int idac1 = getIdacChannel(1, 1);
78 const int idac2 = getIdacChannel(1, 2);
79 if (idac1 >= 0) {
80 ads126x.setIDAC1Pin(static_cast<uint8_t>(idac1));
81 ads126x.setIDAC1Mag(ADS126X_IDAC_MAG_1000);
82 }
83 if (idac2 >= 0) {
84 ads126x.setIDAC2Pin(static_cast<uint8_t>(idac2));
85 ads126x.setIDAC2Mag(ADS126X_IDAC_MAG_1000);
86 }
87 }
88
89 ads126x.startADC1();
90
91 // MAC from ESP32 eFuse
92 ESP_ERROR_CHECK(esp_read_mac(mac, ESP_MAC_ETH));
93 Serial.print("MAC: ");
94 for (int i = 0; i < 6; i++) {
95 if (i > 0)
96 Serial.print(":");
97 if (mac[i] < 0x10)
98 Serial.print("0");
99 Serial.print(mac[i], HEX);
100 }
101 Serial.println();
102
103 // Ethernet
104 SPI.begin(Pins.ETH_SCLK, Pins.ETH_MISO, Pins.ETH_MOSI, Pins.ETH_CS);
105 delay(1000);
106 Ethernet.init(Pins.ETH_CS);
107 delay(1000);
109 delay(1000);
110 udp.begin(5005);
111
112 Serial.print("Ethernet OK, IP: ");
113 Serial.println(Ethernet.localIP());
114 Serial.println("Setup complete.");
115}
116
117void loop() {
119
120 if (chunks.size() >= MAX_CHUNKS_PER_PACKET) {
122 chunks.clear();
123 }
124}
125
126void flush_adc_cycles(int cycles) {
127 for (int i = 0; i < cycles; i++) {
128 while (digitalRead(Pins.ADC_DRDY_1) != LOW) {
130 }
131 }
132}
133
134void set_connector_rtd(uint8_t connector_id) {
135 ads126x.setInputMux(getAdcChannel(connector_id, 1),
136 getAdcChannel(connector_id, 2));
137 const int idac1 = getIdacChannel(connector_id, 1);
138 const int idac2 = getIdacChannel(connector_id, 2);
139 if (idac1 >= 0) {
140 ads126x.setIDAC1Pin(static_cast<uint8_t>(idac1));
141 ads126x.setIDAC1Mag(ADS126X_IDAC_MAG_1000);
142 }
143 if (idac2 >= 0) {
144 ads126x.setIDAC2Pin(static_cast<uint8_t>(idac2));
145 ads126x.setIDAC2Mag(ADS126X_IDAC_MAG_1000);
146 }
147}
148
149void read_single_connector(uint8_t connector_id, int num_readings,
151 uint32_t value = 0;
152
153 for (int i = 0; i < num_readings; i++) {
154 while (digitalRead(Pins.ADC_DRDY_1) != LOW) {
156 }
157 const auto reading = ads126x.readADC1();
158 if (!reading.checksumValid) {
159 Serial.println("Warning: Bad checksum");
160 continue;
161 }
162 value = static_cast<uint32_t>(reading.value);
163 }
164
165 chunk.add_datapoint(connector_id, value);
166}
167
170
171 for (uint8_t connector_id = 1; connector_id <= NUM_CONNECTORS;
172 connector_id++) {
173 set_connector_rtd(connector_id);
176 }
177
178 if (!chunk.empty()) {
179 chunks.push_back(chunk);
180 }
181}
182
184 if (chunks.empty()) {
185 return;
186 }
187
189 size_t packetSize = daq::create_sensor_data_packet(
191
192 if (packetSize == 0) {
193 Serial.println("Error: Failed to create sensor data packet");
194 return;
195 }
196
197 udp.beginPacket(receiverIP, receiverPort);
198 udp.write(packetBuffer, packetSize);
199 udp.endPacket();
200
201 Serial.print("Sent RTD packet: ");
202 Serial.print(packetSize);
203 Serial.print(" bytes, ");
204 Serial.print(chunks.size());
205 Serial.println(" chunks");
206}
#define FILTER
Definition main.h:4
#define DATA_RATE
Definition main.h:5
static SerialStub Serial
Definition Arduino.h:128
#define INPUT
Definition Arduino.h:21
#define HSPI
Definition Arduino.h:132
int digitalRead(int)
Definition Arduino.h:50
void pinMode(int, int)
Definition Arduino.h:46
unsigned long millis()
Definition Arduino.h:29
#define HEX
Definition Arduino.h:24
#define SPI_MODE1
Definition Arduino.h:131
#define LOW
Definition Arduino.h:20
void delayMicroseconds(unsigned int)
Definition Arduino.h:58
static EthernetClass Ethernet
Definition Ethernet.h:116
#define MAX_PACKET_SIZE
Definition main.h:6
#define READINGS_PER_CONNECTOR
Definition main.h:3
#define ADS126X_IDAC_MAG_1000
void delay(int ms)
constexpr uint8_t settlePulses(uint8_t filter, uint8_t data_rate, bool chop_enabled=false, bool idac_rotation_enabled=false)
static uint8_t chunk[64]
Definition board_uart9.c:12
const int receiverPort
Definition main.cpp:26
IPAddress receiverIP(192, 168, 2, 20)
static ADS126X ads126x
Definition main.cpp:20
SPIClass ADC_SPI(HSPI)
std::vector< daq::SensorDataChunkCollection > chunks
Definition main.cpp:55
#define NUM_CONNECTORS
Definition main.cpp:28
IPAddress dns(192, 168, 2, 1)
byte mac[6]
Definition main.cpp:31
IPAddress subnet(255, 255, 255, 0)
IPAddress staticIP(192, 168, 2, BOARD_ID_DEFAULT)
EthernetUDP udp
Definition main.cpp:40
IPAddress gateway(0, 0, 0, 0)
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]
Definition main.cpp:15
void read_single_connector(uint8_t connector_id, int num_readings, daq::SensorDataChunkCollection &chunk)
Definition main.cpp:149
#define MAX_CHUNKS_PER_PACKET
Definition main.cpp:27
void setup()
Definition main.cpp:58
IPAddress dns(192, 168, 2, 1)
SPIClass ADC_SPI(HSPI)
IPAddress subnet(255, 255, 255, 0)
void collect_chunk()
Definition main.cpp:168
IPAddress receiverIP(192, 168, 2, 20)
void sendSensorDataPacket()
Definition main.cpp:183
float convert_code_to_voltage(int32_t code)
Definition main.cpp:54
void flush_adc_cycles(int cycles)
Definition main.cpp:126
IPAddress staticIP(192, 168, 2, 101)
void set_connector_rtd(uint8_t connector_id)
Definition main.cpp:134
IPAddress gateway(0, 0, 0, 0)
void loop()
Definition main.cpp:117
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 getIdacChannel(uint8_t connector, uint8_t pin)
constexpr int getAdcChannel(uint8_t connector, uint8_t pin)
constexpr const Layout & Pins
Represents a single data chunk with timestamp and sensor datapoints.