mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
159 lines
3.7 KiB
C++
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 --
|
|
|