Skip to content
Snippets Groups Projects
Commit c247814a authored by Felix Moser's avatar Felix Moser
Browse files

addedCRC

parent 82deeeff
No related branches found
No related tags found
No related merge requests found
......@@ -12,25 +12,64 @@
static const char *CHAR_DEV = "/dev/packet_receiver";
static const char *SENDER_ID = "0x91";
// static const char *SENDER_ID = "0x91";
ssize_t read_pipe(int *fd, char *buf, size_t bufSize, const char *pipeName) {
// Alles mit 0 füllen, um es später einfach als String verarbeiten zu können.
memset(buf, 0, bufSize);
// Blocking read
ssize_t bytesRead = read(*fd, buf, bufSize - 1);
if (bytesRead > 0) {
// buf[bytesRead] = '\0'; // Schon durch memset garantiert
return bytesRead;
}
if (bytesRead == 0) {
// EOF -> Schreibseite geschlossen
printf("Pipe '%s' closed by writer. Reopening...\n", pipeName);
close(*fd);
// Neu öffnen (blockierend)
*fd = open(pipeName, O_RDONLY);
if (*fd == -1) {
perror("Reopen pipe");
}
// bytesRead = 0 bedeutet hier: wir haben keine Daten
return 0;
}
char* build_crc_checksum(const char *payload) {
uLong crc = crc32(0L, Z_NULL, 0);
crc = crc32(crc, payload, strlen(payload));
// Fehlerfall (bytesRead < 0)
perror("read pipe");
return -1;
}
char* crc_checksum = ("0x%08lX", crc);
void build_package(char *package, size_t package_size, const char *payload, int value_id) {
// Zwischenspeicher für die neue Komponente
char tmp[128];
// VALUE_ID=<id> VALUE=<payload>
snprintf(tmp, sizeof(tmp), " VALUE_ID=%d VALUE=%s", value_id, payload);
return crc_checksum;
// Hänge tmp an package
strncat(package, tmp, package_size - strlen(package) - 1);
}
char* build_package(char const *payload) {
char* crc_checksum = build_crc_checksum(payload);
void build_crc_checksum(char *package, size_t package_size) {
// CRC berechnen
uLong c = crc32(0L, Z_NULL, 0);
c = crc32(c, (const Bytef*)package, strlen(package));
char tmp[32];
// z.B. " CRC=0x1A2B3C4D"
snprintf(tmp, sizeof(tmp), " CRC=0x%08lX", (unsigned long)c);
return "SENDER=%s %s %s", SENDER_ID, payload, crc_checksum;
// ans package anhängen
strncat(package, tmp, package_size - strlen(package) - 1);
}
void send_package(const char *package, const int fdCharDev) {
char transmitBuf[256] = {0};
// Kopiere Package in transmitBuf
snprintf(transmitBuf, sizeof(transmitBuf), package);
const ssize_t written = write(fdCharDev, transmitBuf, strlen(transmitBuf));
......@@ -41,53 +80,31 @@ void send_package(const char *package, const int fdCharDev) {
}
}
char* read_pipe(int fd, char const *pipeName, char *payload) {
char buf[128] = {0};
// =========== Lesevorgang Pipe ===========
// read() kann blockieren, wenn noch keine Daten da sind,
// da wir blockierendes I/O verwenden.
// Wenn die Schreibseite offen bleibt, kommen periodisch neue Daten.
const ssize_t bytesReadOne = read(fd, buf, sizeof(buf));
if (bytesReadOne > 0) {
// Gültige Daten -> ausgeben
printf("Value: %s\n", buf);
} else if (bytesReadOne == 0) {
// EOF -> Schreibseite hat geschlossen
// -> ggf. Pipe erneut öffnen
printf("Pipe closed by writer. Reopening...\n");
close(fd);
// Neu öffnen
fd = open(pipeName, O_RDONLY);
if (fd == -1) {
perror("Reopen pipe");
}
} else {
// bytesReadOne < 0 => Fehler
if (errno == EINTR) {
// Signal unterbrochen, einfach weiter
return;
}
perror("read pipe");
}
}
// argc = Anzahl Pipes *argv[] Pipe Pfade
int main(const int argc, char *argv[]) {
int fds[argc];
const int num_pipes = argc - 1;
for (int i = 0; i < argc; i++) {
int *fds = calloc(num_pipes, sizeof(int));
if (!fds) {
perror("calloc fds");
return 1;
}
for (int i = 0; i < num_pipes; i++) {
const char *pipeName = argv[i + 1];
// mkfifo() nur ausführen, wenn die Pipes noch nicht existieren,
// bzw. Fehler ignorieren, falls schon existiert:
if (mkfifo(argv[i], 0666) < 0 && errno != EEXIST) {
if (mkfifo(pipeName, 0666) < 0 && errno != EEXIST) {
perror("mkfifo pipe");
free(fds);
return 1;
}
// Pipes blockierend öffnen
fds[i] = open(argv[i], O_RDONLY);
fds[i] = open(pipeName, O_RDONLY);
if (fds[i] == -1) {
perror("open pipeOne for reading");
perror("open pipe for reading");
free(fds);
return 1;
}
}
......@@ -96,22 +113,40 @@ int main(const int argc, char *argv[]) {
const int fdCharDev = open(CHAR_DEV, O_WRONLY);
if (fdCharDev == -1) {
perror("open /dev/packet_receiver");
for (int i = 0; i < argc; i++) {
// Aufräumen
for (int i = 0; i < num_pipes; i++) {
close(fds[i]);
}
free(fds);
return 1;
}
printf("Opened %s for writing.\n", CHAR_DEV);
// Dauerhafte Lese-Schleife
while (1) {
// =========== Lesevorgang Pipes ===========
for (int i = 0; i < argc; i++) {
read_pipe(fds[i], argv[i]);
char package[256];
snprintf(package, sizeof(package), "SENDER=0x91");
// Lese von jeder Pipe und ergänze das Package
for (int i = 0; i < num_pipes; i++) {
char pipeBuf[128];
const ssize_t ret = read_pipe(&fds[i], pipeBuf, sizeof(pipeBuf), argv[i + 1]);
if (ret > 0) {
// ret Bytes gelesen in pipeBuf -> package anhängen
build_package(package, sizeof(package), pipeBuf, i);
} else if (ret == -1) {
// Fehler beim Lesen
fprintf(stderr, "Error reading from pipe\n");
free(fds);
return 1;
}
}
// =========== Zum cdev schreiben ===========
// Jetzt an /dev/packet_receiver schicken
if (strlen(package) > 0) {
send_package(package, fdCharDev);
}
// Kurze Pause, damit CPU-Last nicht durch
// Dauerschleife hochgetrieben wird
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment