/* * 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; //