diff --git a/src/TLV8.cpp b/src/TLV8.cpp index 2766490..ffbe10b 100644 --- a/src/TLV8.cpp +++ b/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(&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()); Serial.printf("\n"); it1++; } diff --git a/src/TLV8.h b/src/TLV8.h index 5240ee6..aca36c4 100644 --- a/src/TLV8.h +++ b/src/TLV8.h @@ -42,10 +42,17 @@ struct tlv8_t { tlv8_t(uint8_t tag, size_t len, const uint8_t* val); void update(size_t addLen, const uint8_t *addVal); void osprint(std::ostream& os); - + operator uint8_t*() const{ return(val.get()); } + + template T getVal(){ + T iVal=0; + for(int i=0;i(val.get()[i])<<(i*8); + return(iVal); + } }; @@ -78,9 +85,10 @@ class TLV8 : public std::list> { 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(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()));}