lots of changes
diff --git a/objects/pcie_slot_present_obj.c b/objects/pcie_slot_present_obj.c
new file mode 100644
index 0000000..8105f6f
--- /dev/null
+++ b/objects/pcie_slot_present_obj.c
@@ -0,0 +1,168 @@
+#include "interfaces/openbmc_intf.h"
+#include "openbmc.h"
+#include "gpio.h"
+#define NUM_SLOTS 8
+GPIO slots[NUM_SLOTS] = {
+ { "SLOT0_RISER_PRESENT" },
+ { "SLOT1_RISER_PRESENT" },
+ { "SLOT2_RISER_PRESENT" },
+ { "SLOT0_PRESENT" },
+ { "SLOT1_PRESENT" },
+ { "SLOT2_PRESENT" },
+ { "MEZZ0_PRESENT" },
+ { "MEZZ1_PRESENT" },
+};
+
+typedef struct {
+ const char* bus_name;
+ const char* path;
+} object_info;
+
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+int get_object(GDBusProxy *proxy, GPIO* gpio, object_info* obj_info)
+{
+ g_print("Here: %s\n",gpio->name);
+ GError *error;
+ GVariant *parm;
+ GVariant *result;
+
+ error = NULL;
+ parm = g_variant_new("(ss)","GPIO_PRESENT",gpio->name);
+ result = g_dbus_proxy_call_sync (proxy,
+ "getObjectFromId",
+ parm,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ const gchar* bus_name;
+ const gchar* obj_path;
+ gsize bus_name_size;
+ gsize obj_path_size;
+ GVariantIter *iter = g_variant_iter_new(result);
+ GVariant* dict = g_variant_iter_next_value(iter);
+
+ GVariant* b = g_variant_lookup_value(dict,"bus_name",(const GVariantType *) "s");
+ bus_name = g_variant_get_string(b,&bus_name_size);
+ GVariant* o = g_variant_lookup_value(dict,"obj_path",(const GVariantType *) "s");
+ obj_path = g_variant_get_string(o,&obj_path_size);
+
+ int rc = 0;
+ if (bus_name_size == 0 || obj_path_size == 0) {
+ g_print("ERROR: gpio %s not found in lookup\n",gpio->name);
+ rc = 1;
+
+ } else {
+ obj_info->bus_name = bus_name;
+ obj_info->path = obj_path;
+ }
+ g_variant_unref(b);
+ g_variant_unref(o);
+ g_variant_unref(dict);
+ g_variant_unref(result);
+
+ return rc;
+}
+
+int get_presence(GDBusConnection* connection, GPIO* gpio, uint8_t* present)
+{
+ int rc = GPIO_OK;
+ do {
+ rc = gpio_init(connection,gpio);
+ if (rc != GPIO_OK) { break; }
+ uint8_t gpio_val;
+ rc = gpio_open(gpio);
+ if (rc != GPIO_OK) { break; }
+ rc = gpio_read(gpio,&gpio_val);
+ if (rc != GPIO_OK) { gpio_close(gpio); break; }
+ gpio_close(gpio);
+ *present = gpio_val;
+ } while(0);
+ if (rc != GPIO_OK)
+ {
+ g_print("ERROR: gpio error %s\n",gpio->name);
+ }
+ return rc;
+}
+
+void update_fru_obj(GDBusConnection* connection, object_info* obj_info, uint8_t state)
+{
+ GDBusProxy *proxy;
+ GError *error;
+ GVariant *parm;
+ GVariant *result;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_sync (connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo* */
+ obj_info->bus_name, /* name */
+ obj_info->path, /* object path */
+ "org.openbmc.SensorValue", /* interface name */
+ NULL, /* GCancellable */
+ &error);
+ g_assert_no_error (error);
+
+ error = NULL;
+ parm = g_variant_new("(y)",state);
+
+ result = g_dbus_proxy_call_sync (proxy,
+ "setValue",
+ parm,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+
+ g_assert_no_error (error);
+}
+
+gint
+main (gint argc, gchar *argv[])
+{
+ GMainLoop *loop;
+ GDBusConnection *c;
+ GDBusProxy *sys_proxy;
+ GError *error;
+ GVariant *parm;
+ GVariant *result;
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ error = NULL;
+ c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+
+ error = NULL;
+ sys_proxy = g_dbus_proxy_new_sync (c,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo* */
+ "org.openbmc.managers.System", /* name */
+ "/org/openbmc/managers/System", /* object path */
+ "org.openbmc.managers.System", /* interface name */
+ NULL, /* GCancellable */
+ &error);
+ g_assert_no_error (error);
+
+ int i = 0;
+ int rc = 0;
+ for (i=0;i<NUM_SLOTS;i++)
+ {
+ object_info obj_info;
+ uint8_t present;
+ do {
+ rc = get_object(sys_proxy,&slots[i],&obj_info);
+ if (rc) { break; }
+ rc = get_presence(c,&slots[i],&present);
+ if (rc) { break; }
+ // TODO: send correct state
+ update_fru_obj(c,&obj_info,present);
+ } while(0);
+ }
+
+ g_object_unref(c);
+ g_main_loop_unref (loop);
+ return 0;
+}