xref: /openbmc/phosphor-host-ipmid/scripts/writesensor.cpp.mako (revision c84add583a4989f2c1f4b950a0a204111afd3723)
1## This file is a template.  The comment below is emitted
2## into the rendered file; feel free to edit this file.
3// !!! WARNING: This is a GENERATED Code..Please do NOT Edit !!!
4<%
5interfaceDict = {}
6sensorNameMaxLength = 16
7%>\
8%for key in sensorDict.keys():
9<%
10    sensor = sensorDict[key]
11    serviceInterface = sensor["serviceInterface"]
12    if serviceInterface == "org.freedesktop.DBus.Properties":
13        updateFunc = "set::"
14        getFunc = "get::"
15    elif serviceInterface == "xyz.openbmc_project.Inventory.Manager":
16        updateFunc = "notify::"
17        getFunc = "inventory::get::"
18    else:
19        assert "Un-supported interface: " + serviceInterface
20    endif
21    if serviceInterface not in interfaceDict:
22        interfaceDict[serviceInterface] = {}
23        interfaceDict[serviceInterface]["updateFunc"] = updateFunc
24        interfaceDict[serviceInterface]["getFunc"] = getFunc
25%>\
26% endfor
27
28#include "sensordatahandler.hpp"
29
30#include <ipmid/types.hpp>
31
32namespace ipmi {
33namespace sensor {
34
35extern const IdInfoMap __attribute__((init_priority(101))) sensors = {
36% for key in sensorDict.keys():
37   % if key:
38{${key},{
39<%
40       sensor = sensorDict[key]
41       interfaces = sensor["interfaces"]
42       path = sensor["path"]
43       serviceInterface = sensor["serviceInterface"]
44       sensorType = sensor["sensorType"]
45       entityID = sensor.get("entityID", 0)
46       instance = sensor.get("entityInstance", 0)
47       readingType = sensor["sensorReadingType"]
48       multiplier = sensor.get("multiplierM", 1)
49       offsetB = sensor.get("offsetB", 0)
50       bExp = sensor.get("bExp", 0)
51       rExp = sensor.get("rExp", 0)
52       sensorUnits1 = sensor.get("sensorUnits1", 0)
53       unit = sensor.get("unit", "")
54       scale = sensor.get("scale", 0)
55       hasScale = "true" if "scale" in sensor.keys() else "false"
56       valueReadingType = sensor["readingType"]
57       updateFunc = interfaceDict[serviceInterface]["updateFunc"]
58       updateFunc += sensor["readingType"]
59       getFunc = interfaceDict[serviceInterface]["getFunc"]
60       getFunc += sensor["readingType"]
61       sensorName = sensor.get("sensorName", None)
62       if sensorName:
63           assert len(sensorName) <= sensorNameMaxLength, \
64                   "sensor name '%s' is too long (%d bytes max)" % \
65                   (sensorName, sensorNameMaxLength)
66       else:
67           sensorNameFunc = "get::" + sensor.get("sensorNamePattern",
68                   "nameLeaf")
69
70       if "readingAssertion" == valueReadingType or "readingData" == valueReadingType:
71           for interface,properties in interfaces.items():
72               for dbus_property,property_value in properties.items():
73                   for offset,values in property_value["Offsets"].items():
74                       valueType = values["type"]
75           updateFunc = "set::" + valueReadingType + "<" + valueType + ">"
76           getFunc = "get::" + valueReadingType + "<" + valueType + ">"
77       sensorInterface = serviceInterface
78       if serviceInterface == "org.freedesktop.DBus.Properties":
79           sensorInterface = next(iter(interfaces))
80       mutability = sensor.get("mutability", "Mutability::Read")
81%>
82        .entityType = ${entityID},
83        .instance = ${instance},
84        .sensorType = ${sensorType},
85        .sensorPath = "${path}",
86        .sensorInterface = "${sensorInterface}",
87        .sensorReadingType = ${readingType},
88        .coefficientM = ${multiplier},
89        .coefficientB = ${offsetB},
90        .exponentB = ${bExp},
91        .scaledOffset = ${offsetB * pow(10,bExp)},
92        .exponentR = ${rExp},
93        .hasScale = ${hasScale},
94        .scale = ${scale},
95        .sensorUnits1 = ${sensorUnits1},
96        .unit = "${unit}",
97        .updateFunc = ${updateFunc},
98        .getFunc = ${getFunc},
99        .mutability = Mutability(${mutability}),
100    % if sensorName:
101        .sensorName = "${sensorName}",
102        .sensorNameFunc = nullptr,
103    % else:
104        .sensorName = "",
105        .sensorNameFunc = ${sensorNameFunc},
106    % endif
107        .propertyInterfaces = {
108    % for interface,properties in interfaces.items():
109            {"${interface}",{
110            % if properties:
111                % for dbus_property,property_value in properties.items():
112                    {"${dbus_property}",{
113<%
114try:
115    preReq = property_value["Prereqs"]
116except KeyError:
117    preReq = dict()
118%>\
119                    {
120                        % for preOffset,preValues in preReq.items():
121                        { ${preOffset},{
122                            % for name,value in preValues.items():
123                                % if name == "type":
124<%                              continue %>\
125                                % endif
126<%                          value = str(value).lower() %>\
127                                ${value},
128                            % endfor
129                            }
130                        },
131                        % endfor
132                    },
133                    {
134                    % for offset,values in property_value["Offsets"].items():
135                        { ${offset},{
136                            % if offset == 0xFF:
137                                }},
138<%                          continue %>\
139                            % endif
140<%                          valueType = values["type"] %>\
141<%
142try:
143    skip = values["skipOn"]
144    if skip == "assert":
145        skipVal = "SkipAssertion::ASSERT"
146    elif skip == "deassert":
147        skipVal = "SkipAssertion::DEASSERT"
148    else:
149        assert "Unknown skip value " + str(skip)
150except KeyError:
151    skipVal = "SkipAssertion::NONE"
152%>\
153                                ${skipVal},
154                        % for name,value in values.items():
155                            % if name == "type" or name == "skipOn":
156<%                          continue %>\
157                            % endif
158                            % if valueType == "string":
159                            std::string("${value}"),
160                            % elif valueType == "bool":
161<%                         value = str(value).lower() %>\
162                            ${value},
163                            % else:
164                            ${value},
165                            % endif
166                        % endfor
167                            }
168                        },
169                    % endfor
170                    }}},
171                % endfor
172            % endif
173            }},
174    % endfor
175     },
176}},
177   % endif
178% endfor
179};
180
181} // namespace sensor
182} // namespace ipmi
183