From 3b402e79330090d6414ae51151b1f893292d6ed7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Romain=20Bron=C3=A8s?= <romain.brones@synchrotron-soleil.fr>
Date: Tue, 14 Nov 2023 15:16:27 +0100
Subject: [PATCH] feat(archiver): test application archiver

---
 recipes-app/simple-test/files/archiver.c   | 77 ++++++++++++++++++++++
 recipes-app/simple-test/simple-test_0.1.bb |  8 +--
 2 files changed, 81 insertions(+), 4 deletions(-)
 create mode 100644 recipes-app/simple-test/files/archiver.c

diff --git a/recipes-app/simple-test/files/archiver.c b/recipes-app/simple-test/files/archiver.c
new file mode 100644
index 0000000..64116e3
--- /dev/null
+++ b/recipes-app/simple-test/files/archiver.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <poll.h>
+#include <sys/mman.h>
+#include <stdint.h>
+#include <fcntl.h>
+
+int main(){
+
+    int fd_ddr, fd_ddr_ro;      // File descriptors for DDR4
+    int fd_dst;                 // File descriptor for destination
+    unsigned int fcnt=0;        // Binary file counter
+    int rp;
+    ssize_t s_wr;
+    const uint32_t unmask = 1;
+    uint32_t info;
+    char fname[128];
+    char *src;
+    struct pollfd pfd;
+
+
+    // Open file descriptor for DDR4
+    fd_ddr = open("/dev/ddr4", O_RDWR);
+    fd_ddr_ro = open("/dev/ddr4", O_RDONLY);
+    if (fd_ddr <= 0 || fd_ddr_ro <= 0) {
+        fprintf(stderr, "Failed to open UIO device.\n");
+        return -1;
+    };
+    pfd.fd = fd_ddr;
+    pfd.events = POLLIN;
+
+    // Open MMAP for DDR4
+    src = mmap(NULL, 0x20000000, PROT_READ, MAP_SHARED, fd_ddr_ro, 0);
+
+    // Open destination file
+    snprintf(fname, 128, "/mnt/data/archiver/file_%08d.bin", fcnt);
+    fd_dst = creat(fname, 0);
+    if (fd_dst <= 0) {
+        fprintf(stderr, "Failed to open destination file '%s'.\n", fname);
+        return -2;
+    };
+
+    // Unmask interrupt
+    s_wr = write(fd_ddr, &unmask, sizeof(unmask));
+    if (s_wr != (ssize_t)sizeof(unmask)) {
+        fprintf(stderr, "Error when unmasking interrupt !\n");
+        return -3;
+    };
+
+    // Wait for interrupt
+    fprintf(stdout, "Waiting for interrupt...");
+    rp = poll(&pfd, 1, -1);     // Timeout = -1, infinite wait
+
+    if (rp >= 1) {
+        read(fd_ddr, &info, sizeof(info));
+        fprintf(stdout, "Read %d interrupts\n", info);
+    } else if (rp == 0) {
+        fprintf(stderr, "Wait for IRQ interrupted, timeout or signal.\n");
+        return -4;
+    } else {
+        fprintf(stderr, "Failed poll.\n");
+        return -5;
+        //fprintf(stderr, "Failed poll. Relaunch for next iteration.\n");
+        //continue;
+    };
+
+    // Copy data
+    s_wr = write(fd_dst, &src, 0x1000);
+    if (s_wr < 0x1000) {
+        fprintf(stderr, "Error while writing to file '%s'.\n", fname);
+    }
+
+    close(fd_dst);
+
+    return 0;
+
+}
diff --git a/recipes-app/simple-test/simple-test_0.1.bb b/recipes-app/simple-test/simple-test_0.1.bb
index 75b9e52..b9f7866 100644
--- a/recipes-app/simple-test/simple-test_0.1.bb
+++ b/recipes-app/simple-test/simple-test_0.1.bb
@@ -5,19 +5,19 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda
 
 inherit pkgconfig
 
-SRC_URI = "file://testread.cpp"
+SRC_URI = "file://archiver.c"
 
 S = "${WORKDIR}"
 
-DEPENDS = "deviceaccess"
+DEPENDS = ""
 
 do_compile() {
-         ${CXX} `pkg-config ChimeraTK-DeviceAccess --cflags --libs` testread.cpp -o testread
+         ${CC} -O archiver.c -o archiver
 }
 
 do_install() {
          install -d ${D}/${bindir}/
-         install -m 0755 testread ${D}/${bindir}
+         install -m 0755 archiver ${D}/${bindir}
 }
 
 INSANE_SKIP_${PN} = "ldflags"
-- 
GitLab