blob: 4a66515a44c4e0a87f4f9cdbc0d4fdabdd4f409f [file] [log] [blame]
Norman James362a80f2015-09-14 14:04:39 -05001#include "interfaces/openbmc_intf.h"
Norman James10ff6a32015-08-27 14:24:17 -05002#include "openbmc.h"
3#include "gpio.h"
Norman Jamese2765102015-08-19 22:00:55 -05004
5/* ---------------------------------------------------------------------------------------------------- */
Norman James362a80f2015-09-14 14:04:39 -05006static const gchar* dbus_object_path = "/org/openbmc/leds";
Norman James3f97c5d2015-08-26 17:44:14 -05007static const gchar* dbus_name = "org.openbmc.leds.ChassisIdentify";
Norman Jamese2765102015-08-19 22:00:55 -05008
9static GDBusObjectManagerServer *manager = NULL;
Norman James10ff6a32015-08-27 14:24:17 -050010
11GPIO led_gpio = (GPIO){"IDENTIFY"};
Norman Jamese2765102015-08-19 22:00:55 -050012
13static gboolean
14on_set_on (Led *led,
15 GDBusMethodInvocation *invocation,
16 gpointer user_data)
17{
Norman James10ff6a32015-08-27 14:24:17 -050018 g_print("Turn on chassis identify led\n");
19 led_complete_set_on(led,invocation);
Norman James19e45912015-10-04 20:19:41 -050020 int rc = GPIO_OK;
21 do {
22 rc = gpio_open(&led_gpio);
23 if (rc != GPIO_OK) { break; }
24 rc = gpio_write(&led_gpio,1);
25 if (rc != GPIO_OK) { break; }
26 } while(0);
Norman James10ff6a32015-08-27 14:24:17 -050027 gpio_close(&led_gpio);
Norman James19e45912015-10-04 20:19:41 -050028 if (rc != GPIO_OK)
29 {
30 g_print("GPIO Error: %d\n",rc);
31 }
Norman James10ff6a32015-08-27 14:24:17 -050032
33 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -050034
35}
36
37static gboolean
38on_set_off (Led *led,
39 GDBusMethodInvocation *invocation,
40 gpointer user_data)
41{
Norman James10ff6a32015-08-27 14:24:17 -050042 g_print("Turn off chassis identify led\n");
43 led_complete_set_off(led,invocation);
Norman James19e45912015-10-04 20:19:41 -050044 int rc = GPIO_OK;
45 do {
46 rc = gpio_open(&led_gpio);
47 if (rc != GPIO_OK) { break; }
48 rc = gpio_write(&led_gpio,0);
49 if (rc != GPIO_OK) { break; }
50 } while(0);
Norman James10ff6a32015-08-27 14:24:17 -050051 gpio_close(&led_gpio);
Norman James19e45912015-10-04 20:19:41 -050052 if (rc != GPIO_OK)
53 {
54 g_print("GPIO Error: %d\n",rc);
55 }
Norman James10ff6a32015-08-27 14:24:17 -050056 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -050057}
58
59static void
60on_bus_acquired (GDBusConnection *connection,
61 const gchar *name,
62 gpointer user_data)
63{
Norman James10ff6a32015-08-27 14:24:17 -050064 ObjectSkeleton *object;
Norman Jamese2765102015-08-19 22:00:55 -050065
Norman James10ff6a32015-08-27 14:24:17 -050066 cmdline *cmd = user_data;
67 if (cmd->argc < 2)
68 {
69 g_print("No objects created. Put object name(s) on command line\n");
70 return;
71 }
Norman Jamese2765102015-08-19 22:00:55 -050072
Norman James10ff6a32015-08-27 14:24:17 -050073 manager = g_dbus_object_manager_server_new (dbus_object_path);
74 int i = 0;
75 for (i=1;i<cmd->argc;i++)
76 {
77 gchar *s;
78 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
79 object = object_skeleton_new (s);
80 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -050081
Norman James10ff6a32015-08-27 14:24:17 -050082 Led *led = led_skeleton_new ();
83 object_skeleton_set_led (object, led);
84 g_object_unref (led);
Norman Jamese2765102015-08-19 22:00:55 -050085
Norman James10ff6a32015-08-27 14:24:17 -050086 //define method callbacks
87 g_signal_connect (led,
Norman Jamese2765102015-08-19 22:00:55 -050088 "handle-set-on",
89 G_CALLBACK (on_set_on),
90 NULL); /* user_data */
Norman James10ff6a32015-08-27 14:24:17 -050091 g_signal_connect (led,
Norman Jamese2765102015-08-19 22:00:55 -050092 "handle-set-off",
93 G_CALLBACK (on_set_off),
94 NULL);
95
Norman James10ff6a32015-08-27 14:24:17 -050096 led_set_color(led,0);
97 led_set_function(led,"CHASSIS_IDENTIFY");
Norman Jamese2765102015-08-19 22:00:55 -050098
Norman James10ff6a32015-08-27 14:24:17 -050099 /* Export the object (@manager takes its own reference to @object) */
100 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
101 g_object_unref (object);
102 }
103 /* Export all objects */
104 g_dbus_object_manager_server_set_connection (manager, connection);
105 gpio_init(connection,&led_gpio);
Norman Jamese2765102015-08-19 22:00:55 -0500106
Norman Jamese2765102015-08-19 22:00:55 -0500107}
108
109static void
110on_name_acquired (GDBusConnection *connection,
111 const gchar *name,
112 gpointer user_data)
113{
Norman Jamese2765102015-08-19 22:00:55 -0500114}
115
116static void
117on_name_lost (GDBusConnection *connection,
118 const gchar *name,
119 gpointer user_data)
120{
Norman Jamese2765102015-08-19 22:00:55 -0500121}
122
123
124gint
125main (gint argc, gchar *argv[])
126{
127 GMainLoop *loop;
Norman James952b38d2015-08-27 21:30:06 -0500128 cmdline cmd;
129 cmd.argc = argc;
130 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500131
132 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500133 loop = g_main_loop_new (NULL, FALSE);
134
135 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500136 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500137 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
138 G_BUS_NAME_OWNER_FLAGS_REPLACE,
139 on_bus_acquired,
140 on_name_acquired,
141 on_name_lost,
Norman James952b38d2015-08-27 21:30:06 -0500142 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500143 NULL);
144
145 g_main_loop_run (loop);
146
147 g_bus_unown_name (id);
148 g_main_loop_unref (loop);
149 return 0;
150}