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

106 lines
3.9 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_ */