mirror of
https://github.com/radio95-rnt/rds95.git
synced 2026-02-27 04:43:52 +01:00
atomic save
This commit is contained in:
@@ -14,7 +14,7 @@ data = "" -- Set during run_lua calls
|
|||||||
---@return nil
|
---@return nil
|
||||||
function set_rds_program_defaults() end
|
function set_rds_program_defaults() end
|
||||||
|
|
||||||
---Saves, loads and resets the state of the data
|
---Saves, loads and resets the state of the data, you might as well restart the whole program
|
||||||
---@return nil
|
---@return nil
|
||||||
function reset_rds() end
|
function reset_rds() end
|
||||||
|
|
||||||
|
|||||||
15
src/fs.c
15
src/fs.c
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
void encoder_saveToFile(RDSEncoder *enc) {
|
void encoder_saveToFile(RDSEncoder *enc) {
|
||||||
char encoderPath[128];
|
char encoderPath[128];
|
||||||
|
char encoderPath_tmp[128];
|
||||||
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME"));
|
||||||
|
snprintf(encoderPath_tmp, sizeof(encoderPath_tmp), "%s/.rdsEncoder.tmp", getenv("HOME"));
|
||||||
|
|
||||||
RDSEncoder tempEncoder;
|
RDSEncoder tempEncoder;
|
||||||
FILE *file = fopen(encoderPath, "rb");
|
FILE *file = fopen(encoderPath, "rb");
|
||||||
@@ -17,19 +19,20 @@ void encoder_saveToFile(RDSEncoder *enc) {
|
|||||||
tempEncoder.program = enc->program;
|
tempEncoder.program = enc->program;
|
||||||
|
|
||||||
RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program};
|
RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program};
|
||||||
memcpy(&rdsEncoderfile.data[enc->program], &tempEncoder.data[enc->program], sizeof(RDSData));
|
memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS);
|
||||||
memcpy(&rdsEncoderfile.rtpData[enc->program], &tempEncoder.rtpData[enc->program], sizeof(RDSRTPlusData) * 2);
|
memcpy(&rdsEncoderfile.rtpData, &tempEncoder.rtpData, sizeof(RDSRTPlusData) * 2 * PROGRAMS);
|
||||||
memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData));
|
memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData));
|
||||||
|
|
||||||
rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc));
|
||||||
|
|
||||||
file = fopen(encoderPath, "wb");
|
file = fopen(encoderPath_tmp, "wb");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
perror("Error opening file");
|
perror("Error opening file");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fwrite(&rdsEncoderfile, sizeof(RDSEncoderFile), 1, file);
|
fwrite(&rdsEncoderfile, sizeof(RDSEncoderFile), 1, file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
rename(encoderPath_tmp, encoderPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
int encoder_loadFromFile(RDSEncoder *enc) {
|
int encoder_loadFromFile(RDSEncoder *enc) {
|
||||||
@@ -55,10 +58,8 @@ int encoder_loadFromFile(RDSEncoder *enc) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < PROGRAMS; i++) {
|
memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS);
|
||||||
memcpy(&(enc->data[i]), &(rdsEncoderfile.data[i]), sizeof(RDSData));
|
memcpy(&(enc->rtpData), &(rdsEncoderfile.rtpData), sizeof(RDSRTPlusData)*2*PROGRAMS);
|
||||||
memcpy(&(enc->rtpData[i]), &(rdsEncoderfile.rtpData[i]), sizeof(RDSRTPlusData)*2);
|
|
||||||
}
|
|
||||||
memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData));
|
memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData));
|
||||||
enc->program = rdsEncoderfile.program;
|
enc->program = rdsEncoderfile.program;
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user