0
1
mirror of https://github.com/radio95-rnt/rds95.git synced 2026-02-27 04:43:52 +01:00
Files
rds95/src/fs.c
2025-12-26 11:15:47 +01:00

136 lines
4.4 KiB
C

#include "fs.h"
void encoder_saveToFile(RDSEncoder *enc) {
char encoderPath[128];
char encoderPath_tmp[128];
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
snprintf(encoderPath_tmp, sizeof(encoderPath_tmp), "%s/.rdsEncoder.tmp", getenv("HOME"));
RDSEncoder tempEncoder;
FILE *file = fopen(encoderPath, "rb");
if (file) {
fread(&tempEncoder, sizeof(RDSEncoder), 1, file);
fclose(file);
} else memcpy(&tempEncoder, enc, sizeof(RDSEncoder));
memcpy(tempEncoder.data, enc->data, sizeof(RDSData) * PROGRAMS);
memcpy(&tempEncoder.encoder_data, &enc->encoder_data, sizeof(RDSEncoderData));
tempEncoder.program = enc->program;
RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program};
memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS);
memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData));
rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
file = fopen(encoderPath_tmp, "wb");
if (!file) {
perror("Error opening file");
return;
}
fwrite(&rdsEncoderfile, sizeof(RDSEncoderFile), 1, file);
fclose(file);
rename(encoderPath_tmp, encoderPath);
}
int encoder_loadFromFile(RDSEncoder *enc) {
char encoderPath[128];
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
RDSEncoderFile rdsEncoderfile;
FILE *file = fopen(encoderPath, "rb");
if (!file) {
perror("Error opening file");
return 1;
}
fread(&rdsEncoderfile, sizeof(rdsEncoderfile), 1, file);
fclose(file);
if (rdsEncoderfile.file_starter != 225 || rdsEncoderfile.file_ender != 95 || rdsEncoderfile.file_middle != 160) {
fprintf(stderr, "[RDSENCODER-FILE] Invalid file format\n");
return 1;
}
if (crc16_ccitt((char*)&rdsEncoderfile, offsetof(RDSEncoderFile, crc)) != rdsEncoderfile.crc) {
fprintf(stderr, "[RDSENCODER-FILE] CRC mismatch! Data may be corrupted\n");
return 1;
}
memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS);
memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData));
enc->program = rdsEncoderfile.program;
return 0;
}
void Modulator_saveToFile(RDSModulatorParameters *emp) {
char modulatorPath[128];
snprintf(modulatorPath, sizeof(modulatorPath), "%s/.rdsModulator", getenv("HOME"));
FILE *file;
RDSModulatorParameters tempMod;
RDSModulatorParametersFile tempFile;
memset(&tempFile, 0, sizeof(tempFile));
file = fopen(modulatorPath, "rb");
if (file != NULL) {
fread(&tempFile, sizeof(RDSModulatorParametersFile), 1, file);
fclose(file);
} else {
memset(&tempFile, 0, sizeof(RDSModulatorParametersFile));
tempFile.check = 160;
memcpy(&tempFile.params, emp, sizeof(RDSModulatorParameters));
tempFile.crc = crc16_ccitt((char*)&tempFile, offsetof(RDSModulatorParametersFile, crc));
}
memcpy(&tempMod, &tempFile.params, sizeof(RDSModulatorParameters));
tempMod.level = emp->level;
tempMod.rdsgen = emp->rdsgen;
memcpy(&tempFile.params, &tempMod, sizeof(RDSModulatorParameters));
tempFile.check = 160;
tempFile.crc = crc16_ccitt((char*)&tempFile, offsetof(RDSModulatorParametersFile, crc));
file = fopen(modulatorPath, "wb");
if (file == NULL) {
perror("Error opening file");
return;
}
fwrite(&tempFile, sizeof(RDSModulatorParametersFile), 1, file);
fclose(file);
}
void Modulator_loadFromFile(RDSModulatorParameters *emp) {
char modulatorPath[128];
snprintf(modulatorPath, sizeof(modulatorPath), "%s/.rdsModulator", getenv("HOME"));
FILE *file = fopen(modulatorPath, "rb");
if (file == NULL) {
perror("Error opening file");
return;
}
RDSModulatorParametersFile tempFile;
memset(&tempFile, 0, sizeof(tempFile));
fread(&tempFile, sizeof(RDSModulatorParametersFile), 1, file);
if (tempFile.check != 160) {
fprintf(stderr, "[RDSMODULATOR-FILE] Invalid file format\n");
fclose(file);
return;
}
uint16_t calculated_crc = crc16_ccitt((char*)&tempFile, offsetof(RDSModulatorParametersFile, crc));
if (calculated_crc != tempFile.crc) {
fprintf(stderr, "[RDSMODULATOR-FILE] CRC mismatch! Data may be corrupted\n");
fclose(file);
return;
}
memcpy(emp, &tempFile.params, sizeof(RDSModulatorParameters));
fclose(file);
}
int modulatorsaved() {
char encoderPath[128];
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsModulator", getenv("HOME"));
FILE *file = fopen(encoderPath, "rb");
if (file) {
fclose(file);
return 1;
}
return 0;
}