Skip to content
Snippets Groups Projects
Commit abd051f7 authored by BRONES Romain's avatar BRONES Romain
Browse files

feat(archiver): Evolve application

* Configure and Start DAQ with ChimeraTK accessors.
* MMAP and copy to file

TODO
* Switch buffer
* rolling file destination
* Both BPM and PSC
parent 3b402e79
No related branches found
No related tags found
No related merge requests found
...@@ -2,27 +2,48 @@ ...@@ -2,27 +2,48 @@
#include <unistd.h> #include <unistd.h>
#include <poll.h> #include <poll.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h>
#include <stdint.h> #include <stdint.h>
#include <fcntl.h> #include <fcntl.h>
#include <ChimeraTK/Device.h>
#include <errno.h>
int main(){ int main(){
int fd_ddr, fd_ddr_ro; // File descriptors for DDR4 int fd_ddr, fd_ddr_sro; // File descriptors for DDR4
int fd_dst; // File descriptor for destination int fd_dst; // File descriptor for destination
unsigned int fcnt=0; // Binary file counter unsigned int fcnt=0; // Binary file counter
int rp; int rp;
int i;
ssize_t s_wr; ssize_t s_wr;
const uint32_t unmask = 1; const uint32_t unmask = 1, mask = 0;
uint32_t info; uint32_t info;
char fname[128]; char fname[128];
char *src; char *src;
struct pollfd pfd; struct pollfd pfd;
// Initialize ChimeraTK ===================================================
ChimeraTK::setDMapFilePath("/opt/fofb/map/appuio.dmap");
ChimeraTK::Device dev("APPUIO");
dev.open();
// Declare register accessors
ChimeraTK::ScalarRegisterAccessor<uint32_t> daq_enable =
dev.getScalarRegisterAccessor<uint32_t>("APP/daq_0/ENABLE");
ChimeraTK::ScalarRegisterAccessor<uint32_t> daq_dbuf_ena =
dev.getScalarRegisterAccessor<uint32_t>("APP/daq_0/DOUBLE_BUF_ENA");
ChimeraTK::ScalarRegisterAccessor<uint32_t> daq_trigger =
dev.getScalarRegisterAccessor<uint32_t>("APP/DAQ_CONTROL");
ChimeraTK::OneDRegisterAccessor<uint32_t> daq_tabsel =
dev.getOneDRegisterAccessor<uint32_t>("APP/daq_0/TAB_SEL");
ChimeraTK::OneDRegisterAccessor<uint32_t> daq_curbuff =
dev.getOneDRegisterAccessor<uint32_t>("APP/daq_0/ACTIVE_BUF");
// Open DDR access ========================================================
// Open file descriptor for DDR4 // Open file descriptor for DDR4
fd_ddr = open("/dev/ddr4", O_RDWR); fd_ddr = open("/dev/ddr4", O_RDWR);
fd_ddr_ro = open("/dev/ddr4", O_RDONLY); fd_ddr_sro = open("/dev/ddr4", O_RDONLY | O_SYNC);
if (fd_ddr <= 0 || fd_ddr_ro <= 0) { if (fd_ddr <= 0 || fd_ddr_sro <= 0) {
fprintf(stderr, "Failed to open UIO device.\n"); fprintf(stderr, "Failed to open UIO device.\n");
return -1; return -1;
}; };
...@@ -30,11 +51,40 @@ int main(){ ...@@ -30,11 +51,40 @@ int main(){
pfd.events = POLLIN; pfd.events = POLLIN;
// Open MMAP for DDR4 // Open MMAP for DDR4
src = mmap(NULL, 0x20000000, PROT_READ, MAP_SHARED, fd_ddr_ro, 0); src = static_cast<char*>(mmap(NULL, 0x20000000, PROT_READ, MAP_SHARED, fd_ddr_sro, 0));
if (src == MAP_FAILED) {
fprintf(stderr, "Failed to MMAP the DDR: %s.\n", strerror(errno));
return -9;
};
// Initialize DAQ =========================================================
// Disable DAQ, mask IRQ
daq_enable = 0;
daq_enable.write();
s_wr = write(fd_ddr, &mask, sizeof(mask));
// Configure DAQ
daq_dbuf_ena = 3;
daq_dbuf_ena.write();
daq_tabsel[0] = 1;
daq_tabsel[1] = 1;
daq_tabsel.write();
// Enable DAQ
daq_enable = 1;
daq_enable.write();
daq_curbuff.read();
// trigger
daq_trigger = 1;
daq_trigger.write();
daq_trigger = 0;
daq_trigger.write();
// ========================================================================
// Open destination file // Open destination file
snprintf(fname, 128, "/mnt/data/archiver/file_%08d.bin", fcnt); snprintf(fname, 128, "/mnt/data/archive_files/file_%08d.bin", fcnt);
fd_dst = creat(fname, 0); fd_dst = open(fname, O_CREAT | O_WRONLY | O_APPEND , 0666);
if (fd_dst <= 0) { if (fd_dst <= 0) {
fprintf(stderr, "Failed to open destination file '%s'.\n", fname); fprintf(stderr, "Failed to open destination file '%s'.\n", fname);
return -2; return -2;
...@@ -48,7 +98,7 @@ int main(){ ...@@ -48,7 +98,7 @@ int main(){
}; };
// Wait for interrupt // Wait for interrupt
fprintf(stdout, "Waiting for interrupt..."); fprintf(stdout, "Waiting for interrupt...\n");
rp = poll(&pfd, 1, -1); // Timeout = -1, infinite wait rp = poll(&pfd, 1, -1); // Timeout = -1, infinite wait
if (rp >= 1) { if (rp >= 1) {
...@@ -64,14 +114,36 @@ int main(){ ...@@ -64,14 +114,36 @@ int main(){
//continue; //continue;
}; };
// Copy data fprintf(stdout, "Write to file '%s'.\n", fname);
s_wr = write(fd_dst, &src, 0x1000); // Copy data, whole block
/*
s_wr = write(fd_dst, &src, 0x08000000);
if (s_wr < 0x08000000) {
fprintf(stderr, "Error while writing to file '%s' (%d).\n", fname, s_wr);
return -6;
};
// */
// Copy data, page by page
//*
for (i = 0 ; i < 0x08000 ; i++) {
s_wr = write(fd_dst, &src[i*0x1000], 0x1000);
if (s_wr < 0x1000) { if (s_wr < 0x1000) {
fprintf(stderr, "Error while writing to file '%s'.\n", fname); fprintf(stderr, "Error while writing to file '%s' (%d:%d).\n", fname, i, s_wr);
} return -6;
};
};
// */
close(fd_dst); close(fd_dst);
// Disable DAQ, mask IRQ
daq_enable = 0;
daq_enable.write();
s_wr = write(fd_ddr, &mask, sizeof(mask));
fprintf(stdout, "Done !\n");
return 0; return 0;
} }
...@@ -5,14 +5,14 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda ...@@ -5,14 +5,14 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda
inherit pkgconfig inherit pkgconfig
SRC_URI = "file://archiver.c" SRC_URI = "file://archiver.cpp"
S = "${WORKDIR}" S = "${WORKDIR}"
DEPENDS = "" DEPENDS = "deviceaccess"
do_compile() { do_compile() {
${CC} -O archiver.c -o archiver ${CXX} `pkg-config ChimeraTK-DeviceAccess --cflags --libs` archiver.cpp -o archiver
} }
do_install() { do_install() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment