138 lines
4.6 KiB
C++
138 lines
4.6 KiB
C++
#include <SoftwareSerial.h>
|
|
|
|
#define RX_PIN 2
|
|
#define TX_PIN 3
|
|
|
|
SoftwareSerial zt2Serial(RX_PIN, TX_PIN); // RX, TX
|
|
|
|
const int dataLength = 17; // Total number of bytes in the frame
|
|
uint8_t buffer[dataLength * 2]; // Circular buffer for incoming data
|
|
int head = 0; // Index for writing data to the buffer
|
|
int tail = 0; // Index for reading data from the buffer
|
|
|
|
// Global variables to store specific bytes
|
|
uint8_t afr = 0;
|
|
uint8_t map_value = 0;
|
|
uint8_t user1 = 0;
|
|
uint8_t user2 = 0;
|
|
|
|
// Function to validate the data frame (basic sanity check)
|
|
bool isValidFrame(uint8_t* data) {
|
|
// Implement any specific validation rules for your frame here
|
|
// For example, ensure AFR (byte 4) and other values are within expected ranges
|
|
// Return false if the frame is invalid
|
|
if (data[3] > 255 || data[8] > 255 || data[11] > 255 || data[14] > 255) {
|
|
return false; // Example range check, adjust as necessary
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*void readZeitronix() {
|
|
// Read incoming bytes and store them in the buffer
|
|
while (zt2Serial.available()) {
|
|
buffer[head] = zt2Serial.read();
|
|
head = (head + 1) % (dataLength * 2); // Wrap around the buffer
|
|
|
|
// Check if there's a complete frame available
|
|
if ((head + (dataLength * 2) - tail) % (dataLength * 2) >= dataLength) {
|
|
// Check for the start of a new frame: 0 1 2
|
|
if (buffer[tail] == 0 && buffer[(tail + 1) % (dataLength * 2)] == 1 && buffer[(tail + 2) % (dataLength * 2)] == 2) {
|
|
// Read the frame into a temporary array
|
|
uint8_t data[dataLength];
|
|
for (int i = 0; i < dataLength; i++) {
|
|
data[i] = buffer[(tail + i) % (dataLength * 2)];
|
|
}
|
|
|
|
// Move the tail to the end of the processed frame
|
|
tail = (tail + dataLength) % (dataLength * 2);
|
|
|
|
// Validate the frame
|
|
if (isValidFrame(data)) {
|
|
// Store the specific bytes in global variables
|
|
afr = data[3]; // byte 4 (AFR)
|
|
map_value = data[8]; // byte 9 (MAP)
|
|
user1 = data[11]; // byte 12 (USER1)
|
|
user2 = data[14]; // byte 15 (USER2)
|
|
}
|
|
} else {
|
|
// If the start of the frame is not found, discard the first byte and move the tail
|
|
tail = (tail + 1) % (dataLength * 2);
|
|
}
|
|
}
|
|
}
|
|
} */
|
|
void readZeitronix() {
|
|
// Read incoming bytes and store them in the buffer
|
|
while (zt2Serial.available()) {
|
|
buffer[head] = zt2Serial.read();
|
|
head = (head + 1) % (dataLength * 2); // Wrap around the buffer
|
|
|
|
// Check if there's a complete frame available
|
|
if ((head + (dataLength * 2) - tail) % (dataLength * 2) >= dataLength) {
|
|
// Check for the start of a new frame: 0 1 2
|
|
if (buffer[tail] == 0 && buffer[(tail + 1) % (dataLength * 2)] == 1 && buffer[(tail + 2) % (dataLength * 2)] == 2) {
|
|
// Read the frame into a temporary array
|
|
uint8_t data[dataLength];
|
|
for (int i = 0; i < dataLength; i++) {
|
|
data[i] = buffer[(tail + i) % (dataLength * 2)];
|
|
}
|
|
|
|
// Move the tail to the end of the processed frame
|
|
tail = (tail + dataLength) % (dataLength * 2);
|
|
|
|
// Validate the frame
|
|
if (isValidFrame(data)) {
|
|
// Print the entire frame for debugging
|
|
Serial.print("Frame: ");
|
|
for (int i = 0; i < dataLength; i++) {
|
|
Serial.print(data[i]);
|
|
Serial.print(" ");
|
|
}
|
|
Serial.println();
|
|
|
|
// Store the specific bytes in global variables
|
|
afr = data[3]; // byte 4 (AFR)
|
|
map_value = data[8]; // byte 9 (MAP)
|
|
user1 = data[11]; // byte 12 (USER1)
|
|
user2 = data[14]; // byte 15 (USER2)
|
|
}
|
|
} else {
|
|
// If the start of the frame is not found, discard the first byte and move the tail
|
|
tail = (tail + 1) % (dataLength * 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
zt2Serial.begin(9600);
|
|
}
|
|
|
|
void loop() {
|
|
readZeitronix();
|
|
|
|
// Use the global variables to update the TFT display or for other purposes
|
|
Serial.print("AFR: ");
|
|
Serial.print(afr); // AFR value
|
|
Serial.print(" MAP: ");
|
|
Serial.print(map_value); // MAP value
|
|
Serial.print(" USER1: ");
|
|
Serial.print(user1); // USER1 value
|
|
Serial.print(" USER2: ");
|
|
Serial.println(user2); // USER2 value
|
|
|
|
// Update the TFT display here using the values of afr, map_value, user1, user2
|
|
// Example:
|
|
// tft.setCursor(0, 0);
|
|
// tft.print("AFR: " + String(afr));
|
|
// tft.setCursor(0, 10);
|
|
// tft.print("MAP: " + String(map_value));
|
|
// tft.setCursor(0, 20);
|
|
// tft.print("USER1: " + String(user1));
|
|
// tft.setCursor(0, 30);
|
|
// tft.print("USER2: " + String(user2));
|
|
|
|
delay(100); // Adjust delay as needed for the desired refresh rate
|
|
}
|