interface: enable property-changed signals

Change-Id: I5a46fe2d948ddc6c1b86dd6f898b814767802054
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/sdbusplus/server/interface.hpp b/sdbusplus/server/interface.hpp
index e3a2059..db956e8 100644
--- a/sdbusplus/server/interface.hpp
+++ b/sdbusplus/server/interface.hpp
@@ -80,6 +80,16 @@
         return _bus.new_signal(_path.c_str(), _interf.c_str(), member);
     }
 
+    /** @brief Broadcast a property changed signal.
+     *
+     *  @param[in] property - The property which changed.
+     */
+    void property_changed(const char* property)
+    {
+        sd_bus_emit_properties_changed(_bus.get(), _path.c_str(),
+                                       _interf.c_str(), property, nullptr);
+    }
+
     bus::bus& bus() { return _bus; }
     const std::string& path() { return _path; }
 
diff --git a/tools/templates/interface.mako.server.cpp b/tools/templates/interface.mako.server.cpp
index cb4ca29..2a5c497 100644
--- a/tools/templates/interface.mako.server.cpp
+++ b/tools/templates/interface.mako.server.cpp
@@ -3,6 +3,9 @@
     <%
         namespaces = interface.name.split('.')
         classname = namespaces.pop()
+
+        def interface_instance():
+            return "_".join(interface.name.split('.') + ['interface'])
     %>
 namespace sdbusplus
 {
@@ -14,7 +17,7 @@
     % endfor
 
 ${classname}::${classname}(bus::bus& bus, const char* path)
-        : _${"_".join(interface.name.split('.'))}_interface(
+        : _${interface_instance()}(
                 bus, path, _interface, _vtable, this)
 {
 }
@@ -48,7 +51,11 @@
 
 ${p.typeName} ${classname}::${p.camelCase}(${p.typeName} value)
 {
-    _${p.camelCase} = value;
+    if (_${p.camelCase} != value)
+    {
+        _${p.camelCase} = value;
+        _${interface_instance()}.property_changed("${p.name}");
+    }
 
     return _${p.camelCase};
 }
@@ -93,7 +100,8 @@
                      details::${classname}::_property_${p.name}
                         .data(),
                      _callback_get_${p.name},
-                     _callback_set_${p.name}),
+                     _callback_set_${p.name},
+                     vtable::property_::emits_change),
     % endfor
     vtable::end()
 };