FloatImg/lib/metadata.c

154 lines
3.6 KiB
C
Raw Normal View History

/*
* metadata.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
2022-04-12 14:54:07 +02:00
#include <sys/time.h>
#include <string.h>
#include "../floatimg.h"
extern int verbosity; /* must be declared around main() */
2022-04-09 23:18:14 +02:00
/* ---------------------------------------------------------------- */
static void puts_magic_8(char *ptr, FILE *fp)
{
int foo;
fputs("magic = ", fp);
fputc('[', fp);
for (foo=0; foo<8; foo++) {
fputc(ptr[foo], fp);
}
fputc(']', fp); fputc('\n', fp);
fflush(fp);
}
/* ---------------------------------------------------------------- */
int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused)
{
2022-04-09 23:18:14 +02:00
int foo;
2022-04-12 14:54:07 +02:00
double doubletime;
2022-04-17 04:25:31 +02:00
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p '%s' 0x%08x )\n", __func__,
pmd, title, notused);
2022-04-17 04:25:31 +02:00
#endif
2022-04-09 23:18:14 +02:00
if (verbosity) {
fprintf(stderr, "sizeof(metadata) = %ld\n", \
sizeof(FimgMetaData));
puts_magic_8(pmd->magic, stderr);
}
2022-04-09 23:18:14 +02:00
/* SHOW TIMESTAMP HERE */
2022-04-12 14:54:07 +02:00
fprintf(stderr, "seconds sc. epoch = %ld\n", pmd->timestamp.tv_sec);
doubletime = (double)pmd->timestamp.tv_sec + \
(double)pmd->timestamp.tv_usec / 1e6;
fprintf(stderr, "dtime of day = %e\n", doubletime);
fprintf(stderr, "creator pid = %ld\n", pmd->cpid);
2022-04-09 23:18:14 +02:00
fprintf(stderr, "counter = %d\n", pmd->count);
fprintf(stderr, "float value = %.3f\n", pmd->fval);
fprintf(stderr, "id camera = '%s'\n", pmd->idcam);
fprintf(stderr, "origin = 0x%x\n", pmd->origin);
fputs("reserved words are:\n ", stderr);
for (foo=0; foo<8; foo++) {
2022-04-12 14:54:07 +02:00
fprintf(stderr, " 0x%08x", pmd->reserved[foo]);
2022-04-09 23:18:14 +02:00
if (3 == foo) fputs("\n ", stderr);
}
fputc('\n', stderr);
return 0;
}
/* ---------------------------------------------------------------- */
int fimg_default_metadata(FimgMetaData *pmd)
{
2022-04-12 14:54:07 +02:00
int foo;
struct timeval tvl;
2022-04-09 23:18:14 +02:00
memset(pmd, 0, sizeof(FimgMetaData));
memcpy(pmd->magic, "metadata", 8);
2022-04-12 14:54:07 +02:00
2022-04-09 23:18:14 +02:00
/* set timestamp here ? */
2022-04-12 14:54:07 +02:00
/* CHALLENGE ACCEPTED */
memset(&tvl, 0, sizeof(struct timeval));
foo = gettimeofday(&tvl, NULL);
if (foo) {
/* error on get time of day ? */
perror("omg");
}
else {
2022-04-17 04:25:31 +02:00
if (verbosity) {
fprintf(stderr, "Time of day %12ld %12ld\n", \
tvl.tv_sec, tvl.tv_usec);
}
2022-04-12 14:54:07 +02:00
memcpy(&(pmd->timestamp), &tvl, sizeof(struct timeval));
}
pmd->cpid = getpid();
pmd->count = 0;
pmd->fval = 255.0;
2022-04-03 21:38:29 +02:00
strcpy(pmd->idcam, "<unknow>");
2022-04-17 04:25:31 +02:00
pmd->origin = 0xdeadbeef;
2022-04-08 03:10:43 +02:00
2022-04-09 23:18:14 +02:00
return 0;
}
/* ---------------------------------------------------------------- */
2022-04-08 03:10:43 +02:00
int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd)
{
FILE *fp;
FimgFileHead filehead;
FimgMetaData metadata;
int foo;
2022-04-17 04:25:31 +02:00
#if DEBUG_LEVEL
2022-04-09 23:18:14 +02:00
fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, pmd);
2022-04-17 04:25:31 +02:00
#endif
2022-04-08 03:10:43 +02:00
if (NULL==(fp=fopen(fname, "r"))) {
2022-04-09 23:18:14 +02:00
perror(fname);
2022-04-08 03:10:43 +02:00
return -1;
}
foo = fread(&filehead, sizeof(FimgFileHead), 1, fp);
2022-04-09 23:18:14 +02:00
if (1 != foo) {
fprintf(stderr, "short read (%d) on %s (head)\n", foo, fname);
2022-04-08 03:10:43 +02:00
fclose(fp);
return -2;
}
if (memcmp(filehead.magic, "FIMG", 4)) {
fprintf(stderr, "'%s' is not a fimg file.\n", fname);
fclose(fp);
return -3;
}
if ('a' != filehead.magic[4]) {
2022-04-09 23:18:14 +02:00
fprintf(stderr, "file '%s' have no metadata.\n", fname);
2022-04-08 03:10:43 +02:00
fclose(fp);
return -4;
}
foo = fread(&metadata, sizeof(FimgMetaData), 1, fp);
2022-04-09 23:18:14 +02:00
if (1 != foo) {
2022-04-08 03:10:43 +02:00
fprintf(stderr, "short read on %s (metadata)\n", fname);
fclose(fp);
return -5;
}
fclose(fp); /* got all needed datas */
if (memcmp(metadata.magic, "metadata", 8)) {
fprintf(stderr, "'%s' invalid metadata\n", fname);
puts_magic_8(metadata.magic, stderr);
2022-04-08 03:10:43 +02:00
return -6;
}
memcpy(pmd, &metadata, sizeof(FimgMetaData));
return 0;
}
/* ---------------------------------------------------------------- */