aboutsummaryrefslogtreecommitdiff
path: root/sandbox/pure-read/read.c
diff options
context:
space:
mode:
authorLoïc Guégan <manzerbredes@mailbox.org>2025-04-01 17:56:32 +0200
committerLoïc Guégan <manzerbredes@mailbox.org>2025-04-01 17:56:32 +0200
commit2f1837a75e96612040c6db2b594adf7463173c88 (patch)
tree99f667df480606457c0786e3c314caba07f91038 /sandbox/pure-read/read.c
Cleaning repositoryHEADmaster
Diffstat (limited to 'sandbox/pure-read/read.c')
-rw-r--r--sandbox/pure-read/read.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/sandbox/pure-read/read.c b/sandbox/pure-read/read.c
new file mode 100644
index 0000000..539933d
--- /dev/null
+++ b/sandbox/pure-read/read.c
@@ -0,0 +1,88 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+
+#define BUFFER_SIZE 255
+#define IN_MEM (inmem!=0)
+
+typedef struct power_data {
+ float power; // Power value
+ long ts; // Associated timestamp
+ long nsecs; // Associated nanosecs
+} power_data;
+
+int main(int argc, char *argv[])
+{
+ if(argc != 4){
+ printf("Usage: %s <device-id> <nread> <inmem>\n\
+ \rFor <device-id>, see folder name in /sys/kernel/ina260/",argv[0]);
+ exit(1);
+ }
+
+ char *deviceid=argv[1];
+ int nread=atoi(argv[2]);
+ int inmem=atoi(argv[3]);
+
+ if(nread<=0){
+ printf("<nread> must be greater than 0\n");
+ exit(3);
+ }
+
+ // File to read
+ char path[255];
+ sprintf(path, "/sys/kernel/ina260/%s/power", deviceid);
+
+ // Open file
+ int fd;
+ char buff[BUFFER_SIZE];
+ fd = open(path, O_RDONLY);
+ if(fd<0){
+ perror(path);
+ exit(2);
+ }
+
+ // Check if its in memory reading
+ power_data *data;
+ if(IN_MEM){
+ data=malloc(sizeof(power_data)*nread);
+ if(data == NULL){
+ perror("Cannot allocate enough memory for in memory reads");
+ exit(4);
+ }
+ }
+
+ // Perform reads
+ float power=-1;
+ struct timespec power_ts;
+ clock_gettime(CLOCK_REALTIME, &power_ts);
+
+ printf("startat:%ld\n", power_ts.tv_sec);
+ for(int i=0;i<nread;i++){
+ read(fd, buff, BUFFER_SIZE);
+ // Get power measurement timestamp:
+ clock_gettime(CLOCK_REALTIME, &power_ts);
+ power=atof(buff);
+ if(IN_MEM){
+ data[i].power=power;
+ data[i].ts=power_ts.tv_sec;
+ data[i].nsecs=power_ts.tv_nsec;
+ }
+ else{
+ printf("%s %11ld %10ld> Power is %fW\n",deviceid, power_ts.tv_sec,power_ts.tv_nsec,power);
+ }
+ lseek(fd,0,SEEK_SET);
+ }
+ close(fd);
+
+ if(IN_MEM){
+ // We only print now (most I/O will happend at the end and this must be visible on the results)
+ for(int i=0;i<nread;i++){
+ printf("%s %11ld %10ld> Power is %fW\n",deviceid, data[i].ts, data[i].nsecs, data[i].power);
+ }
+ free(data);
+ }
+ printf("endat:%ld\n", time(NULL));
+ return 0;
+}