lots of changes
diff --git a/objects/button_power_obj.c b/objects/button_power_obj.c
index 4cd9b8d..33cd466 100644
--- a/objects/button_power_obj.c
+++ b/objects/button_power_obj.c
@@ -8,6 +8,9 @@
 

 static GDBusObjectManagerServer *manager = NULL;

 

+//This object will use these GPIOs

+GPIO button    = (GPIO){ "POWER_BUTTON" };

+

 static gboolean

 on_is_on       (Button          *btn,

                 GDBusMethodInvocation  *invocation,

@@ -20,15 +23,13 @@
 }

 

 static gboolean

-on_sim_button_press       (Button          *btn,

+on_button_press       (Button          *btn,

                 GDBusMethodInvocation  *invocation,

                 gpointer                user_data)

 {

-  g_print("Simulating button pressed\n");

-  button_emit_button_pressed(btn);

-  button_complete_sim_button_press(btn,invocation);

-  return TRUE;

-

+	button_emit_button_pressed(btn);

+	button_complete_sim_button_press(btn,invocation);

+	return TRUE;

 }

 

 static void 

@@ -64,9 +65,11 @@
                     NULL); /* user_data */

 		g_signal_connect (button,

                     "handle-sim-button-press",

-                    G_CALLBACK (on_sim_button_press),

+                    G_CALLBACK (on_button_press),

                     NULL); /* user_data */

 

+		

+

 		/* Export the object (@manager takes its own reference to @object) */

 		g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));

 		g_object_unref (object);

diff --git a/objects/chassis_identify_obj.c b/objects/chassis_identify_obj.c
index a747d36..4a66515 100644
--- a/objects/chassis_identify_obj.c
+++ b/objects/chassis_identify_obj.c
@@ -17,9 +17,18 @@
 {

 	g_print("Turn on chassis identify led\n");

 	led_complete_set_on(led,invocation);

-	gpio_open(&led_gpio);

-	gpio_write(&led_gpio,1); 

+	int rc = GPIO_OK;

+	do {

+		rc = gpio_open(&led_gpio);

+		if (rc != GPIO_OK) { break; }

+		rc = gpio_write(&led_gpio,1); 

+		if (rc != GPIO_OK) { break; }

+	} while(0);

 	gpio_close(&led_gpio);

+	if (rc != GPIO_OK)

+	{

+		g_print("GPIO Error: %d\n",rc);

+	}

 

 	return TRUE;

 

@@ -32,10 +41,18 @@
 {

 	g_print("Turn off chassis identify led\n");

 	led_complete_set_off(led,invocation);

-	gpio_open(&led_gpio);

-	gpio_write(&led_gpio,0); 

+	int rc = GPIO_OK;

+	do {

+		rc = gpio_open(&led_gpio);

+		if (rc != GPIO_OK) { break; }

+		rc = gpio_write(&led_gpio,0); 

+		if (rc != GPIO_OK) { break; }

+	} while(0);

 	gpio_close(&led_gpio);

-

+	if (rc != GPIO_OK)

+	{

+		g_print("GPIO Error: %d\n",rc);

+	}

 	return TRUE;

 }

 

@@ -46,7 +63,6 @@
 {

 	ObjectSkeleton *object;

 

-	//g_print ("Acquired a message bus connection: %s\n",name);

 	cmdline *cmd = user_data;

 	if (cmd->argc < 2)

 	{

@@ -95,7 +111,6 @@
                   const gchar     *name,

                   gpointer         user_data)

 {

-  //g_print ("Acquired the name %s\n", name);

 }

 

 static void

@@ -103,7 +118,6 @@
               const gchar     *name,

               gpointer         user_data)

 {

- // g_print ("Lost the name %s\n", name);

 }

 

 

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;

+}

diff --git a/objects/power_control_obj.c b/objects/power_control_obj.c
index bb0eaec..481c0d7 100644
--- a/objects/power_control_obj.c
+++ b/objects/power_control_obj.c
@@ -76,10 +76,8 @@
 		}

 	} else {

 		event_log_emit_event_log(event_log, LOG_ALERT, "GPIO read error",rc);

-		//return FALSE;

 	}

 	//pgood is not at desired state yet

