diff --git a/include/log/log.h b/include/log/log.h index ce253e272..f9299b08c 100644 --- a/include/log/log.h +++ b/include/log/log.h @@ -492,6 +492,7 @@ typedef enum { EVENT_TYPE_LONG = 1, EVENT_TYPE_STRING = 2, EVENT_TYPE_LIST = 3, + EVENT_TYPE_FLOAT = 4, } AndroidEventLogType; #define sizeof_AndroidEventLogType sizeof(typeof_AndroidEventLogType) #define typeof_AndroidEventLogType unsigned char @@ -510,6 +511,13 @@ typedef enum { sizeof(longBuf)); \ } #endif +#ifndef LOG_EVENT_FLOAT +#define LOG_EVENT_FLOAT(_tag, _value) { \ + float floatBuf = _value; \ + (void) android_btWriteLog(_tag, EVENT_TYPE_FLOAT, &floatBuf, \ + sizeof(floatBuf)); \ + } +#endif #ifndef LOG_EVENT_STRING #define LOG_EVENT_STRING(_tag, _value) \ (void) __android_log_bswrite(_tag, _value); diff --git a/liblog/logprint.c b/liblog/logprint.c index 7ba4c8e78..0f01542a3 100644 --- a/liblog/logprint.c +++ b/liblog/logprint.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -432,7 +433,7 @@ static inline uint64_t get8LE(const uint8_t* src) low = src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24); high = src[4] | (src[5] << 8) | (src[6] << 16) | (src[7] << 24); - return ((long long) high << 32) | (long long) low; + return ((uint64_t) high << 32) | (uint64_t) low; } @@ -490,7 +491,7 @@ static int android_log_printBinaryEvent(const unsigned char** pEventData, case EVENT_TYPE_LONG: /* 64-bit signed long */ { - long long lval; + uint64_t lval; if (eventDataLen < 8) return -1; @@ -498,7 +499,30 @@ static int android_log_printBinaryEvent(const unsigned char** pEventData, eventData += 8; eventDataLen -= 8; - outCount = snprintf(outBuf, outBufLen, "%lld", lval); + outCount = snprintf(outBuf, outBufLen, "%" PRId64, lval); + if (outCount < outBufLen) { + outBuf += outCount; + outBufLen -= outCount; + } else { + /* halt output */ + goto no_room; + } + } + break; + case EVENT_TYPE_FLOAT: + /* float */ + { + uint32_t ival; + float fval; + + if (eventDataLen < 4) + return -1; + ival = get4LE(eventData); + fval = *(float*)&ival; + eventData += 4; + eventDataLen -= 4; + + outCount = snprintf(outBuf, outBufLen, "%f", fval); if (outCount < outBufLen) { outBuf += outCount; outBufLen -= outCount; diff --git a/logcat/event.logtags b/logcat/event.logtags index 1b5c6f467..909f8e200 100644 --- a/logcat/event.logtags +++ b/logcat/event.logtags @@ -21,6 +21,7 @@ # 2: long # 3: string # 4: list +# 5: float # # The data unit is a number taken from the following list: # 1: Number of objects