106 lines
5.0 KiB
C++
106 lines
5.0 KiB
C++
/*
|
||
* 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_ */
|