Add TLV8 add() methods for uint64_t and char*, as well as new getVal() template for returning an integer

This commit is contained in:
Gregg 2024-04-08 21:33:27 -05:00
parent acebaf6caa
commit d40d709643
2 changed files with 29 additions and 3 deletions

View File

@ -81,6 +81,7 @@ TLV8_it TLV8::add(uint8_t tag, size_t len, const uint8_t* val){
///////////////////////////////////// /////////////////////////////////////
TLV8_it TLV8::add(uint8_t tag, TLV8 &subTLV){ TLV8_it TLV8::add(uint8_t tag, TLV8 &subTLV){
auto it=add(tag,subTLV.pack_size(),NULL); // create space for inserting sub TLV and store iterator to new element auto it=add(tag,subTLV.pack_size(),NULL); // create space for inserting sub TLV and store iterator to new element
subTLV.pack(*it); // pack subTLV into new element subTLV.pack(*it); // pack subTLV into new element
return(--end()); return(--end());
@ -88,6 +89,17 @@ TLV8_it TLV8::add(uint8_t tag, TLV8 &subTLV){
///////////////////////////////////// /////////////////////////////////////
TLV8_it TLV8::add(uint8_t tag, uint64_t val){
uint8_t *p=reinterpret_cast<uint8_t *>(&val);
size_t nBytes=sizeof(uint64_t);
while(nBytes>1 && p[nBytes-1]==0) // TLV requires little endian without any trailing zero bytes (i.e. only use what is needed to fully represent the value)
nBytes--;
return(add(tag, nBytes, p));
}
/////////////////////////////////////
TLV8_it TLV8::find(uint8_t tag, TLV8_it it1, TLV8_it it2){ TLV8_it TLV8::find(uint8_t tag, TLV8_it it1, TLV8_it it2){
auto it=it1; auto it=it1;
@ -247,6 +259,12 @@ void TLV8::print(TLV8_it it1, TLV8_it it2){
Serial.printf("(%d) ",(*it1).len); Serial.printf("(%d) ",(*it1).len);
for(int i=0;i<(*it1).len;i++) for(int i=0;i<(*it1).len;i++)
Serial.printf("%02X",(*it1).val.get()[i]); Serial.printf("%02X",(*it1).val.get()[i]);
if((*it1).len==0)
Serial.printf(" (null)");
else if((*it1).len<=4)
Serial.printf(" (%u)",(*it1).getVal());
else if((*it1).len<=8)
Serial.printf(" (%llu)",(*it1).getVal<uint64_t>());
Serial.printf("\n"); Serial.printf("\n");
it1++; it1++;
} }

View File

@ -47,6 +47,13 @@ struct tlv8_t {
return(val.get()); return(val.get());
} }
template<class T=uint32_t> T getVal(){
T iVal=0;
for(int i=0;i<len;i++)
iVal|=static_cast<T>(val.get()[i])<<(i*8);
return(iVal);
}
}; };
///////////////////////////////////// /////////////////////////////////////
@ -78,9 +85,10 @@ class TLV8 : public std::list<tlv8_t, Mallocator<tlv8_t>> {
TLV8(const TLV8_names *names, int nNames) : names{names}, nNames{nNames} {}; TLV8(const TLV8_names *names, int nNames) : names{names}, nNames{nNames} {};
TLV8_it add(uint8_t tag, size_t len, const uint8_t *val); TLV8_it add(uint8_t tag, size_t len, const uint8_t *val);
TLV8_it add(uint8_t tag, uint8_t val){return(add(tag, 1, &val));} TLV8_it add(uint8_t tag, uint64_t val);
TLV8_it add(uint8_t tag){return(add(tag, 0, NULL));}
TLV8_it add(uint8_t tag, TLV8 &subTLV); TLV8_it add(uint8_t tag, TLV8 &subTLV);
TLV8_it add(uint8_t tag){return(add(tag, 0, NULL));}
TLV8_it add(uint8_t tag, const char *val){return(add(tag, strlen(val), reinterpret_cast<const uint8_t*>(val)));}
TLV8_it find(uint8_t tag, TLV8_it it1, TLV8_it it2); TLV8_it find(uint8_t tag, TLV8_it it1, TLV8_it it2);
TLV8_it find(uint8_t tag, TLV8_it it1){return(find(tag, it1, end()));} TLV8_it find(uint8_t tag, TLV8_it it1){return(find(tag, it1, end()));}