diff options
-rwxr-xr-x | scripts/sensor_gen.py | 60 | ||||
-rw-r--r-- | scripts/writesensor.mako.cpp | 54 | ||||
-rw-r--r-- | types.hpp | 48 |
3 files changed, 162 insertions, 0 deletions
diff --git a/scripts/sensor_gen.py b/scripts/sensor_gen.py new file mode 100755 index 0000000..822a00a --- /dev/null +++ b/scripts/sensor_gen.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +import os +import sys +import yaml +import argparse +from mako.template import Template + + +def generate_cpp(sensor_yaml, output_dir): + with open(os.path.join(script_dir, sensor_yaml), 'r') as f: + ifile = yaml.safe_load(f) + if not isinstance(ifile, dict): + ifile = {} + + # Render the mako template + + t = Template(filename=os.path.join( + script_dir, + "writesensor.mako.cpp")) + + output_cpp = os.path.join(output_dir, "sensor-gen.cpp") + with open(output_cpp, 'w') as fd: + fd.write(t.render(sensorDict=ifile)) + + +def main(): + + valid_commands = { + 'generate-cpp': generate_cpp + } + parser = argparse.ArgumentParser( + description="IPMI Sensor parser and code generator") + + parser.add_argument( + '-i', '--sensor_yaml', dest='sensor_yaml', + default='example.yaml', help='input sensor yaml file to parse') + + parser.add_argument( + "-o", "--output-dir", dest="outputdir", + default=".", + help="output directory") + + parser.add_argument( + 'command', metavar='COMMAND', type=str, + choices=valid_commands.keys(), + help='Command to run.') + + args = parser.parse_args() + + if (not (os.path.isfile(os.path.join(script_dir, args.sensor_yaml)))): + sys.exit("Can not find input yaml file " + args.sensor_yaml) + + function = valid_commands[args.command] + function(args.sensor_yaml, args.outputdir) + + +if __name__ == '__main__': + script_dir = os.path.dirname(os.path.realpath(__file__)) + main() diff --git a/scripts/writesensor.mako.cpp b/scripts/writesensor.mako.cpp new file mode 100644 index 0000000..0b8d5f1 --- /dev/null +++ b/scripts/writesensor.mako.cpp @@ -0,0 +1,54 @@ +## This file is a template. The comment below is emitted +## into the rendered file; feel free to edit this file. + +// !!! WARNING: This is a GENERATED Code..Please do NOT Edit !!! + +#include "types.hpp" +using namespace ipmi::sensor; + +extern const IdInfoMap sensors = { +% for key in sensorDict.iterkeys(): + % if key: +{${key},{ +<% + sensor = sensorDict[key] + interfaces = sensor["interfaces"] + path = sensor["path"] + sensorType = sensor["sensorType"] + readingType = sensor["sensorReadingType"] +%> + ${sensorType},"${path}",${readingType},{ + % for interface,properties in interfaces.iteritems(): + {"${interface}",{ + % for dbus_property,property_value in properties.iteritems(): + {"${dbus_property}",{ + % for offset,values in property_value.iteritems(): + { ${offset},{ +<% + valueType = values["type"] +%> + % for name,value in values.iteritems(): + % if name == "type": +<% + continue +%> + % endif + % if valueType == "string": + std::string("${value}"), + % else: + ${value}, + % endif + % endfor + } + }, + % endfor + }}, + % endfor + }}, + % endfor + } +}}, + % endif +% endfor +}; + diff --git a/types.hpp b/types.hpp new file mode 100644 index 0000000..d8a1386 --- /dev/null +++ b/types.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include <stdint.h> + +#include <map> +#include <string> + +#include <sdbusplus/server.hpp> + +namespace ipmi +{ +namespace sensor +{ + +using Offset = uint8_t; +using Value = sdbusplus::message::variant<bool, int64_t, std::string>; + +struct Values +{ + Value assert; + Value deassert; +}; + +using OffsetValueMap = std::map<Offset,Values>; + +using DbusProperty = std::string; +using DbusPropertyMap = std::map<DbusProperty,OffsetValueMap>; + +using DbusInterface = std::string; +using DbusInterfaceMap = std::map<DbusInterface,DbusPropertyMap>; + +using InstancePath = std::string; +using Type = uint8_t; +using ReadingType = uint8_t; + +struct Info +{ + Type sensorType; + InstancePath sensorPath; + ReadingType sensorReadingType; + DbusInterfaceMap sensorInterfaces; +}; + +using Id = uint8_t; +using IdInfoMap = std::map<Id,Info>; + +}//namespce sensor +}//namespace ipmi |