blob: 077d6f8a535b745fac2bbbefc6056e96a0b2f2b2 [file] [log] [blame]
# Create nxLog_<ComponentName>.h
import sys
LEVELS = [ "DEBUG", "INFO", "WARN", "ERROR"]
BIT_WIDTH = [8*1, 8*2,8*4]
class nxLogHGenerator(object):
def __init__(self,comp_name, parent_name):
self.comp_name = comp_name
self.comp_nameu = comp_name.upper()
self.parent_nameu = parent_name.upper()
self.file_name = "nxLog_%s.h"%(comp_name)
def run(self):
self.hFile = open(self.file_name,"w")
self.startHeaderGuard()
self.commonHeaderFiles()
self.checkPreviousDefines()
self.setDefaulLevels()
self.individualDefines()
self.endHeaderGuard()
def startHeaderGuard(self):
*
self.hFile.write('''/* Copyright 2018 NXP
* SPDX-License-Identifier: Apache-2.0
*/
''')
self.hFile.write("#ifndef NX_LOG_%s_H\n" % self.comp_nameu)
self.hFile.write("#define NX_LOG_%s_H\n" % self.comp_nameu)
def commonHeaderFiles(self):
self.hFile.write("""
#include <nxLog.h>
/* ############################################################ */
/* ## AUTO Generated ########################################## */
/* ############################################################ */
/* Default configuration file */
#include <nxLog_DefaultConfig.h>
/* clang-format off */
""")
def checkPreviousDefines(self):
self.hFile.write("""
/* Check if we are double defining these macros */
""")
self.hFile.write("#if defined(LOG_%s)"%(LEVELS[0][0],))
for level in LEVELS[1:]:
prefix = level[0]
self.hFile.write(" || defined(LOG_%s)"%(prefix,))
self.hFile.write("\n")
self.hFile.write("/* This should not happen. The only reason this could happn is double inclusion of different log files. */\n")
self.hFile.write("# error \"LOG_ macro already defined\"\n")
self.hFile.write("#endif /* LOG_%s */\n"%(prefix,))
def setDefaulLevels(self):
self.hFile.write("""
/* Enable/Set log levels for '%s' - start */
/* If source file, or nxLog_Config.h has not set it, set these defines
*
* Do not #undef these values, rather set to 0/1. This way we can
* jump to definition and avoid plain-old-text-search to jump to
* undef. */
"""%(self.comp_name,))
prev_level = None
for level in LEVELS:
enable = "NX_LOG_ENABLE_%s_%s"%(self.comp_nameu, level)
default = "NX_LOG_ENABLE_%s_%s" %(self.parent_nameu, level)
self.hFile.write("#ifndef %s\n"%(enable,))
if prev_level:
prev_enable = "NX_LOG_ENABLE_%s_%s"%(self.comp_nameu, prev_level)
self.hFile.write("# define %s (%s + %s)\n"%
(enable, prev_enable, default))
else:
self.hFile.write("# define %s (%s)\n"%
(enable, default))
self.hFile.write("#endif\n")
prev_level = level
self.hFile.write("""
/* Enable/Set log levels for '%s' - end */
"""%(self.comp_name,))
def individualDefines(self):
for level in LEVELS:
prefix = level[0]
self.hFile.write("\n")
enable = "NX_LOG_ENABLE_%s_%s"%(self.comp_nameu, level)
self.hFile.write("#if %s\n"%(enable,))
self.hFile.write("# define LOG_%s_ENABLED 1\n"%(level,))
self.hFile.write("# define LOG_%s(format, ...) \\\n"%(prefix))
self.hFile.write(" nLog(\"%s\", NX_LEVEL_%s, "%
(self.comp_name, level))
self.hFile.write("format, ##__VA_ARGS__)\n")
for bit_width in BIT_WIDTH:
self.hFile.write("# define LOG_X%d_%s(VALUE) \\\n"%(bit_width, prefix,))
self.hFile.write(" nLog(\"%s\", NX_LEVEL_%s, \"%%s=0x%%0%dX\",#VALUE, VALUE)\n"%
(self.comp_name, level, bit_width/4))
self.hFile.write("# define LOG_U%d_%s(VALUE) \\\n"%(bit_width, prefix,))
self.hFile.write(" nLog(\"%s\", NX_LEVEL_%s, \"%%s=%%u\",#VALUE, VALUE)\n"%
(self.comp_name, level))
for bit_width in BIT_WIDTH[:1]:
self.hFile.write("# define LOG_AU%d_%s(ARRAY,LEN) \\\n"%(bit_width,prefix))
self.hFile.write(" nLog_au8(\"%s\", NX_LEVEL_%s, #ARRAY, ARRAY, LEN)\n"%
(self.comp_name, level))
self.hFile.write("# define LOG_MAU%d_%s(MESSAGE, ARRAY,LEN) \\\n"%(bit_width,prefix))
self.hFile.write(" nLog_au8(\"%s\", NX_LEVEL_%s, MESSAGE, ARRAY, LEN)\n"%
(self.comp_name, level))
self.hFile.write("#else\n")
self.hFile.write("# define LOG_%s_ENABLED 0\n"%(level,))
self.hFile.write("# define LOG_%s(...)\n"%(prefix))
for bit_width in BIT_WIDTH:
self.hFile.write("# define LOG_X%d_%s(VALUE)\n"%(bit_width, prefix,))
self.hFile.write("# define LOG_U%d_%s(VALUE)\n"%(bit_width, prefix,))
for bit_width in BIT_WIDTH[:1]:
self.hFile.write("# define LOG_AU%d_%s(ARRAY, LEN)\n"%(bit_width,prefix))
self.hFile.write("# define LOG_MAU%d_%s(MESSAGE, ARRAY, LEN)\n"%(bit_width,prefix))
self.hFile.write("#endif\n")
def endHeaderGuard(self):
self.hFile.write("\n")
self.hFile.write("/* clang-format on */\n")
self.hFile.write("\n")
self.hFile.write("#endif /* NX_LOG_%s_H */\n" % self.comp_nameu)
def close(self):
self.hFile.close()
def doGenerate(comp_name, parent_name = "default"):
g = nxLogHGenerator(comp_name, parent_name)
g.run()
g.close()
def usage():
print("Usage Error!")
def main():
if 2 == len(sys.argv):
doGenerate(sys.argv[1])
elif 3 == len(sys.argv):
doGenerate(sys.argv[1], sys.argv[2])
else:
usage()
if __name__ == '__main__':
main()