25#include "firmware_hash.h"
86static EthernetUDP
udp;
89static std::vector<daq::SensorDataChunkCollection>
dataChunks;
99 if (bus.endTransmission(
false) != 0)
102 if (bus.available() < len)
104 for (uint8_t i = 0; i < len; i++)
113 return ((uint16_t)(buf[0] << 8) | buf[1]) & 0x0FFF;
119 Serial.println(
"] Checking magnet...");
126 Serial.println(
"] ERROR: could not read STATUS — check wiring");
136 "] WARNING: magnet too strong — increase air gap");
142 Serial.println(
"] WARNING: magnet too weak — decrease air gap");
147 Serial.println(
"] Magnet detected OK");
154 Serial.println(
"] ERROR: no magnet detected after 3 s");
168 Serial.println(
"=== Encoder Self-Test ===");
170 uint8_t adc_good = 0;
171 Serial.println(
" ADC TDAC: FAIL (no ADC)");
174 Serial.print(
" Encoder 1 I2C: ");
175 Serial.println(enc1_ok ?
"PASS" :
"FAIL");
178 Serial.print(
" Encoder 2 I2C: ");
179 Serial.println(enc2_ok ?
"PASS" :
"FAIL");
181 std::vector<daq::SelfTestResult> results;
182 results.push_back(daq::SelfTestResult{
184 results.push_back(daq::SelfTestResult{
194 Serial.println(
" Sent SELF_TEST packet to server");
197 Serial.println(
"=========================");
201 Serial.println(
"State -> Active");
242 daq::BoardHeartbeatPacket hb;
267 Serial.println(
"=== ProtoEncoder Hotfire ===");
271 Wire.setClock(100000);
272 Serial.println(
"I2C bus 1 initialized (Encoder 1)");
277 Wire1.setClock(100000);
278 Serial.println(
"I2C bus 2 initialized (Encoder 2)");
282 ESP_ERROR_CHECK(esp_read_mac(
mac, ESP_MAC_ETH));
292 Serial.print(
"UDP listening on port ");
296 Serial.print(
"OTA TCP server listening on port ");
299 Serial.print(
"Board ID: ");
307 Serial.println(
"State -> Setup");
308 Serial.println(
"(Waiting for SENSOR_CONFIG packet to begin self-test)");
320 int packetSize =
udp.parsePacket();
321 if (packetSize > 0) {
323 udp.read(&typeByte, 1);
328 "SENSOR_CONFIG received -> State -> SelfTest");
345 (raw1 !=
READ_ERROR) ?
static_cast<uint32_t
>(raw1) : 0u;
347 (raw2 !=
READ_ERROR) ?
static_cast<uint32_t
>(raw2) : 0u;
362 unsigned long now =
millis();
#define ETHERNET_INIT_DELAY_MS
#define ETHERNET_BEGIN_DELAY_MS
#define BOARD_HEARTBEAT_INTERVAL_MS
#define ETHERNET_SPI_DELAY_MS
static EthernetClass Ethernet
std::vector< daq::SensorDataChunkCollection > dataChunks
IPAddress subnet(255, 255, 255, 0)
IPAddress staticIP(192, 168, 2, BOARD_ID_DEFAULT)
IPAddress serverIP(192, 168, 2, 20)
IPAddress gateway(0, 0, 0, 0)
bool i2cReadBytes(uint8_t reg, uint8_t *buf, uint8_t len)
bool checkMagnetPresence()
static IPAddress subnet(255, 255, 255, 0)
static IPAddress gateway(192, 168, 2, 1)
StarOTA::Server otaServer(OTA_TCP_PORT)
static constexpr int ETH_CS
Ball Valve Hotfire — motorized ball valve prototype board.
static constexpr int ETH_SCLK
static constexpr int ETH_MISO
static constexpr int ETH_MOSI
static IPAddress serverIP(192, 168, 2, HOTFIRE_SERVER_IP_OCTET_4)
static bool testEncoderComms(TwoWire &bus)
static void runSelfTest()
static IPAddress dns_addr(192, 168, 2, 1)
static constexpr int ENC2_SDA
static constexpr int ENC2_SCL
static constexpr int ENC1_SCL
static constexpr uint8_t SENSOR_ID_ENC2
static constexpr uint8_t SENSOR_ID_ENC1
static void sendHeartbeat()
static void sendDataChunks()
static constexpr int ENC1_SDA
static daq::BoardState currentBoardState()
static constexpr int ENCODER_PACKET_BUF_SIZE
static unsigned long lastHeartbeatMs
static constexpr int UDP_LISTEN_PORT
static void start(gnss_frame_parser_t *p, uint8_t byte)
#define HOTFIRE_SERVER_PORT
#define HOTFIRE_SERVER_IP_OCTET_4
void printTestMessage()
Bench-test helper: prints STAR_OTA_TEST_MESSAGE on a timer as.
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.
size_t create_board_heartbeat_packet(const BoardHeartbeatPacket &data, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Board Heartbeat packet in the provided buffer.
BoardState
Defines the operational state of a board.
size_t create_self_test_packet(uint8_t adc_good, const std::vector< SelfTestResult > &results, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Self Test packet in the provided buffer.
*brief user defined string literal for JSON values *sa std::size_t n
#define SENSOR_MAX_CHUNKS_BEFORE_SEND
Represents a single data chunk with timestamp and sensor datapoints.