MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/I2cEeprom24LCxxB.hh

106 lines
5.0 KiB
C++
Raw Permalink Normal View History

2024-06-07 11:12:56 +03:00
/*
* I2cEeprom24LCxxB.h
*
* Created on: 14 апр. 2018 г.
* Author: Pair programming
*/
#ifndef SOURCE_DRIVER_I2CEEPROM24LC64B_H_
#define SOURCE_DRIVER_I2CEEPROM24LC64B_H_
#include "../peripheral/IMemoryAccess.hh"
#include "../systemic/IProcess.hh"
#include "../peripheral/II2c.hh"
#include "IDiscreteOutput.hh"
#include "../systemic/Timer.hh"
namespace driver { namespace detail {
//!Драйвер для работы с eeprom 24LC64B или аналагом по шине i2c.
/*!Класс осуществляет чтение из энергонезависимой памяти, запись в энергонезависимую память.
* Не осуществляет проверку правильности записанных данных.
* Контролирует наличие и работоспособность микросхемы eeprom.
*/
class I2cEeprom24LCxxB : public peripheral::IMemoryAccess, public systemic::IProcess {
//!Класс заглушка для неиспользуемого вывода защиты записи.
static class DiscreteOutputDummy : public IDiscreteOutput {
void on() {}
void off() {}
bool isOn() const { return false; }
} write_protect;
public:
//!Структура описывает настройки для драйвера микросхемы EEPROM 24LC64B.
struct Setting {
uint16_t polling_time; //!<Максимальное время ожидания записи страницы, мс.
uint16_t size; //!<Размер памяти EEPROM 24LC64B.
uint16_t address; //!<Адрес на шине i2c.
uint32_t baud_rate; //!<Частота SCL сигнала, Гц.
uint16_t page_size; //!<Размер страницы данных в EEPROM.
};
//!Контруктор класса.
/*!w
* \param[in] bus Интерфейс доступа к периферие i2c.
* \param[in] config Структура настроек.
* \param[in] wp Дискретный выход защиты микросхемы от записи.
*/
I2cEeprom24LCxxB( peripheral::II2c & bus, const Setting & config, IDiscreteOutput & wp = write_protect );
void init(systemic::IProcessControl * pc, float Ts);
void process();
bool read( char * data, size_t startAddress, size_t size );
bool write( const char * data, size_t startAddress, size_t size );
bool isReadComplete() const override;
bool isWriteComplete() const override;
std::size_t getCapacity() const override;
//!Признак ошибки модуля.
bool isError() const;
private:
peripheral::II2c & i2c; //!<Интерфейс доступа к периферие i2c.
peripheral::II2c::IResult * result; //!<Указатель на интерфейс доступа к результатам транзакции i2c.
IDiscreteOutput & write_protected; //!<Защита микросхемы от записи.
systemic::IProcessControl * proc_ctrl; //!<Интерфейс управления процессом.
bool failed_request; //!<Признак необходимости запроса.
const uint16_t polling_time; //!<Максимальное время ожидания записи страницы, мс.
const uint16_t size; //!<Размер памяти EEPROM.
const uint16_t address; //!<Адрес на шине i2c.
const uint32_t baud_rate; //!<Частота SCL сигнала, Гц.
const uint16_t page_size; //!<Размер страницы данных в EEPROM.
systemic::Timer timer; //!<Таймер для контроля времени записи страници в EEPROM.
char page_buff[16]; //!<Буфер для записи в и чтения из EEPROM.
std::size_t index; //!<Текущий индкес.
std::size_t start_index; //!<Стартовый индекс.
std::size_t stop_index; //!<Крайний индекс.
std::size_t current_step; //!<Текущий шаг, байт.
static const unsigned int frame_step = 12; //!<Размер поля данных не включающий байт управления и двух байт адреса.
static const unsigned int address_bytes_count = 2; //!<Количество байт для хранения адреса на запись/чтение.
static const unsigned int bytes_in_char = 2; //<! Количество байт в char.
char * read_p; //!<Указатель на буфер для чтения данных.
const char * write_p; //!<Указатель на буфер для записи данных.
unsigned int error_counter; //!<Счетчик отказов.
static const unsigned int error_counter_failure = 16; //!<Количество ошибок для диагностического отказа.
};
}
}
#endif /* SOURCE_DRIVER_I2CEEPROM24LCXXB_H_ */