#ifndef LOG_H
#define LOG_H

#include "main.h"

#define FILE_BUF_MAX_LEN  			10*STRING_SIZE_HISTORY // Размер временного буфера для отправки/копирования Лог файла
#define FILE_BUF_MAX_LEN_LOG 		10*STRING_SIZE // Размер временного буфера для отправки/копирования Лог файла
#define STRING_SIZE		  			64
#define STRING_SIZE_HISTORY		  	100

extern char logFileBuf[FILE_BUF_MAX_LEN];

typedef __packed enum {
	LOG_SYSTEM_BOOT = 0x00,			// device booted
	LOG_SYSTEM_DEFCONFIG,	// default config applied
	LOG_UPDATE_SOFT,
	LOG_TURN_ON,		//
	LOG_PSW_CHANGE,		//
	LOG_SETTING_SAVE,		//
	LOG_LOGIN,		//
	LOG_TEST_UPS,		//
	LOG_SHUTDOWN_UPS,
	LOG_ALARM_DIO,
	LOG_DO0_STATE,
	LOG_DO1_STATE,
	LOG_ALARM_TEMP,
	LOG_ALARM_LINE,
	LOG_ALARM_LOW_BAT,
	LOG_ALARM_POWER,
	LOG_ALARM_UPS,
	LOG_ALARM_AKB,
	LOG_VALUE,
	LOG_NONE,
} log_type_t;

typedef __packed struct {
	uint32_t timestamp;
	log_type_t type:8;
	char data[50];
} log_entry_t;

#define LOG_ENTRY_VERSION 1

extern void log_init(bool format);
extern int log_test(void);
extern int log_append(log_entry_t *entry);
extern int log_fetch(log_entry_t *entry, uint32_t timeout);
extern int log_rewind(log_entry_t *entry, uint32_t timeout);
extern int log_discard(log_entry_t *entry, uint32_t timeout);

void log_add(char *log_data);
void log_event_data(log_type_t type, char *data);

/**
  * @brief  Возвращает true если журнал проинициализирован
  */
bool LOG_IsInit();

/**
  * @brief  Отключает журнал для безопасной перезагрузки
  */
bool LOG_Disable(void);

/**
  * @brief  Возвращает общее количество страниц
  */
uint32_t LOG_GetPageCount(void);
uint32_t LOG_GetTotalSTRCount(void);
void LOG_GetPage(char *str, uint32_t page);
uint32_t LOG_GetData(int ptr, char *str, uint32_t size, bool start);

uint32_t History_GetPageCount(void);
uint32_t History_GetTotalSTRCount(void);
void History_GetPage(char *str, uint32_t page);
uint32_t History_GetData(int ptr, char *str, uint32_t size, bool start);


#endif /* LOG_H */