31 userList.addItem(phoneNum, userGroup);
39 userList.deleteItem(userList.findItem(phoneNum));
46 userList.deleteHead();
55 return userList.editItemId(userList.findItem(actualPhoneNum), newPhoneNum);
64 userList.editItemVal(userList.findItem(phoneNum), userGroup);
73 return userList.isInList(userList.findItem(phoneNum));
81 return userList.getNumOfItems();
90 return userList.getItemVal(userList.findItem(phoneNum));
100 userList.printData();
109 paramList.addItem(pName, val);
119 paramList.addItemWithCallback(pName, val, callback);
129 paramList.setParamAccess(paramList.findItem(pName), access);
137 paramList.deleteItem(paramList.findItem(pName));
146 return paramList.editItemId(paramList.findItem(pActualName), pNewName);
155 paramList.editItemVal(paramList.findItem(pName), val);
164 return paramList.isInList(paramList.findItem(pName));
172 return paramList.getNumOfItems();
181 return paramList.getItemVal(paramList.findItem(pName));
191 paramList.printData();
206 if(strlen(pMsg) <= MSG_BUFFER_LENGTH && parser.isParserReady() && !paramList.isListEmpty()){
208 memset(_msg, 0,
sizeof(_msg));
210 if(parser.isMsgValid()){
211 while(parser.isNameAvailable()){
213 tmpName = parser.getTmpName();
214 if(
isParamInAdeon(tmpName) && (getParamAccess(tmpName) >= userGroup)){
220 Serial.println(
"Message is invalid");
238uint8_t Adeon::getParamAccess(
const char* pName){
239 return paramList.getParamAccess(paramList.findItem(pName));
248Adeon::Parser::Parser(
char* pMsg){
258bool Adeon::Parser::isParserReady(){
259 return parsState == State::READY;
270bool Adeon::Parser::isMsgValid(){
271 if(isHashParsingValid()){
272 parsState = State::INIT;
286bool Adeon::Parser::isNameAvailable(){
287 if(_processedNames < _numberOfNames){
290 parsState = State::READY;
301void Adeon::Parser::parse(){
305 _numberOfNames = getNumberOfNames();
306 parsState = State::PROCESSING;
308 case State::PROCESSING:
310 tmpStr = parseName();
323char* Adeon::Parser::getTmpName(){
331uint16_t Adeon::Parser::getValue(){
341bool Adeon::Parser::isHashParsingValid(){
342 char* pEndSymbol = strchr(_pMsg, _hashEndSymbol);
344 if(pEndSymbol !=
nullptr){
345 uint8_t hashLen = strlen(_pMsg) - strlen(pEndSymbol);
347 if(hashLen == SHORT_HASH_LENGTH){
348 strncpy(_tmpHash, _pMsg, hashLen);
349 return _pHash.isHashValid(pEndSymbol + 2, _tmpHash);
359uint8_t Adeon::Parser::getNumberOfNames(){
360 uint8_t msgLen = strlen(_pMsg);
361 uint8_t semicolonCount = 0;
363 for(
int i = 0; i < msgLen; i++){
364 if(_pMsg[i] == _semicolon){
368 return semicolonCount;
378char* Adeon::Parser::parseName(){
380 if(_processedNames == 0){
381 tmp = positionOfStr(_pMsg, 1, _gap);
382 strcpy(_pTmpName,getCharsUntilEndSym(tmp, _gap));
385 tmp = positionOfStr(_pMsg, _processedNames, _semicolon);
386 strcpy(_pTmpName, getCharsUntilEndSym(tmp, _gap));
397void Adeon::Parser::parseValue(
char* pActualParam){
399 tmp = positionOfStr(pActualParam, 1, _equal) + 1;
400 tmp = getCharsUntilEndSym(tmp, _semicolon);
401 _tmpValue = (uint16_t)atoi(tmp);
413char* Adeon::Parser::getCharsUntilEndSym(
char* pActualParam,
char endSymbol){
416 while(pActualParam[i] != endSymbol){
419 endPointer = &pActualParam[i];
421 memset(_subStr, 0,
sizeof(_subStr));
423 while(&pActualParam[i] != endPointer){
424 _subStr[i] = pActualParam[i];
427 _subStr[i] = _nullChar;
438char* Adeon::Parser::positionOfStr(
char* pStr, uint8_t pos,
char startSymbol){
439 uint8_t symCount = 0;
441 while(symCount != pos){
442 if(pStr[i] == startSymbol){
458Adeon::Parser::Hash::Hash(){
467bool Adeon::Parser::Hash::isHashValid(
char* msg,
char* hash){
468 makeHashFromStr(msg);
469 return(strcmp(_shortHash, hash) == 0);
478void Adeon::Parser::Hash::makeHashFromStr(
char* msg){
479 unsigned char* hash = MD5::make_hash(msg);
480 char* md5Str = MD5::make_digest(hash, 16);
482 makeShortHash(md5Str);
491void Adeon::Parser::Hash::makeShortHash(
char* str){
492 uint8_t strLength = strlen(str);
493 memset(_shortHash, 0,
sizeof(_shortHash));
494 strcpy(_shortHash, &str[strLength - SHORT_HASH_LENGTH]);
505void Adeon::ParameterList::addItemWithCallback(
const char* pId, uint16_t val,
void (*callback)(uint16_t)){
506 Item* pItem = addItem(pId, val);
508 if (pItem ==
nullptr) {
509 Serial.print(
"Adeon: Unable to add parameter "); Serial.println(pId);
513 pItem->_pCallback = callback;
521void Adeon::ParameterList::setParamAccess(Item* pItem, uint8_t access){
522 pItem->accessRights = access;
529uint8_t Adeon::ParameterList::getParamAccess(Item* pItem){
530 return pItem->accessRights;
Adeon library for Arduino.
uint16_t getUserRightsLevel(const char *phoneNum)
Get user rights value.
uint8_t getNumOfUsers()
Get number of users in a list.
void addParam(const char *pName, uint16_t val=1)
Add parameter into Adeon.
void addUser(const char *phoneNum, uint16_t userGroup=1)
Add user into Adeon.
void deleteParam(const char *pName)
Delete parameter from Adeon.
void editParamValue(const char *pName, uint16_t val=1)
Edit parameter value.
char * editParamName(const char *pActualName, const char *pNewName)
Edit parameter name.
void addParamWithCallback(void(*callback)(uint16_t), const char *pName, uint16_t val=1)
Add parameter into Adeon.
char * editUserPhone(const char *actualPhoneNum, const char *newPhoneNum)
Edit user telephone number.
void setParamAccess(const char *pName, uint8_t access)
Set parameter access rights.
bool isUserInAdeon(const char *phoneNum)
Check if user is in Adeon.
void deleteUser(const char *phoneNum)
Delete user from Adeon.
void printParams()
Print content of the parameter list.
void printUsers()
Print content of the user list.
void parseBuf(const char *pMsg, uint8_t userGroup)
Call parsing process of a message.
bool isAdeonReady()
Check if Adeon is ready for incoming message.
bool isParamInAdeon(const char *pName)
Check if parameter is in Adeon.
uint16_t getParamValue(const char *pName)
Get parameter value.
void deleteList()
Delete whole Adeon list.
void editUserRights(const char *phoneNum, uint16_t userGroup=1)
Edit user rights.
uint8_t getNumOfParams()
Get number of parameters in a list.