|
Verifying and Initializing Settings |
Top Previous Next |
Initialization is the process of making setting values "sane". To be considered sane, the setting value must have (1) correct checksum, and (2) its members must conform to the constraints of P1 and P2 parameters (see Setting Descriptor File).
Settings are not automatically initialized -- it is your responsibility as the developer to decide just when and how this happens. If you load a settings-using application onto a device that has never run this application before, then each non-volatile setting will be invalid because all setting checksums will be wrong. Volatile settings, unless kept in a battery-backed RAM, will always turn out to be invalid on boot.
Any setting can be "repaired" by writing a valid value into it. You can do this using stg_sg() or stg_set() -- see Writing and Reading Settings.
A more "automatic" way is to use stg_restore_multiple(). This will restore all settings to their default values as defined in the setting descriptor file. In the following example, settings are initialized if the MD button is kept pressed for more than 2 seconds and then released:
sub on_button_released() if button.time>4 then if stg_restore_multiple(EN_STG_INIT_MODE_NORMAL)<>EN_STG_STATUS_OK then sys.halt end if end sub
|
You can also verify the sanity of each setting in your project by calling stg_check_all(). Here is some code you can place in on_sys_init() -- it verifies all settings and performs initialization if any setting is found to be invalid. Notice how we check the code returned by stg_check_all(). EN_STG_STATUS_INVALID is a "good" error, that is, we expect it to happen. There are other errors, however, that are "fatal", for example, EN_STG_STATUS_FAILURE. We halt on those.
sub on_sys_init() dim x as en_stg_status_codes dim stg_name as string(STG_MAX_SETTING_NAME_LEN)
if stg_start()<>EN_STG_STATUS_OK then sys.halt
x=stg_check_all(stg_name) select case x case EN_STG_STATUS_OK: '--- all good ---
case EN_STG_STATUS_INVALID, EN_STG_STATUS_FAILURE: if stg_restore_multiple(EN_STG_INIT_MODE_NORMAL)<>EN_STG_STATUS_OK then sys.halt
case else: 'some other trouble sys.halt end select
comms_init() end sub
|
There is also a library procedure to restore a single member of a single setting -- stg_restore_member(). The default value for any member of any setting can be obtained by calling stg_get_def().