1
0
Fork 0
CANopenNode/storage/CO_storage.h

164 lines
6.6 KiB
C

/**
* CANopen data storage base object
*
* @file CO_storage.h
* @ingroup CO_storage
* @author Janez Paternoster
* @copyright 2021 Janez Paternoster
*
* This file is part of <https://github.com/CANopenNode/CANopenNode>, a CANopen Stack.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and limitations under the License.
*/
#ifndef CO_STORAGE_H
#define CO_STORAGE_H
#include "301/CO_driver.h"
#include "301/CO_ODinterface.h"
/* default configuration, see CO_config.h */
#ifndef CO_CONFIG_STORAGE
#define CO_CONFIG_STORAGE (CO_CONFIG_STORAGE_ENABLE)
#endif
#if (((CO_CONFIG_STORAGE) & CO_CONFIG_STORAGE_ENABLE) != 0) || defined CO_DOXYGEN
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup CO_storage Data storage base
* Base module for Data storage.
*
* @ingroup CO_CANopen_storage
* @{
*
* CANopen provides OD objects 0x1010 and 0x1011 for control of storing and
* restoring data. Data source is usually a group of variables inside object
* dictionary, but it is not limited to OD.
*
* When object dictionary is generated (OD.h and OD.c files), OD variables are
* grouped into structures according to 'Storage group' parameter.
*
* Autonomous data storing must be implemented target specific, if in use.
*
* ### OD object 0x1010 - Store parameters:
* - Sub index 0: Highest sub-index supported
* - Sub index 1: Save all parameters, UNSIGNED32
* - Sub index 2: Save communication parameters, UNSIGNED32
* - Sub index 3: Save application parameters, UNSIGNED32
* - Sub index 4 - 127: Manufacturer specific, UNSIGNED32
*
* Sub-indexes 1 and above:
* - Reading provides information about its storage functionality:
* - bit 0: If set, CANopen device saves parameters on command
* - bit 1: If set, CANopen device saves parameters autonomously
* - Writing value 0x65766173 ('s','a','v','e' from LSB to MSB) stores
* corresponding data.
*
* ### OD object 0x1011 - Restore default parameters
* - Sub index 0: Highest sub-index supported
* - Sub index 1: Restore all default parameters, UNSIGNED32
* - Sub index 2: Restore communication default parameters, UNSIGNED32
* - Sub index 3: Restore application default parameters, UNSIGNED32
* - Sub index 4 - 127: Manufacturer specific, UNSIGNED32
*
* Sub-indexes 1 and above:
* - Reading provides information about its restoring capability:
* - bit 0: If set, CANopen device restores parameters
* - Writing value 0x64616F6C ('l','o','a','d' from LSB to MSB) restores
* corresponding data.
*/
/**
* Attributes (bit masks) for Data storage object.
*/
typedef enum {
/** CANopen device saves parameters on OD 1010 command */
CO_storage_cmd = 0x01,
/** CANopen device saves parameters autonomously */
CO_storage_auto = 0x02,
/** CANopen device restores parameters on OD 1011 command */
CO_storage_restore = 0x04
} CO_storage_attributes_t;
/**
* Data storage object.
*
* Object is used with CANopen OD objects at index 1010 and 1011.
*/
typedef struct {
OD_extension_t OD_1010_extension; /**< Extension for OD object */
OD_extension_t OD_1011_extension; /**< Extension for OD object */
CO_CANmodule_t *CANmodule; /**< From CO_storage_init() */
ODR_t (*store)(CO_storage_entry_t *entry,
CO_CANmodule_t *CANmodule); /**< From CO_storage_init() */
ODR_t (*restore)(CO_storage_entry_t *entry,
CO_CANmodule_t *CANmodule); /**< From CO_storage_init() */
CO_storage_entry_t *entries; /**< From CO_storage_init() */
uint8_t entriesCount; /**< From CO_storage_init() */
bool_t enabled; /**< true, if storage is enabled. Setting of this variable
is implementation specific. */
} CO_storage_t;
/**
* Initialize data storage object
*
* This function should be called by application after the program startup,
* before @ref CO_CANopenInit(). This function initializes storage object and
* OD extensions on objects 1010 and 1011. Function does not load stored data
* on startup, because loading data is target specific.
*
* @param storage This object will be initialized. It must be defined by
* application and must exist permanently.
* @param CANmodule CAN device, used for @ref CO_LOCK_OD() macro.
* @param OD_1010_StoreParameters OD entry for 0x1010 -"Store parameters".
* Entry is optional, may be NULL.
* @param OD_1011_RestoreDefaultParameters OD entry for 0x1011 -"Restore default
* parameters". Entry is optional, may be NULL.
* @param store Pointer to externally defined function, which will store data
* specified by @ref CO_storage_entry_t. Function will be called when
* OD variable 0x1010 will be written. Argument to function is entry, where
* 'entry->subIndexOD' equals accessed subIndex. Function returns value from
* @ref ODR_t : "ODR_OK" in case of success, "ODR_HW" in case of hardware error.
* @param restore Same as 'store', but for restoring default data.
* @param entries Pointer to array of storage entries. Array must be defined and
* initialized by application and must exist permanently.
* Structure @ref CO_storage_entry_t is target specific and must be defined by
* CO_driver_target.h. See CO_driver.h for required parameters.
* @param entriesCount Count of storage entries
*
* @return CO_ERROR_NO or CO_ERROR_ILLEGAL_ARGUMENT.
*/
CO_ReturnError_t CO_storage_init(CO_storage_t *storage,
CO_CANmodule_t *CANmodule,
OD_entry_t *OD_1010_StoreParameters,
OD_entry_t *OD_1011_RestoreDefaultParameters,
ODR_t (*store)(CO_storage_entry_t *entry,
CO_CANmodule_t *CANmodule),
ODR_t (*restore)(CO_storage_entry_t *entry,
CO_CANmodule_t *CANmodule),
CO_storage_entry_t *entries,
uint8_t entriesCount);
/** @} */ /* CO_storage */
#ifdef __cplusplus
}
#endif /*__cplusplus*/
#endif /* (CO_CONFIG_STORAGE) & CO_CONFIG_STORAGE_ENABLE */
#endif /* CO_STORAGE_H */