109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
|
|
/**
|
||
|
|
* registry.c — In-memory slot registry + JSON persistence.
|
||
|
|
*/
|
||
|
|
#include "registry.h"
|
||
|
|
#include "slot.h"
|
||
|
|
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <string.h>
|
||
|
|
#include <time.h>
|
||
|
|
|
||
|
|
fc_registry_entry_t g_registry[FC_MAX_SLOTS];
|
||
|
|
int g_registry_count = 0;
|
||
|
|
|
||
|
|
static const char *REGISTRY_JSON = "/dev/shm/framecache/registry.json";
|
||
|
|
|
||
|
|
void registry_add(struct fc_slot *slot)
|
||
|
|
{
|
||
|
|
for (int i = 0; i < FC_MAX_SLOTS; i++) {
|
||
|
|
if (!g_registry[i].active) {
|
||
|
|
g_registry[i].active = 1;
|
||
|
|
g_registry[i].slot = slot;
|
||
|
|
strncpy(g_registry[i].slot_id, fc_slot_id(slot),
|
||
|
|
FC_MAX_SLOT_ID - 1);
|
||
|
|
g_registry_count++;
|
||
|
|
registry_write_json();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
fprintf(stderr, "[framecache] registry full (%d slots)\n", FC_MAX_SLOTS);
|
||
|
|
}
|
||
|
|
|
||
|
|
void registry_remove(const char *slot_id)
|
||
|
|
{
|
||
|
|
for (int i = 0; i < FC_MAX_SLOTS; i++) {
|
||
|
|
if (g_registry[i].active &&
|
||
|
|
strncmp(g_registry[i].slot_id, slot_id, FC_MAX_SLOT_ID) == 0)
|
||
|
|
{
|
||
|
|
g_registry[i].active = 0;
|
||
|
|
g_registry[i].slot = NULL;
|
||
|
|
g_registry[i].slot_id[0] = '\0';
|
||
|
|
g_registry_count--;
|
||
|
|
registry_write_json();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
struct fc_slot *registry_find(const char *slot_id)
|
||
|
|
{
|
||
|
|
for (int i = 0; i < FC_MAX_SLOTS; i++) {
|
||
|
|
if (g_registry[i].active &&
|
||
|
|
strncmp(g_registry[i].slot_id, slot_id, FC_MAX_SLOT_ID) == 0)
|
||
|
|
{
|
||
|
|
return g_registry[i].slot;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
void registry_write_json(void)
|
||
|
|
{
|
||
|
|
FILE *f = fopen(REGISTRY_JSON, "w");
|
||
|
|
if (!f) return;
|
||
|
|
|
||
|
|
fprintf(f, "{\n \"version\": 1,\n \"slots\": {\n");
|
||
|
|
|
||
|
|
int first = 1;
|
||
|
|
for (int i = 0; i < FC_MAX_SLOTS; i++) {
|
||
|
|
if (!g_registry[i].active) continue;
|
||
|
|
fc_header_t *hdr = fc_slot_header(g_registry[i].slot);
|
||
|
|
|
||
|
|
char ts[32];
|
||
|
|
time_t now = time(NULL);
|
||
|
|
struct tm *t = gmtime(&now);
|
||
|
|
strftime(ts, sizeof ts, "%Y-%m-%dT%H:%M:%SZ", t);
|
||
|
|
|
||
|
|
if (!first) fprintf(f, ",\n");
|
||
|
|
first = 0;
|
||
|
|
|
||
|
|
fprintf(f,
|
||
|
|
" \"%s\": {\n"
|
||
|
|
" \"shm_path\": \"%s\",\n"
|
||
|
|
" \"sem_name\": \"%s\",\n"
|
||
|
|
" \"width\": %u,\n"
|
||
|
|
" \"height\": %u,\n"
|
||
|
|
" \"fps_num\": %u,\n"
|
||
|
|
" \"fps_den\": %u,\n"
|
||
|
|
" \"pixel_format\": \"UYVY422\",\n"
|
||
|
|
" \"source_type\": \"%s\",\n"
|
||
|
|
" \"frame_size\": %u,\n"
|
||
|
|
" \"ring_depth\": %u,\n"
|
||
|
|
" \"created_at\": \"%s\"\n"
|
||
|
|
" }",
|
||
|
|
g_registry[i].slot_id,
|
||
|
|
fc_slot_shm_path(g_registry[i].slot),
|
||
|
|
fc_slot_sem_name(g_registry[i].slot),
|
||
|
|
hdr->width, hdr->height,
|
||
|
|
hdr->fps_num, hdr->fps_den,
|
||
|
|
hdr->source_type,
|
||
|
|
hdr->frame_size,
|
||
|
|
hdr->ring_depth,
|
||
|
|
ts
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
fprintf(f, "\n }\n}\n");
|
||
|
|
fclose(f);
|
||
|
|
}
|