Adeon
Loading...
Searching...
No Matches
AdeonGSM.cpp
Go to the documentation of this file.
1
23#include <AdeonGSM.h>
24
30void Adeon::addUser(const char* phoneNum, uint16_t userGroup){
31 userList.addItem(phoneNum, userGroup);
32}
33
38void Adeon::deleteUser(const char* phoneNum){
39 userList.deleteItem(userList.findItem(phoneNum));
40}
41
46 userList.deleteHead();
47}
48
54char* Adeon::editUserPhone(const char* actualPhoneNum, const char* newPhoneNum){
55 return userList.editItemId(userList.findItem(actualPhoneNum), newPhoneNum);
56}
57
63void Adeon::editUserRights(const char* phoneNum, uint16_t userGroup){
64 userList.editItemVal(userList.findItem(phoneNum), userGroup);
65}
66
72bool Adeon::isUserInAdeon(const char* phoneNum){
73 return userList.isInList(userList.findItem(phoneNum));
74}
75
81 return userList.getNumOfItems();
82}
83
89uint16_t Adeon::getUserRightsLevel(const char* phoneNum){
90 return userList.getItemVal(userList.findItem(phoneNum));
91}
92
100 userList.printData();
101}
102
108void Adeon::addParam(const char* pName, uint16_t val){
109 paramList.addItem(pName, val);
110}
111
118void Adeon::addParamWithCallback(void (*callback)(uint16_t), const char* pName, uint16_t val){
119 paramList.addItemWithCallback(pName, val, callback);
120}
121
128void Adeon::setParamAccess(const char* pName, uint8_t access){
129 paramList.setParamAccess(paramList.findItem(pName), access);
130}
131
136void Adeon::deleteParam(const char* pName){
137 paramList.deleteItem(paramList.findItem(pName));
138}
139
145char* Adeon::editParamName(const char* pActualName, const char* pNewName){
146 return paramList.editItemId(paramList.findItem(pActualName), pNewName);
147}
148
154void Adeon::editParamValue(const char* pName, uint16_t val){
155 paramList.editItemVal(paramList.findItem(pName), val);
156}
157
163bool Adeon::isParamInAdeon(const char* pName){
164 return paramList.isInList(paramList.findItem(pName));
165}
166
172 return paramList.getNumOfItems();
173}
174
180uint16_t Adeon::getParamValue(const char* pName){
181 return paramList.getItemVal(paramList.findItem(pName));
182}
183
191 paramList.printData();
192}
193
204void Adeon::parseBuf(const char* pMsg, uint8_t userGroup){
205 char* tmpName;
206 if(strlen(pMsg) <= MSG_BUFFER_LENGTH && parser.isParserReady() && !paramList.isListEmpty()){
207 _ready = false;
208 memset(_msg, 0, sizeof(_msg));
209 strcpy(_msg, pMsg);
210 if(parser.isMsgValid()){
211 while(parser.isNameAvailable()){
212 parser.parse();
213 tmpName = parser.getTmpName();
214 if(isParamInAdeon(tmpName) && (getParamAccess(tmpName) >= userGroup)){
215 editParamValue(tmpName, parser.getValue());
216 }
217 }
218 }
219 else{
220 Serial.println("Message is invalid");
221 }
222 _ready = true;
223 }
224}
225
231 return _ready;
232}
233
238uint8_t Adeon::getParamAccess(const char* pName){
239 return paramList.getParamAccess(paramList.findItem(pName));
240}
241
248Adeon::Parser::Parser(char* pMsg){
249 _pMsg = pMsg;
250}
251
258bool Adeon::Parser::isParserReady(){
259 return parsState == State::READY;
260}
261
270bool Adeon::Parser::isMsgValid(){
271 if(isHashParsingValid()){
272 parsState = State::INIT;
273 parse();
274 return true;
275 }
276 return false;
277}
278
286bool Adeon::Parser::isNameAvailable(){
287 if(_processedNames < _numberOfNames){
288 return true;
289 }
290 parsState = State::READY;
291 return false;
292}
293
301void Adeon::Parser::parse(){
302 switch(parsState){
303 case State::INIT:
304 _processedNames = 0;
305 _numberOfNames = getNumberOfNames();
306 parsState = State::PROCESSING;
307 break;
308 case State::PROCESSING:
309 char* tmpStr;
310 tmpStr = parseName();
311 parseValue(tmpStr);
312 _processedNames++;
313 break;
314 default:
315 break;
316 }
317}
318
323char* Adeon::Parser::getTmpName(){
324 return _pTmpName;
325}
326
331uint16_t Adeon::Parser::getValue(){
332 return _tmpValue;
333}
334
341bool Adeon::Parser::isHashParsingValid(){
342 char* pEndSymbol = strchr(_pMsg, _hashEndSymbol);
343 //if wrong format (no colon) return false
344 if(pEndSymbol != nullptr){
345 uint8_t hashLen = strlen(_pMsg) - strlen(pEndSymbol);
346
347 if(hashLen == SHORT_HASH_LENGTH){
348 strncpy(_tmpHash, _pMsg, hashLen);
349 return _pHash.isHashValid(pEndSymbol + 2, _tmpHash);
350 }
351 }
352 return false;
353}
354
359uint8_t Adeon::Parser::getNumberOfNames(){
360 uint8_t msgLen = strlen(_pMsg);
361 uint8_t semicolonCount = 0;
362
363 for(int i = 0; i < msgLen; i++){
364 if(_pMsg[i] == _semicolon){
365 semicolonCount++;
366 }
367 }
368 return semicolonCount;
369}
370
378char* Adeon::Parser::parseName(){
379 char* tmp;
380 if(_processedNames == 0){
381 tmp = positionOfStr(_pMsg, 1, _gap);
382 strcpy(_pTmpName,getCharsUntilEndSym(tmp, _gap));
383 }
384 else{
385 tmp = positionOfStr(_pMsg, _processedNames, _semicolon);
386 strcpy(_pTmpName, getCharsUntilEndSym(tmp, _gap));
387 }
388 return tmp;
389}
390
397void Adeon::Parser::parseValue(char* pActualParam){
398 char* tmp;
399 tmp = positionOfStr(pActualParam, 1, _equal) + 1; //address plus one because of the gap
400 tmp = getCharsUntilEndSym(tmp, _semicolon);
401 _tmpValue = (uint16_t)atoi(tmp);
402}
403
413char* Adeon::Parser::getCharsUntilEndSym(char* pActualParam, char endSymbol){
414 int i = 0;
415 char* endPointer;
416 while(pActualParam[i] != endSymbol){
417 i++;
418 }
419 endPointer = &pActualParam[i];
420
421 memset(_subStr, 0, sizeof(_subStr));
422 i = 0;
423 while(&pActualParam[i] != endPointer){
424 _subStr[i] = pActualParam[i];
425 i++;
426 }
427 _subStr[i] = _nullChar;
428 return _subStr;
429}
430
438char* Adeon::Parser::positionOfStr(char* pStr, uint8_t pos, char startSymbol){
439 uint8_t symCount = 0;
440 uint8_t i = 0;
441 while(symCount != pos){
442 if(pStr[i] == startSymbol){
443 symCount++;
444 }
445 i++;
446 }
447 return &pStr[i];
448}
449
458Adeon::Parser::Hash::Hash(){
459
460}
461
467bool Adeon::Parser::Hash::isHashValid(char* msg, char* hash){
468 makeHashFromStr(msg);
469 return(strcmp(_shortHash, hash) == 0);
470}
471
478void Adeon::Parser::Hash::makeHashFromStr(char* msg){
479 unsigned char* hash = MD5::make_hash(msg);
480 char* md5Str = MD5::make_digest(hash, 16);
481 free(hash);
482 makeShortHash(md5Str);
483 free(md5Str);
484}
485
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]);
495}
496
505void Adeon::ParameterList::addItemWithCallback(const char* pId, uint16_t val, void (*callback)(uint16_t)){
506 Item* pItem = addItem(pId, val);
507
508 if (pItem == nullptr) {
509 Serial.print("Adeon: Unable to add parameter "); Serial.println(pId);
510 return;
511 }
512
513 pItem->_pCallback = callback;
514}
515
521void Adeon::ParameterList::setParamAccess(Item* pItem, uint8_t access){
522 pItem->accessRights = access;
523}
524
529uint8_t Adeon::ParameterList::getParamAccess(Item* pItem){
530 return pItem->accessRights;
531}
Adeon library for Arduino.
uint16_t getUserRightsLevel(const char *phoneNum)
Get user rights value.
Definition: AdeonGSM.cpp:89
uint8_t getNumOfUsers()
Get number of users in a list.
Definition: AdeonGSM.cpp:80
void addParam(const char *pName, uint16_t val=1)
Add parameter into Adeon.
Definition: AdeonGSM.cpp:108
void addUser(const char *phoneNum, uint16_t userGroup=1)
Add user into Adeon.
Definition: AdeonGSM.cpp:30
void deleteParam(const char *pName)
Delete parameter from Adeon.
Definition: AdeonGSM.cpp:136
void editParamValue(const char *pName, uint16_t val=1)
Edit parameter value.
Definition: AdeonGSM.cpp:154
char * editParamName(const char *pActualName, const char *pNewName)
Edit parameter name.
Definition: AdeonGSM.cpp:145
void addParamWithCallback(void(*callback)(uint16_t), const char *pName, uint16_t val=1)
Add parameter into Adeon.
Definition: AdeonGSM.cpp:118
char * editUserPhone(const char *actualPhoneNum, const char *newPhoneNum)
Edit user telephone number.
Definition: AdeonGSM.cpp:54
void setParamAccess(const char *pName, uint8_t access)
Set parameter access rights.
Definition: AdeonGSM.cpp:128
bool isUserInAdeon(const char *phoneNum)
Check if user is in Adeon.
Definition: AdeonGSM.cpp:72
void deleteUser(const char *phoneNum)
Delete user from Adeon.
Definition: AdeonGSM.cpp:38
void printParams()
Print content of the parameter list.
Definition: AdeonGSM.cpp:190
void printUsers()
Print content of the user list.
Definition: AdeonGSM.cpp:99
void parseBuf(const char *pMsg, uint8_t userGroup)
Call parsing process of a message.
Definition: AdeonGSM.cpp:204
bool isAdeonReady()
Check if Adeon is ready for incoming message.
Definition: AdeonGSM.cpp:230
bool isParamInAdeon(const char *pName)
Check if parameter is in Adeon.
Definition: AdeonGSM.cpp:163
uint16_t getParamValue(const char *pName)
Get parameter value.
Definition: AdeonGSM.cpp:180
void deleteList()
Delete whole Adeon list.
Definition: AdeonGSM.cpp:45
void editUserRights(const char *phoneNum, uint16_t userGroup=1)
Edit user rights.
Definition: AdeonGSM.cpp:63
uint8_t getNumOfParams()
Get number of parameters in a list.
Definition: AdeonGSM.cpp:171