1
0
Fork 0
CANopenNode/socketCAN/CO_OD_storage.h
Janez 9d17b0d671 socketCAN driver:
- Always enable CANptr and timestamp info in CO_CANrx_t.
- Update documentation
2020-02-29 22:34:48 +01:00

171 lines
5.5 KiB
C

/**
* CANopen Object Dictionary storage object for Linux SocketCAN.
*
* @file CO_OD_storage.h
* @ingroup CO_socketCAN_OD_storage
* @author Janez Paternoster
* @copyright 2015 - 2020 Janez Paternoster
*
* This file is part of CANopenNode, an opensource CANopen Stack.
* Project home page is <https://github.com/CANopenNode/CANopenNode>.
* For more information on CANopen see <http://www.can-cia.org/>.
*
* 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_OD_STORAGE_H
#define CO_OD_STORAGE_H
#include "301/CO_driver.h"
#include "301/CO_SDOserver.h"
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup CO_socketCAN_OD_storage OD storage
* @ingroup CO_socketCAN
* @{
*
* Object Dictionary storage implementation for CANopenNode on Linux
*/
/**
* Callback for use inside @ref CO_OD_configure() function for OD object 1010
*/
CO_SDO_abortCode_t CO_ODF_1010(CO_ODF_arg_t *ODF_arg);
/**
* Callback for use inside @ref CO_OD_configure() function for OD object 1011
*/
CO_SDO_abortCode_t CO_ODF_1011(CO_ODF_arg_t *ODF_arg);
/**
* Save memory block to a file.
*
* Function renames current file to filename.old, copies contents from odAddress
* to filename, adds two bytes of CRC code. It then verifies the written file and
* in case of errors sets back the old file and returns error.
*
* Function is used with CANopen OD object at index 1010.
*
* @param odAddress Address of the memory block, which will be stored.
* @param odSize Size of the above memory block.
* @param filename Name of the file, where data will be stored.
*
* @return 0 on success, -1 on error.
*/
int CO_OD_storage_saveSecure(
uint8_t *odAddress,
uint32_t odSize,
char *filename);
/**
* Remove OD storage file.
*
* Function renames current file to filename.old, then creates empty file and
* writes two bytes "-\n" to it. When program will start next time, default values
* are used for Object Dictionary. In case of error in renaming to .old it
* keeps the original file and returns error.
*
* Writing data to file is secured with mutex CO_LOCK_OD.
*
* Function is used with CANopen OD object at index 1011.
*
* @param filename Name of the file.
*
* @return 0 on success, -1 on error.
*/
int CO_OD_storage_restoreSecure(char *filename);
/**
* Object Dictionary storage object.
*
* Object is used with CANopen OD objects at index 1010 and 1011.
*/
typedef struct {
uint8_t *odAddress; /**< From CO_OD_storage_init() */
uint32_t odSize; /**< From CO_OD_storage_init() */
char *filename; /**< From CO_OD_storage_init() */
/** If CO_OD_storage_autoSave() is used, file stays opened and fp is stored here. */
FILE *fp;
uint16_t tmr1msPrev; /**< used with CO_OD_storage_autoSave. */
uint32_t lastSavedMs; /**< used with CO_OD_storage_autoSave. */
} CO_OD_storage_t;
/**
* Initialize OD storage object and load data from file.
*
* Called after program startup. Load storage file and copy data to Object
* Dictionary variables.
*
* @param odStor This object will be initialized.
* @param odAddress Address of the memory block from Object dictionary, where data will be copied.
* @param odSize Size of the above memory block.
* @param filename Name of the file, where data are stored.
*
* @return #CO_ReturnError_t: CO_ERROR_NO, CO_ERROR_DATA_CORRUPT (Data in file corrupt),
* CO_ERROR_CRC (CRC from MBR does not match the CRC of OD_ROM block in file),
* CO_ERROR_ILLEGAL_ARGUMENT or CO_ERROR_OUT_OF_MEMORY (malloc failed).
*/
CO_ReturnError_t CO_OD_storage_init(
CO_OD_storage_t *odStor,
uint8_t *odAddress,
uint32_t odSize,
char *filename);
/**
* Automatically save memory block if differs from file.
*
* Should be called cyclically by program. It first verifies, if memory block
* differs from file and if it does, it saves it to file with two additional
* CRC bytes. File remains opened.
*
* @param odStor OD storage object.
* @param timer1ms Variable, which must increment each millisecond.
* @param delay Delay (inhibit) time between writes to disk in milliseconds (60000 for example).
*
* @return #CO_ReturnError_t: CO_ERROR_NO, CO_ERROR_DATA_CORRUPT (Data in file corrupt),
* CO_ERROR_ILLEGAL_ARGUMENT or CO_ERROR_OUT_OF_MEMORY (malloc failed).
*/
CO_ReturnError_t CO_OD_storage_autoSave(
CO_OD_storage_t *odStor,
uint16_t timer1ms,
uint16_t delay);
/**
* Closes file opened by CO_OD_storage_autoSave.
*
* @param odStor OD storage object.
*/
void CO_OD_storage_autoSaveClose(CO_OD_storage_t *odStor);
/** @} */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* CO_OD_STORAGE_H */