STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include <Ethernet.h>
2#include <EthernetUdp.h>
3#include <SPI.h>
4#include <daq-protocol.h>
5
6#include <cstring>
7
8#define ETH_CLK_PIN 39
9#define ETH_MISO_PIN 41
10#define ETH_MOSI_PIN 40
11#define ETH_CS_PIN 38
12
13IPAddress staticIP(192, 168, 2, 100);
14IPAddress gateway(192, 168, 2, 1);
15IPAddress subnet(255, 255, 255, 0);
16IPAddress dns(192, 168, 2, 1);
17IPAddress receiverIP(192, 168, 2, 20);
18const int receiverPort = 5006;
19EthernetUDP udp;
20
21byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
22
23// ============================================================================
24// INITIALIZATION
25// ============================================================================
26
27void setup() {
28 Serial.begin(115200);
29 Serial.println("Ethernet Test Send Packet Suite");
30 Serial.println("================================");
31
32 // Start SPI with custom pins
34 delay(1000);
35
36 // Initialize Ethernet with CS pin
37 Ethernet.init(ETH_CS_PIN);
38 delay(1000);
39
40 // Start Ethernet with static IP
42 delay(1000);
43
44 // Start UDP
45 udp.begin(5005);
46
47 // Print board information at initialization
48 Serial.println("\nInitial Board Configuration:");
50 Serial.println("\nEntering CLI mode...\n");
51 printMenu();
52}
53
54// ============================================================================
55// BOARD INFORMATION
56// ============================================================================
57
58/**
59 * @brief Prints all board networking information to Serial
60 */
62 Serial.println("--- Board Network Information ---");
63
64 // IP Configuration
65 Serial.print("Static IP: ");
66 Serial.println(Ethernet.localIP());
67 Serial.print("Gateway: ");
68 Serial.println(gateway);
69 Serial.print("Subnet Mask: ");
70 Serial.println(subnet);
71 Serial.print("DNS Server: ");
72 Serial.println(dns);
73
74 // MAC Address
75 Serial.print("MAC Address: ");
76 for (int i = 0; i < 6; i++) {
77 if (i > 0)
78 Serial.print(":");
79 if (mac[i] < 0x10)
80 Serial.print("0");
81 Serial.print(mac[i], HEX);
82 }
83 Serial.println();
84
85 // UDP Configuration
86 Serial.print("UDP Local Port: ");
87 Serial.println(5005);
88 Serial.print("UDP Receiver IP: ");
89 Serial.print(receiverIP);
90 Serial.print(":");
91 Serial.println(receiverPort);
92
93 // Ethernet Link Status
94 Serial.print("Ethernet Link Status: ");
95 if (Ethernet.linkStatus() == LinkON) {
96 Serial.println("Connected");
97 } else if (Ethernet.linkStatus() == LinkOFF) {
98 Serial.println("Disconnected");
99 } else {
100 Serial.println("Unknown");
101 }
102
103 Serial.println("--------------------------------");
104}
105
106// ============================================================================
107// PACKET SENDING FUNCTIONS
108// ============================================================================
109
110/**
111 * @brief Sends an example message in the old format (string-based)
112 * This is the original implementation for testing basic UDP communication
113 */
115 String sensorValue = "Example data: " + String(random(0, 100));
116 unsigned long timestamp = millis();
117 String dataToSend =
118 sensorValue + ", Timestamp: " + String(timestamp) + "\n";
119
120 // Convert to C-string
121 int dataLength = dataToSend.length();
122 char dataBuffer[dataLength + 1];
123 dataToSend.toCharArray(dataBuffer, dataLength + 1);
124
125 // Send UDP packet
126 udp.beginPacket(receiverIP, receiverPort);
127 udp.write(dataBuffer, dataLength);
128 udp.endPacket();
129
130 Serial.print("Sent (UDP) with length " + String(dataLength) + ": ");
131 Serial.print(dataToSend);
132}
133
134/**
135 * @brief Creates and sends a Board Heartbeat packet using DiabloComms library
136 * This uses the proper packet encoding format defined in the DAQv2-Comms
137 * library
138 * @return true if packet was sent successfully, false otherwise
139 */
141 // Prepare heartbeat packet data
142 daq::BoardHeartbeatPacket heartbeatData;
143 memset(heartbeatData.firmware_hash, 0, sizeof(heartbeatData.firmware_hash));
144 heartbeatData.board_id = 1; // Change as needed
145 heartbeatData.engine_state = daq::EngineState::SAFE; // Change as needed
146 heartbeatData.board_state = daq::BoardState::ACTIVE; // Change as needed
147
148 // Create the encoded packet
150 size_t packetSize = daq::create_board_heartbeat_packet(
151 heartbeatData, millis(), packetBuffer, sizeof(packetBuffer));
152
153 if (packetSize == 0) {
154 Serial.println("Error: Failed to create heartbeat packet");
155 return false;
156 }
157
158 // Send UDP packet
159 udp.beginPacket(receiverIP, receiverPort);
160 udp.write(packetBuffer, packetSize);
161 udp.endPacket();
162
163 Serial.print("Sent heartbeat packet (UDP) with length ");
164 Serial.print(packetSize);
165 Serial.print(" bytes - Board ID: ");
166 Serial.print(heartbeatData.board_id);
167 Serial.print(", Engine State: ");
168 Serial.print(static_cast<int>(heartbeatData.engine_state));
169 Serial.print(", Board State: ");
170 Serial.println(static_cast<int>(heartbeatData.board_state));
171
172 return true;
173}
174
175/**
176 * @brief Continuously sends heartbeat packets until user cancels
177 * Checks for Serial input to allow cancellation
178 */
180 Serial.println("\nStarting heartbeat packet loop...");
181 Serial.println("Send 'q' or 'quit' to stop sending heartbeats\n");
182
183 unsigned long lastSendTime = 0;
184 const unsigned long heartbeatInterval =
185 1000; // 1 second between heartbeats
186
187 while (true) {
188 // Check for user input to quit
189 if (Serial.available() > 0) {
190 String input = Serial.readStringUntil('\n');
191 input.trim();
192 input.toLowerCase();
193
194 if (input == "q" || input == "quit") {
195 Serial.println(
196 "\nStopping heartbeat loop. Returning to CLI...\n");
197 return;
198 }
199 }
200
201 // Send heartbeat at specified interval
202 unsigned long currentTime = millis();
203 if (currentTime - lastSendTime >= heartbeatInterval) {
205 lastSendTime = currentTime;
206 }
207
208 delay(10); // Small delay to prevent overwhelming the serial buffer
209 }
210}
211
212// ============================================================================
213// CLI INTERFACE
214// ============================================================================
215
216/**
217 * @brief Prints the CLI menu options
218 */
219void printMenu() {
220 Serial.println("=== Ethernet Test Suite CLI ===");
221 Serial.println("Commands:");
222 Serial.println(" 'i' or 'info' - Print board information");
223 Serial.println(" 'h' or 'heartbeat' - Start sending heartbeat packets");
224 Serial.println(" 'm' or 'menu' - Show this menu");
225 Serial.println("================================\n");
226}
227
228/**
229 * @brief Processes CLI commands from Serial input
230 */
232 if (Serial.available() > 0) {
233 String input = Serial.readStringUntil('\n');
234 input.trim();
235 input.toLowerCase();
236
237 if (input.length() == 0) {
238 return; // Empty input, ignore
239 }
240
241 if (input == "i" || input == "info") {
242 Serial.println();
244 Serial.println();
245 } else if (input == "h" || input == "heartbeat") {
247 printMenu();
248 } else if (input == "m" || input == "menu") {
249 printMenu();
250 } else {
251 Serial.print("Unknown command: '");
252 Serial.print(input);
253 Serial.println("'. Type 'm' or 'menu' for available commands.");
254 }
255 }
256}
257
258void loop() {
259 // Process CLI commands
260 processCLI();
261
262 // Small delay to prevent overwhelming the system
263 delay(50);
264}
static SerialStub Serial
Definition Arduino.h:128
unsigned long millis()
Definition Arduino.h:29
#define HEX
Definition Arduino.h:24
static EthernetClass Ethernet
Definition Ethernet.h:116
#define MAX_PACKET_SIZE
Definition main.h:6
void delay(int ms)
const int receiverPort
Definition main.cpp:26
IPAddress receiverIP(192, 168, 2, 20)
void setup()
Definition main.cpp:142
void loop()
Definition main.cpp:201
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)
static IPAddress subnet(255, 255, 255, 0)
static IPAddress gateway(192, 168, 2, 1)
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]
Definition main.cpp:15
IPAddress dns(192, 168, 2, 1)
IPAddress staticIP(192, 168, 2, 101)
#define ETH_MOSI_PIN
Definition main.cpp:10
void printBoardInfo()
Prints all board networking information to Serial.
Definition main.cpp:62
#define ETH_CS_PIN
Definition main.cpp:11
#define ETH_MISO_PIN
Definition main.cpp:9
#define ETH_CLK_PIN
Definition main.cpp:8
IPAddress receiverIP(192, 168, 2, 1)
void sendExampleMessage()
Sends an example message in the old format (string-based) This is the original implementation for tes...
Definition main.cpp:114
void processCLI()
Processes CLI commands from Serial input.
Definition main.cpp:231
void startHeartbeatLoop()
Continuously sends heartbeat packets until user cancels Checks for Serial input to allow cancellation...
Definition main.cpp:179
void printMenu()
Prints the CLI menu options.
Definition main.cpp:219
bool sendHeartbeatPacket()
Creates and sends a Board Heartbeat packet using DiabloComms library This uses the proper packet enco...
Definition main.cpp:140
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.