-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuidSerialCommunication.cpp
More file actions
70 lines (57 loc) · 2.33 KB
/
uidSerialCommunication.cpp
File metadata and controls
70 lines (57 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "uidSerialCommunication.h"
#include <iostream>
#include <algorithm>
#include <thread>
#include <chrono>
std::string readArduino(SerialPort& arduino) {
return arduino.readLine();
}
RFIDData parseRFIDData(const std::string& data) {
RFIDData result;
// Split the data by comma
size_t commaPos = data.find(",");
if (commaPos != std::string::npos) {
// If we found a comma, extract just the UID part
result.uid = data.substr(0, commaPos);
std::string flag = data.substr(commaPos + 1);
result.isInitialRead = (flag == "DEFAULT_OK");
} else {
// No comma means just a UID
result.uid = data;
result.isInitialRead = false;
}
std::cout << "Parsed UID: " << result.uid << std::endl;
std::cout << "isInitialRead: " << (result.isInitialRead ? "true" : "false") << std::endl;
return result;
}
RFIDData getRFIDDataFromArduino() {
try {
const std::string portName = "/dev/cu.usbmodem11401";
SerialPort arduino(portName.c_str());
if (!arduino.isConnected()) {
throw std::runtime_error("Can't connect to Arduino at " + portName);
}
std::cout << "Connected to Arduino. Waiting for RFID tag..." << std::endl;
while (true) {
std::string data = readArduino(arduino);
if (!data.empty()) {
// Clean up the data (remove whitespace)
data.erase(std::remove_if(data.begin(), data.end(), ::isspace), data.end());
// Parse and validate the data
RFIDData rfidData = parseRFIDData(data);
// Validate UID format (hex string)
if (rfidData.uid.find_first_not_of("0123456789ABCDEFabcdef") == std::string::npos) {
if (rfidData.isInitialRead) {
std::cout << "Initial read - UID: " << rfidData.uid << std::endl;
} else {
std::cout << "Existing card - UID: " << rfidData.uid << std::endl;
}
return rfidData;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
} catch (const std::exception& e) {
throw std::runtime_error("Arduino error: " + std::string(e.what()));
}
}