RocketLogger  2.0.2
calibration.c
Go to the documentation of this file.
1 
32 #include <stdio.h>
33 #include <string.h>
34 
35 #include <unistd.h>
36 
37 #include "log.h"
38 #include "rl.h"
39 
40 #include "calibration.h"
41 
44 
46  for (int i = 0; i < RL_CHANNEL_COUNT; i++) {
47  rl_calibration.offsets[i] = 0;
48  }
49 }
50 
52  for (int i = 0; i < RL_CHANNEL_COUNT; i++) {
53  rl_calibration.scales[i] = 1;
54  }
55 }
56 
57 int calibration_load(void) {
58  int ret;
59  char const *calibration_file_name = NULL;
60 
61  // check if user/system calibration file existing
62  ret = access(RL_CALIBRATION_USER_FILE, R_OK);
63  if (ret == 0) {
64  calibration_file_name = RL_CALIBRATION_USER_FILE;
65  } else {
66  ret = access(RL_CALIBRATION_SYSTEM_FILE, R_OK);
67  if (ret == 0) {
68  calibration_file_name = RL_CALIBRATION_SYSTEM_FILE;
69  } else {
70  // no calibration file available
74  rl_status.calibration_file[0] = 0; // empty string
75  return ERROR;
76  }
77  }
78 
79  FILE *file = fopen(calibration_file_name, "r");
80  if (file == NULL) {
81  // no calibration file available
85  return ERROR;
86  }
87 
88  // read calibration
89  rl_calibration_file_t calibration_file;
90  fread(&calibration_file, sizeof(rl_calibration_file_t), 1, file);
91 
92  // check data
93  if (calibration_file.file_magic != RL_CALIBRATION_FILE_MAGIC) {
94  rl_log(RL_LOG_ERROR, "invalid calibration file magic %x",
95  calibration_file.file_magic);
96  return ERROR;
97  }
98  if (calibration_file.file_version != RL_CALIBRATION_FILE_VERSION) {
99  rl_log(RL_LOG_ERROR, "unsupported calibration file version %d",
100  calibration_file.file_version);
101  return ERROR;
102  }
103  if (calibration_file.header_length != RL_CALIBRATION_FILE_HEADER_LENGTH) {
104  rl_log(RL_LOG_ERROR, "invalid calibration file header length %d",
105  calibration_file.header_length);
106  return ERROR;
107  }
108 
109  memcpy(&rl_calibration, &(calibration_file.data), sizeof(rl_calibration_t));
110 
111  // store calibration info information to status
112  rl_status.calibration_time = calibration_file.calibration_time;
113  strncpy(rl_status.calibration_file, calibration_file_name,
114  sizeof(rl_status.calibration_file) - 1);
115 
116  // close file
117  fclose(file);
118 
119  return SUCCESS;
120 }
void calibration_reset_offsets(void)
Definition: calibration.c:45
int calibration_load(void)
Definition: calibration.c:57
void calibration_reset_scales(void)
Definition: calibration.c:51
rl_calibration_t rl_calibration
Global calibration data structure.
Definition: calibration.c:43
#define RL_CALIBRATION_FILE_HEADER_LENGTH
Calibration file header length.
Definition: calibration.h:44
#define RL_CALIBRATION_FILE_VERSION
Calibration file header version.
Definition: calibration.h:42
#define RL_CALIBRATION_FILE_MAGIC
Calibration file header magic.
Definition: calibration.h:40
int rl_log(rl_log_level_t log_level, char const *const format,...)
Definition: log.c:82
@ RL_LOG_ERROR
Error.
Definition: log.h:49
#define RL_CALIBRATION_SYSTEM_FILE
Default system wide calibration file path.
Definition: rl.h:72
#define RL_CALIBRATION_USER_FILE
User folder calibration file path.
Definition: rl.h:69
#define ERROR
Function return value for errors (use errno to indicate the error)
Definition: rl.h:46
#define SUCCESS
Function return value for successful completion.
Definition: rl.h:44
#define RL_CHANNEL_COUNT
Number of RocketLogger analog channels.
Definition: rl.h:56
uint16_t file_version
File version number.
Definition: calibration.h:68
uint64_t calibration_time
Timestamp of the measurements used for calibration generation.
Definition: calibration.h:72
rl_calibration_t data
The actual calibration data.
Definition: calibration.h:74
uint32_t file_magic
File magic constant.
Definition: calibration.h:66
uint16_t header_length
Total size of the header in bytes.
Definition: calibration.h:70
double scales[RL_CHANNEL_COUNT]
Channel scales.
Definition: calibration.h:53
int offsets[RL_CHANNEL_COUNT]
Channel offsets (in bit)
Definition: calibration.h:51
Definition: rl.h:201
uint64_t calibration_time
Time stamp of last calibration run.
Definition: rl.h:211
char calibration_file[PATH_MAX]
Time stamp of last calibration run.
Definition: rl.h:213