Larus glider flight sensor system 3.9.2024
Software-In-The-Loop test and validation system
Loading...
Searching...
No Matches
persistent_data.cpp
Go to the documentation of this file.
1/***********************************************************************/
26#include "embedded_memory.h"
27#include "embedded_math.h"
28#include "persistent_data.h"
29#include "string.h"
30
32 {
33 {SENS_TILT_ROLL,"SensTilt_Roll", true, 0.0f, 0},
34 {SENS_TILT_PITCH,"SensTilt_Pitch", true, 0.0f, 0},
35 {SENS_TILT_YAW, "SensTilt_Yaw", true, 0.0f, 0},
36
37 {PITOT_OFFSET, "Pitot_Offset", false, 0.0f, 0},
38 {PITOT_SPAN, "Pitot_Span", false, 1.0f, 0},
39 {QNH_OFFSET, "QNH-delta", false, 0.0f, 0},
40
41 {MAG_X_OFF, "Mag_X_Off", false, 0.0f, 0},
42 {MAG_X_SCALE, "Mag_X_Scale", false, 1.0f, 0},
43 {MAG_Y_OFF, "Mag_Y_Off", false, 0.0f, 0},
44 {MAG_Y_SCALE, "Mag_Y_Scale", false, 1.0f, 0},
45 {MAG_Z_OFF, "Mag_Z_Off", false, 0.0f, 0},
46 {MAG_Z_SCALE, "Mag_Z_Scale", false, 1.0f, 0},
47 {MAG_STD_DEVIATION, "Mag_Calib_Err", false, 1e-2f, 0},
48 {MAG_AUTO_CALIB, "Mag_Auto_Calib", false, 1.0f, 0},
49
50 {VARIO_TC, "Vario_TC", false, 2.0f, 0},
51 {VARIO_INT_TC, "Vario_Int_TC", false, 30.0f, 0},
52 {WIND_TC, "Wind_TC", false, 5.0f, 0},
53 {MEAN_WIND_TC, "Mean_Wind_TC", false, 30.0f, 0},
54 {HORIZON, "Horizon_active", false, 1.0f, 0},
55
56 {GNSS_CONFIGURATION, "GNSS_CONFIG", false, 1.0f, 0},
57 {ANT_BASELENGTH, "ANT_BASELEN", false, 1.0f, 0},
58 {ANT_SLAVE_DOWN, "ANT_SLAVE_DOWN", false, 0.0f, 0},
59 {ANT_SLAVE_RIGHT,"ANT_SLAVE_RIGHT", false, 0.0f, 0},
60 };
61
63
65{
66 bool EEPROM_has_been_unlocked = false;
67 float dummy;
70 {
71 if( true == read_EEPROM_value( parameter->id, dummy)) // parameter missing
72 {
73 if( EEPROM_has_been_unlocked == false)
74 {
75 lock_EEPROM( false);
77 }
78 (void) write_EEPROM_value( parameter->id, parameter->default_value);
79 }
80 ++parameter;
81 }
83 lock_EEPROM( true);
84}
85
87{
89 if( 0 == strncmp( parameter->mnemonic, name, strlen( parameter->mnemonic)))
90 return parameter;
91 return 0;
92}
93
101
102#if UNIX != 1
103
104#include "eeprom.h"
105#include "my_assert.h"
106
107#define READ true
108#define WRITE false
109
111{
112 switch(id)
113 {
114 case BOARD_ID:
116 case MAG_AUTO_CALIB:
117 case HORIZON:
118 if( read)
119 value = (float)(EEPROM_value.u16);
120 else
121 EEPROM_value.u16 = (uint16_t)round(value);
122 break;
123 case QNH_OFFSET:
124 case PITOT_OFFSET:
125 if( read)
126 value = ( float)(EEPROM_value.i16);
127 else
128 EEPROM_value.i16 = (int16_t)value;
129 break;
130 case PITOT_SPAN:
131 case MAG_X_SCALE:
132 case MAG_Y_SCALE:
133 case MAG_Z_SCALE:
134 if( read)
135 value = ( (float)(EEPROM_value.i16) / 32768.0f) + 1.0f;
136 else
137 {
138 int ivalue = (int)((value - 1.0f) * 32768.0f);
139 if( ivalue > 32767)
140 ivalue = 32767;
141 if( ivalue < -32768)
142 ivalue = -32768;
144 }
145 break;
147 if( read)
148 value = (float)(EEPROM_value.u16) / 65536.0f * 1e-2f;
149 else
150 {
151 if( value >= 0.009999f || value < 0.0f)
152 EEPROM_value.u16 = 0xffff;
153 else
154 EEPROM_value.u16 = (uint16_t)(value * 1e2f * 65536.0f);
155 }
156 break;
157 case MAG_X_OFF:
158 case MAG_Y_OFF:
159 case MAG_Z_OFF:
160 if( read)
161 value = ( (float)(EEPROM_value.i16) / 3276.8f);
162 else
163 EEPROM_value.i16 = (int16_t)(value * 3276.8f);
164 break;
165 case ANT_BASELENGTH: // max +/- 32.768 m
166 case ANT_SLAVE_DOWN:
167 case ANT_SLAVE_RIGHT:
168 if( read)
169 value = (float)(EEPROM_value.i16) * 0.001f;
170 else
171 EEPROM_value.i16 = (int16_t)(value * 1000.0f);
172 break;
173 break;
174 case SENS_TILT_ROLL:
175 case SENS_TILT_PITCH:
176 case SENS_TILT_YAW:
177 if( read)
178 value = (float)(EEPROM_value.i16) / 32768.0f * M_PI_F;
179 else
180 {
181 if( value < -M_PI_F)
182 value += 2.0f * M_PI_F;
183 if( value >= M_PI_F)
184 value -= 2 * M_PI_F;
185 int ivalue = (int) round(value * 32768.0f / M_PI_F);
186 if( ivalue >= 32768)
187 ivalue = 32767;
189 }
190 break;
191 case VARIO_TC:
192 case VARIO_INT_TC:
193 case WIND_TC:
194 case MEAN_WIND_TC:
195 if( read)
196 value = (float)(EEPROM_value.u16) / 655.36f;
197 else
198 EEPROM_value.u16 = (uint16_t)(value * 655.36f);
199 break;
201 default:
202 value = 0.0f; // just to be sure ...
203 return true; // error
204 break;
205 }
206 return false; // OK
207}
208
210{
211 if( lockit)
212 return HAL_FLASH_Lock();
213
215 return (EE_Init());
216}
217
219{
221 if( EEPROM_convert( id, EEPROM_value, value , WRITE))
222 return true; // error
223
225 if( (HAL_OK != EE_ReadVariable( id, &read_value.u16))
226 ||
227 (read_value.u16 != EEPROM_value.u16) )
228 return EE_WriteVariable( id, EEPROM_value.u16);
229 return HAL_OK;
230}
231
233{
234 uint16_t data;
235 if( HAL_OK != EE_ReadVariable( id, (uint16_t*)&data))
236 return true;
237 return ( EEPROM_convert( id, (EEPROM_data_t &)data, value , READ));
238}
239
241{
242 float value;
243 bool result = read_EEPROM_value( id, value);
244 ASSERT( result == false);
245 return value;
246}
247
249{
250 unsigned status;
251
253 ASSERT(status == HAL_OK);
254
255 status = EE_Init();
256 ASSERT(status == HAL_OK);
257
258 return HAL_OK;
259}
260
261#endif
mathematical vector of arbitrary type and size
Definition vector.h:40
defines platform-dependent algorithms and constants
#define M_PI_F
settings to allow compiling embedded software on a PC target
#define ROM
void ensure_EEPROM_parameter_integrity(void)
float configuration(EEPROM_PARAMETER_ID id)
bool write_EEPROM_value(EEPROM_PARAMETER_ID id, float value)
bool lock_EEPROM(bool lockit)
ROM persistent_data_t PERSISTENT_DATA[]
bool read_EEPROM_value(EEPROM_PARAMETER_ID id, float &value)
#define WRITE
bool EEPROM_initialize(void)
bool EEPROM_convert(EEPROM_PARAMETER_ID id, EEPROM_data_t &EEPROM_value, float &value, bool read)
const persistent_data_t * find_parameter_from_ID(EEPROM_PARAMETER_ID id)
const persistent_data_t * find_parameter_from_name(char *name)
#define READ
ROM unsigned PERSISTENT_DATA_ENTRIES
definitions for persistent data in EEPROM or config. file
collection of system tuning parameters