blob: f2d09b5a60e47185ea282e0123ec0cc4e38c2dc3 [file] [log] [blame]
/*
* ANT Stack
*
* Copyright 2009 Dynastream Innovations
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/******************************************************************************\
*
* FILE NAME: ANT_log.h
*
* BRIEF:
* This file defines logging functions
*
*
\******************************************************************************/
#ifndef __ANT_LOG_H
#define __ANT_LOG_H
#include <unistd.h>
#include "ant_types.h"
#define LEVEL_NONE 0
#define LEVEL_ERROR 1
#define LEVEL_WARNING 2
#define LEVEL_INFO 3
#define LEVEL_DEBUG 4
#define LEVEL_VERBOSE 5
#define STREAM_STDOUT 16
#define STREAM_LOGCAT 17
/* Define what stream output should go to depending on platform */
#if defined(__ANDROID__) || defined(ANDROID)
#define ANT_OUTPUT_STREAM STREAM_LOGCAT
#elif defined(__linux__) || defined(__linux) || defined(linux)
#define ANT_OUTPUT_STREAM STREAM_STDOUT
#endif
/* If no debug level defined, set default as none */
#if !defined(ANT_DEBUG)
#define ANT_DEBUG LEVEL_NONE
#endif
/* Define to show function entry and exit */
//#define ANT_STACK_TRACE
/* Define to show message in byte form */
//#define ANT_LOG_SERIAL
/* Define to write serial log to file instead of logcat */
//#define ANT_LOG_SERIAL_FILE "/data/system/antseriallog.txt"
#undef LOG_TAG
#define LOG_TAG "antradio"
#if ANT_DEBUG == LEVEL_NONE
#undef ANT_STACK_TRACE
#undef ANT_LOG_SERIAL
#endif
#if ANT_DEBUG >= LEVEL_ERROR
#define OUTPUT_LEVEL_ERROR(...) OUTPUT_ERROR(__VA_ARGS__)
#else
#define OUTPUT_LEVEL_ERROR(...) ((void)0)
#endif
#if ANT_DEBUG >= LEVEL_WARNING
#define OUTPUT_LEVEL_WARNING(...) OUTPUT_WARNING(__VA_ARGS__)
#else
#define OUTPUT_LEVEL_WARNING(...) ((void)0)
#endif
#if ANT_DEBUG >= LEVEL_INFO
#define OUTPUT_LEVEL_INFO(...) OUTPUT_INFO(__VA_ARGS__)
#else
#define OUTPUT_LEVEL_INFO(...) ((void)0)
#endif
#if ANT_DEBUG >= LEVEL_DEBUG
#define OUTPUT_LEVEL_DEBUG(...) OUTPUT_DEBUG(__VA_ARGS__)
#else
#define OUTPUT_LEVEL_DEBUG(...) ((void)0)
#endif
#if ANT_DEBUG >= LEVEL_VERBOSE
#define OUTPUT_LEVEL_VERBOSE(...) OUTPUT_VERBOSE(__VA_ARGS__)
#else
#define OUTPUT_LEVEL_VERBOSE(...) ((void)0)
#endif
#if ANT_OUTPUT_STREAM == STREAM_STDOUT
#include <stdio.h>
#define OUTPUT_VERBOSE(fmt, ...) fprintf(stdout, LOG_TAG "<V>: " fmt "\n", ##__VA_ARGS__)
#define OUTPUT_DEBUG(fmt, ...) fprintf(stdout, LOG_TAG "<D>: " fmt "\n", ##__VA_ARGS__)
#define OUTPUT_INFO(fmt, ...) fprintf(stdout, LOG_TAG "<I>: " fmt "\n", ##__VA_ARGS__)
#define OUTPUT_WARNING(fmt, ...) fprintf(stdout, LOG_TAG "<W>: " fmt "\n", ##__VA_ARGS__)
#define OUTPUT_ERROR(fmt, ...) fprintf(stdout, LOG_TAG "<E>: " fmt "\n", ##__VA_ARGS__)
#elif ANT_OUTPUT_STREAM == STREAM_LOGCAT
#if (ANT_DEBUG >= LEVEL_VERBOSE) || (defined(ANT_LOG_SERIAL) && !defined(ANT_LOG_SERIAL_FILE))
#undef NDEBUG /* Define verbose logging for logcat if required */
#endif
#include <cutils/log.h>
#define OUTPUT_VERBOSE(...) LOGV(__VA_ARGS__)
#define OUTPUT_DEBUG(...) LOGD(__VA_ARGS__)
#define OUTPUT_INFO(...) LOGI(__VA_ARGS__)
#define OUTPUT_WARNING(...) LOGW(__VA_ARGS__)
#define OUTPUT_ERROR(...) LOGE(__VA_ARGS__)
#endif
#define ANT_WARN(...) OUTPUT_WARNING(__VA_ARGS__)
#define ANT_ERROR(...) OUTPUT_ERROR(__VA_ARGS__)
#define ANT_DEBUG_V(...) OUTPUT_LEVEL_VERBOSE(__VA_ARGS__)
#define ANT_DEBUG_D(...) OUTPUT_LEVEL_DEBUG(__VA_ARGS__)
#define ANT_DEBUG_I(...) OUTPUT_LEVEL_INFO(__VA_ARGS__)
#define ANT_DEBUG_W(...) OUTPUT_LEVEL_WARNING(__VA_ARGS__)
#define ANT_DEBUG_E(...) OUTPUT_LEVEL_ERROR(__VA_ARGS__)
#if defined(ANT_STACK_TRACE)
#define ANT_FUNC_START() OUTPUT_DEBUG("-> FUNC start %s", __FUNCTION__)
#define ANT_FUNC_END() OUTPUT_DEBUG("<- FUNC end %s", __FUNCTION__)
#else
#define ANT_FUNC_START() ((void)0)
#define ANT_FUNC_END() ((void)0)
#endif
#if defined(ANT_LOG_SERIAL)
static inline void ANT_SERIAL(ANT_U8 *buf, ANT_U8 len, char dir)
{
static const char hexToChar[] = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
int i;
static char log[1024];
char *ptr = log;
*(ptr++) = dir;
*(ptr++) = 'x';
*(ptr++) = ' ';
for (i = 0; i < len; i++) {
*(ptr++) = '[';
*(ptr++) = hexToChar[(buf[i] & 0xF0) >> 4];
*(ptr++) = hexToChar[(buf[i] & 0x0F) >> 0];
*(ptr++) = ']';
}
#if defined(ANT_LOG_SERIAL_FILE)
*(ptr++) = '\n';
FILE *fd = NULL;
fd = fopen(ANT_LOG_SERIAL_FILE, "a");
if (NULL == fd) {
LOGW("Could not open %s for serial output. %s", ANT_LOG_SERIAL_FILE, strerror(errno));
} else {
fwrite(log, 1, (ptr - log), fd);
if (fclose(fd)) {
LOGW("Could not close file for serial output. %s", strerror(errno));
}
}
#else
*(ptr++) = '\0';
OUTPUT_VERBOSE("%s", log);
#endif
}
#else
#define ANT_SERIAL(...) ((void)0)
#endif
#endif /* __ANT_LOG_H */