-	//g_print("GPIO: %d;  %d\n",gpio,control_power_get_state(control_power));

 	if (gpio != control_power_get_state(control_power) &&

 		control_power_get_pgood_timeout(control_power) > 0)

 	{

@@ -120,22 +118,19 @@
 	}

 	else

 	{

-		g_print("Set power state: %d\n",state);

-		//temporary until real hardware works

-		//tmp_pgood = state;

 		int error = 0;

 		do {

+			if (state == 1) {

+				control_emit_goto_system_state(control,"POWERING_ON");

+			} else {

+				control_emit_goto_system_state(control,"POWERING_OFF");

+			}

 			error = gpio_open(&power_pin);

 			if (error != GPIO_OK) { break;	}

 			error = gpio_write(&power_pin,!state);

 			if (error != GPIO_OK) { break;	}

 			gpio_close(&power_pin);

 			control_power_set_state(pwr,state);

-			if (state == 1) {

-				control_emit_goto_system_state(control,"POWERING_ON");

-			} else {

-				control_emit_goto_system_state(control,"POWERING_OFF");

-			}

 		} while(0);

 		if (error != GPIO_OK)

 		{

diff --git a/objects/sensor_host_status_obj.c b/objects/sensor_host_status_obj.c
index 05e02b2..825117a 100644
--- a/objects/sensor_host_status_obj.c
+++ b/objects/sensor_host_status_obj.c
@@ -27,41 +27,31 @@
 	control_complete_init(control,invocation);

 	return TRUE;

 }

-

-static void

-on_set_ipmi (GDBusConnection* connection,

-               const gchar* sender_name,

-               const gchar* object_path,

-               const gchar* interface_name,

-               const gchar* signal_name,

-               GVariant* parameters,

-               gpointer user_data) 

+static gboolean

+on_set_value    (SensorValue *sen,

+                GDBusMethodInvocation  *invocation,

+		guchar                  host_status,

+                gpointer                user_data)

 {

+	SensorValue *v = object_get_sensor_value((Object*)user_data);

 	SensorMatch *match = object_get_sensor_match((Object*)user_data);

-	SensorValue *sen = object_get_sensor_value((Object*)user_data);

-	SensorIpmi *ipmi = object_get_sensor_ipmi((Object*)user_data);

 	Control* control = object_get_control((Object*)user_data);

 	

-	guchar sensor_id;

-	guchar host_status;

-	g_variant_get (parameters, "(yy)", &sensor_id,&host_status);

-	guchar my_sensor_id = sensor_ipmi_get_sensor_id(ipmi);

-	if (my_sensor_id == sensor_id)

+	GVariant *old_value = sensor_value_get_value(sen);

+	GVariant *value = NEW_VARIANT_B(host_status);

+	if (VARIANT_COMPARE(old_value,value) != 0)

 	{

-		GVariant *old_value = sensor_value_get_value(sen);

-		GVariant *value = NEW_VARIANT_B(host_status);

-		if (VARIANT_COMPARE(old_value,value) != 0)

+		sensor_value_set_value(sen, value);

+		sensor_value_emit_changed(sen, value, "");

+		if (host_status == BOOTED)

 		{

-			sensor_value_set_value(sen, value);

-			sensor_value_emit_changed(sen, value, "");

-			if (host_status == BOOTED)

-			{

-				sensor_match_set_state(match,host_status);

-				sensor_match_emit_sensor_match(match,host_status);

-				control_emit_goto_system_state(control,"BOOTED");

-			}

+			sensor_match_set_state(match,host_status);

+			sensor_match_emit_sensor_match(match,host_status);

+			control_emit_goto_system_state(control,"BOOTED");

 		}

 	}

+	sensor_value_complete_set_value(sen,invocation);

+	return TRUE;

 }

 

 static void 

@@ -94,10 +84,6 @@
   		object_skeleton_set_sensor_match (object, match);

   		g_object_unref (match);

 

-		SensorIpmi *ipmi = sensor_ipmi_skeleton_new ();

-  		object_skeleton_set_sensor_ipmi (object, ipmi);

-  		g_object_unref (ipmi);

-

 		Control *control = control_skeleton_new ();

   		object_skeleton_set_control (object, control);

   		g_object_unref (control);

@@ -113,7 +99,7 @@
 		sensor_value_emit_changed(sensor,v,"");

 

 		//signal handlers

-		g_dbus_connection_signal_subscribe(connection,

+		/*g_dbus_connection_signal_subscribe(connection,

                                    "org.openbmc.sensors.IpmiBt",

                                    "org.openbmc.sensors.IpmiBt",

                                    "SetSensor",

@@ -123,6 +109,7 @@
                                    (GDBusSignalCallback) on_set_ipmi,

                                    object,

                                    NULL );

+		*/

   		//define method callbacks here

   		g_signal_connect (sensor,

                     "handle-init",

@@ -134,10 +121,10 @@
                     G_CALLBACK (on_init_control),

                     NULL); /* user_data */

 

-		//g_signal_connect (sensor,

-                  //  "handle-set-value",

-                  //  G_CALLBACK (on_set_value),

-                  //  object); /* user_data */

+		g_signal_connect (sensor,

+                    "handle-set-value",

+                    G_CALLBACK (on_set_value),

+                    object); /* user_data */

 

 

   		/* Export the object (@manager takes its own reference to @object) */