Add TLV8 add() methods for uint64_t and char*, as well as new getVal() template for returning an integer
This commit is contained in:
parent
acebaf6caa
commit
d40d709643
18
src/TLV8.cpp
18
src/TLV8.cpp
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
src/TLV8.h
12
src/TLV8.h
|
|
@ -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()));}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue