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) */