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){
|
||||
|
||||
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
|
||||
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){
|
||||
|
||||
auto it=it1;
|
||||
|
|
@ -247,6 +259,12 @@ void TLV8::print(TLV8_it it1, TLV8_it it2){
|
|||
Serial.printf("(%d) ",(*it1).len);
|
||||
for(int i=0;i<(*it1).len;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");
|
||||
it1++;
|
||||
}
|
||||
|
|
|
|||
12
src/TLV8.h
12
src/TLV8.h
|
|
@ -47,6 +47,13 @@ struct tlv8_t {
|
|||
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_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){return(add(tag, 0, NULL));}
|
||||
TLV8_it add(uint8_t tag, uint64_t val);
|
||||
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){return(find(tag, it1, end()));}
|
||||
|
|
|
|||
Loading…
Reference in New Issue