146 lines
5.3 KiB
C
146 lines
5.3 KiB
C
/* Reflow Oven Controller
|
|
*
|
|
* Copyright (C) 2020 Mario Hüttel <mario.huettel@gmx.net>
|
|
*
|
|
* This file is part of the Reflow Oven Controller Project.
|
|
*
|
|
* The reflow oven controller is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* The Reflow Oven Control Firmware is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with the reflow oven controller project.
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* @file config-parser.h
|
|
* @brief Header file for the key-value pair config parser
|
|
* @addtogroup config-parser
|
|
* @{
|
|
*/
|
|
|
|
#ifndef _CONFIG_PARSER_H_
|
|
#define _CONFIG_PARSER_H_
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
#include <fatfs/ff.h>
|
|
|
|
/**
|
|
* @brief Confi parser instance struct
|
|
*/
|
|
struct config_parser {
|
|
uint32_t magic; /**< @brief Magic value. Checked by each function to verify if the passed pointer is valid */
|
|
bool write; /**< @brief File opened in write / read mode */
|
|
FIL file; /**< @brief FatFS file */
|
|
char *buffer; /**< @brief Working buffer */
|
|
size_t buff_size; /** @brief Size of the working buffer config_parser::buffer */
|
|
};
|
|
|
|
/**
|
|
* @brief handle type for the config parser. Never dereference this pointer directly!
|
|
*/
|
|
typedef void * config_parser_handle_t;
|
|
|
|
/**
|
|
* @brief Differnet value types a config entry can hold
|
|
*/
|
|
enum config_parser_value_type {
|
|
CONFIG_PARSER_TYPE_UINT = 0,
|
|
CONFIG_PARSER_TYPE_INT,
|
|
CONFIG_PARSER_TYPE_FLOAT,
|
|
};
|
|
|
|
/**
|
|
* @brief Error return code of config parser functions
|
|
*/
|
|
enum config_parser_ret {
|
|
CONFIG_PARSER_OK = 0, /**< @brief Operation succeeded */
|
|
CONFIG_PARSER_PARAM_ERR, /**< @brief Function parameter error */
|
|
CONFIG_PARSER_GENERIC_ERR, /**< @brief Generic unspecified error */
|
|
CONFIG_PARSER_IOERR, /**< @brief I/O Error while file handling */
|
|
CONFIG_PARSER_LINE_COMMENT, /**< @brief The parser encountered a line starting with a comment. */
|
|
CONFIG_PARSER_LINE_TOO_LONG, /**< @brief The read line is too long for the parser to process. */
|
|
CONFIG_PARSER_LINE_MALFORM, /**< @brief Malfoirmed line. Line is neither a commenbt nor a key=value string */
|
|
CONFIG_PARSER_END_REACHED, /**< @brief The config parser has reached the end of the file */
|
|
CONFIG_PARSER_WRONG_MODE, /**< @brief Read or write requested on config parser instance that is opened in a different mode */
|
|
};
|
|
|
|
/**
|
|
* @brief Represents a configuration key-value-pair used by the config parser
|
|
*/
|
|
struct config_parser_entry {
|
|
const char *name; /**< @brief Pointer to the name of the config entry (key) */
|
|
enum config_parser_value_type type; /**< @brief Type of the value held by this struct */
|
|
union {
|
|
uint32_t uint_val;
|
|
int32_t int_val;
|
|
float float_val;
|
|
} value; /**< @brief Value of the config entry. For correct processing, config_parser_entry::type has to be taken into account */
|
|
};
|
|
|
|
/**
|
|
* @brief Open a config file
|
|
* @param config_parser Struict holding the config parser isntance. Will be filled by this function
|
|
* @param write Open the config file for writing (true) or reading (false)
|
|
* @param file_name File name to open
|
|
* @param working_buffer A working buffer used by the config parser to process the file.
|
|
* @param buff_size Size of \p working_buffer. Must be large enough to hold a full line of the config file
|
|
* @return Config parser error
|
|
*/
|
|
config_parser_handle_t config_parser_open_file(struct config_parser *config_parser, bool write, const char *file_name,
|
|
char *working_buffer, size_t buff_size);
|
|
|
|
/**
|
|
* @brief Parse the current line in the config file.
|
|
* @param handle Config parser handle
|
|
* @param[out] entry Entry read from config file.
|
|
* @warning \p entry is only valid as long as no other function was called on the same \p handle. If necessary, the values
|
|
* have to be copied
|
|
* @return Config parser error
|
|
*/
|
|
enum config_parser_ret config_parser_get_line(config_parser_handle_t handle, struct config_parser_entry *entry, bool force_float);
|
|
/**
|
|
* @brief Reset the config parser instance to the beginning of the config file
|
|
* @param handle Config parser
|
|
* @return Config parser error
|
|
*/
|
|
enum config_parser_ret config_parser_reset_to_start(config_parser_handle_t handle);
|
|
|
|
/**
|
|
* @brief Write a config entry to a config file
|
|
* @param handle Handle to the config parser. This must be opened in write mode.
|
|
* @param entry
|
|
* @return Config parser error
|
|
* @warning This function is currently not implemented and will return with a success!
|
|
*/
|
|
enum config_parser_ret config_parser_write_entry(config_parser_handle_t handle, const struct config_parser_entry *entry);
|
|
|
|
/**
|
|
* @brief Close a config parser handle
|
|
* @param handle Config parser
|
|
* @return Config parser error
|
|
*/
|
|
enum config_parser_ret config_parser_close_file(config_parser_handle_t handle);
|
|
|
|
/**
|
|
* @brief Check if the \p return_val is a abort condition to stop parsing a file.
|
|
*
|
|
* This function will return true if a disk error occured or the end of file is reached.
|
|
*
|
|
* @param return_val
|
|
* @return
|
|
*/
|
|
bool config_parser_ret_is_abort_condition(enum config_parser_ret return_val);
|
|
|
|
#endif /* _CONFIG_PARSER_H_ */
|
|
|
|
/** @} */
|