GY-63_MS5611/libraries/FRAM_I2C/FRAM_MULTILANGUAGE.cpp
2023-04-23 19:32:07 +02:00

159 lines
3.7 KiB
C++

//
// FILE: FRAM_MULTILANGUAGE.cpp
// AUTHOR: Rob Tillaart
// DATE: 2023-04-22
// PURPOSE: Arduino library for I2C FRAM based multi language table
// URL: https://github.com/RobTillaart/FRAM_I2C
//
#include "FRAM_MULTILANGUAGE.h" // https://github.com/RobTillaart/FRAM_I2C
// CONFIG
#define FML_MAX_LANGUAGES 5
#define FML_MAX_COUNTRY_CODE 3
// OFFSETS
#define FML_VERSION 0
#define FML_LANGUAGES 10
#define FML_STRINGS 11
#define FML_LENGTH 12
#define FML_LANGCODE 20
#define FML_TABLES 40
FRAM_ML::FRAM_ML()
{
}
uint32_t FRAM_ML::begin(FRAM *fram, uint32_t memAddr, uint8_t languages, uint8_t strings, uint8_t maxLength)
{
_fram = fram;
_baseAddr = memAddr;
_maxLanguages = languages;
if (_maxLanguages > FML_MAX_LANGUAGES)
{
_maxLanguages = FML_MAX_LANGUAGES;
}
_maxStrings = strings;
_maxLength = maxLength;
// write configuration to FRAM.
_fram->write8(_baseAddr + FML_VERSION, _version);
_fram->write8(_baseAddr + FML_LANGUAGES, _maxLanguages);
_fram->write8(_baseAddr + FML_STRINGS, _maxStrings);
_fram->write8(_baseAddr + FML_LENGTH, _maxLength);
setLanguage(0);
return _baseAddr + _maxLanguages * _maxStrings * _maxLength + FML_TABLES;
}
uint32_t FRAM_ML::begin(FRAM *fram, uint32_t memAddr)
{
_fram = fram;
_baseAddr = memAddr;
_maxLanguages = _fram->read8(_baseAddr + FML_LANGUAGES);
_maxStrings = _fram->read8(_baseAddr + FML_STRINGS);
_maxLength = _fram->read8(_baseAddr + FML_LENGTH);
setLanguage(0);
return _baseAddr + _maxLanguages * _maxStrings * _maxLength + FML_TABLES;
}
int FRAM_ML::getMaxLanguage()
{
return _maxLanguages;
}
int FRAM_ML::getMaxStrings()
{
return _maxStrings;
}
int FRAM_ML::getMaxLength()
{
return _maxLength;
}
/////////////////////////////////////////////////////////////////////
//
//
//
int FRAM_ML::setLanguageName(uint8_t index, const char * str)
{
if (index >= _maxLanguages) return FRAM_ML_INDEX_OUT_OF_RANGE;
uint8_t len = strlen(str);
if (len > FML_MAX_COUNTRY_CODE) return FRAM_ML_TEXT_TOO_LONG;
_fram->write(_baseAddr + FML_LANGCODE + index * (FML_MAX_COUNTRY_CODE + 1), (uint8_t*) str, len);
// add separator.
_fram->write8(_baseAddr + FML_LANGCODE + index * (FML_MAX_COUNTRY_CODE + 1) + len, '\n');
return FRAM_ML_OK;
}
int FRAM_ML::getLanguageName(uint8_t index, char * str)
{
if (index >= _maxLanguages) return FRAM_ML_INDEX_OUT_OF_RANGE;
_fram->readUntil(_baseAddr + FML_LANGCODE + index * (FML_MAX_COUNTRY_CODE + 1), str, (FML_MAX_COUNTRY_CODE + 1), '\n');
return FRAM_ML_OK;
}
/////////////////////////////////////////////////////////////////////
//
//
//
int FRAM_ML::setLanguage(uint8_t index)
{
if (index >= _maxLanguages) return FRAM_ML_INDEX_OUT_OF_RANGE;
_currentLanguage = index;
// set language address too.
_langAddr = _baseAddr + FML_TABLES + _currentLanguage * _maxStrings * _maxLength;
return FRAM_ML_OK;
}
int FRAM_ML::getLanguage()
{
return _currentLanguage;
}
/////////////////////////////////////////////////////////////////////
//
// TEXT TABLES
//
int FRAM_ML::setText(uint8_t index, const char * text)
{
if (index >= _maxStrings) return FRAM_ML_INDEX_OUT_OF_RANGE;
uint8_t len = strlen(text);
if (len >= _maxLength) return FRAM_ML_TEXT_TOO_LONG;
_fram->write(_langAddr + index * _maxLength, (uint8_t*) text, len);
// add separator.
_fram->write8(_langAddr + index * _maxLength + len, '\n');
return FRAM_ML_OK;
}
int FRAM_ML::getText(uint8_t index, char * text)
{
if (index >= _maxStrings) return FRAM_ML_INDEX_OUT_OF_RANGE;
_fram->readUntil(_langAddr + index * _maxLength, text, _maxLength, '\n');
return FRAM_ML_OK;
}
// -- END OF FILE --