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 <Adafruit_BME280.h>
4#include <Arduino.h>
5#include <Ethernet.h>
6#include <EthernetUdp.h>
7#include <SPI.h>
8#include <STAR_EthernetOTA.h>
9#include <Wire.h>
10#include <daq-protocol.h>
11#include <esp_mac.h>
12
13#include "firmware_hash.h"
14#include "pins.h"
15
16static Adafruit_BME280 bme;
17static EthernetUDP udp;
19
20static byte mac[6];
22static IPAddress static_ip(192, 168, 2, ENV_BOARD_ID);
23static IPAddress gateway(192, 168, 2, 1);
24static IPAddress subnet(255, 255, 255, 0);
25static IPAddress dns_ip(192, 168, 2, 1);
26
27// Sized for the largest packet sent: BOARD_HEARTBEAT (~41 bytes)
28static uint8_t pkt_buf[64];
29
30void setup() {
31 Serial.begin(115200);
32 while (!Serial)
33 delay(10);
34
36 Serial.println("Environmental Tracker starting...");
37
38 // BME280
39 Wire.begin(PIN_SDA, PIN_SCL);
40 if (!bme.begin(BME280_I2C_ADDR, &Wire)) {
41 Serial.println(
42 "ERROR: BME280 not found. Check wiring and I2C address!");
43 while (1)
44 delay(100);
45 }
46 Serial.println("BME280 OK");
47
48 // Ethernet — mirrors hotfire sensor board init (no ETH_RST)
49 ESP_ERROR_CHECK(esp_read_mac(mac, ESP_MAC_ETH));
52 Ethernet.init(PIN_ETH_CS);
56
57 udp.begin(ENV_LOCAL_PORT);
58 ota_server.begin();
59
60 Serial.print("IP: ");
61 Serial.println(Ethernet.localIP());
62 Serial.print("Server: 192.168.2.");
64 Serial.print(":");
65 Serial.println(ENV_SERVER_PORT);
66 Serial.print("Send rate: ");
68 Serial.println(" Hz");
69 Serial.print("OTA port: ");
70 Serial.println(ENV_OTA_PORT);
71 Serial.println("Setup complete.");
72 Serial.flush();
73}
74
75void loop() {
76 static unsigned long last_env_send = 0;
77 static unsigned long last_heartbeat = 0;
78
79 // OTA — non-blocking poll; blocks only if a client actually connects
80 // Blocks only if a client connects; never returns on success.
81 ota_server.poll();
83
84 // Receive UDP — log SERVER_HEARTBEAT, discard everything else
85 int pkt_size = udp.parsePacket();
86 if (pkt_size > 0) {
87 int bytes_read = udp.read(pkt_buf, sizeof(pkt_buf));
88 if (bytes_read > 0 && static_cast<daq::PacketType>(pkt_buf[0]) ==
90 daq::PacketHeader hdr;
91 daq::ServerHeartbeatPacket data;
93 data)) {
94 Serial.print("Server heartbeat received (t=");
95 Serial.print(hdr.timestamp);
96 Serial.println("ms)");
97 }
98 }
99 }
100
101 unsigned long now = millis();
102
103 // Send ENVIRONMENTAL_DATA at ENV_SEND_RATE_HZ
104 if (now - last_env_send >= ENV_SEND_INTERVAL_MS) {
105 last_env_send = now;
106
107 float temp = bme.readTemperature();
108 uint32_t press = (uint32_t)bme.readPressure();
109 float hum = bme.readHumidity();
110
112 temp, press, hum, millis(), pkt_buf, sizeof(pkt_buf));
113 if (n > 0) {
114 udp.beginPacket(server_ip, ENV_SERVER_PORT);
115 udp.write(pkt_buf, n);
116 udp.endPacket();
117 }
118
119 Serial.printf("ENV: %.2f C %lu Pa %.2f %%RH\n", temp, press, hum);
120 }
121
122 // Send BOARD_HEARTBEAT at ENV_HEARTBEAT_INTERVAL_MS — always
123 // BoardState::ACTIVE
124 if (now - last_heartbeat >= ENV_HEARTBEAT_INTERVAL_MS) {
125 last_heartbeat = now;
126
127 daq::BoardHeartbeatPacket hb;
128 memcpy(hb.firmware_hash, FirmwareHash::get(), 32);
129 hb.board_id = ENV_BOARD_ID;
130 hb.engine_state = daq::EngineState::SAFE;
131 hb.board_state = daq::BoardState::ACTIVE;
132
134 sizeof(pkt_buf));
135 if (n > 0) {
136 udp.beginPacket(server_ip, ENV_SERVER_PORT);
137 udp.write(pkt_buf, n);
138 udp.endPacket();
139 }
140 }
141
142 delay(10);
143}
static SerialStub Serial
Definition Arduino.h:128
unsigned long millis()
Definition Arduino.h:29
#define PIN_SDA
Definition pins.h:17
#define PIN_SCL
Definition pins.h:18
#define BME280_I2C_ADDR
Definition main.h:11
#define ENV_BOARD_ID
Definition main.h:14
#define ENV_ETH_SPI_DELAY_MS
Definition main.h:23
#define ENV_OTA_PORT
Definition main.h:20
#define ENV_SERVER_PORT
Definition main.h:18
#define ENV_ETH_INIT_DELAY_MS
Definition main.h:24
#define ENV_SEND_RATE_HZ
Definition main.h:4
#define ENV_SERVER_IP_OCTET_4
Definition main.h:17
#define ENV_HEARTBEAT_INTERVAL_MS
Definition main.h:8
#define ENV_ETH_BEGIN_DELAY_MS
Definition main.h:25
#define ENV_LOCAL_PORT
Definition main.h:19
#define ENV_SEND_INTERVAL_MS
Definition main.h:5
#define PIN_ETH_MOSI
Definition pins.h:13
#define PIN_ETH_MISO
Definition pins.h:8
#define PIN_ETH_CS
Definition pins.h:11
#define PIN_ETH_SCLK
Definition pins.h:10
static EthernetClass Ethernet
Definition Ethernet.h:116
void delay(int ms)
The OTA listener.
void setup()
Definition main.cpp:142
void loop()
Definition main.cpp:201
byte mac[6]
Definition main.cpp:31
IPAddress subnet(255, 255, 255, 0)
EthernetUDP udp
Definition main.cpp:40
IPAddress gateway(0, 0, 0, 0)
static IPAddress static_ip(192, 168, 2, ENV_BOARD_ID)
static IPAddress server_ip(192, 168, 2, ENV_SERVER_IP_OCTET_4)
static Adafruit_BME280 bme
Definition main.cpp:16
static uint8_t pkt_buf[64]
Definition main.cpp:28
static IPAddress subnet(255, 255, 255, 0)
static IPAddress dns_ip(192, 168, 2, 1)
static IPAddress gateway(192, 168, 2, 1)
static StarOTA::Server ota_server(ENV_OTA_PORT)
int32_t temp
Definition flight_e2e.c:78
const uint8_t * get()
void printTestMessage()
Bench-test helper: prints STAR_OTA_TEST_MESSAGE on a timer as.
bool parse_server_heartbeat_packet(const uint8_t *buffer, size_t buffer_size, PacketHeader &header_out, ServerHeartbeatPacket &data_out)
Parses a Server Heartbeat packet from 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.
size_t create_environmental_data_packet(float temperature_c, uint32_t pressure_pa, float humidity_rh, uint32_t timestamp_ms, uint8_t *buffer, size_t buffer_size)
Creates a complete Environmental Data packet in the provided buffer.
PacketType
Defines the type of data contained in a packet.
Definition DiabloEnums.h:10
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474