blob: 03eab4063978420c70546567865b27067fdef39f [file] [log] [blame]
Norman Jamese2765102015-08-19 22:00:55 -05001#include "interfaces/power_control.h"
2
3/* ---------------------------------------------------------------------------------------------------- */
4
5static GDBusObjectManagerServer *manager = NULL;
6static PowerControl *power_control = NULL;
7
Norman Jamese2765102015-08-19 22:00:55 -05008static guint tmp_pgood = 0;
9
10static gboolean
11on_set_power_state (PowerControl *pwr,
12 GDBusMethodInvocation *invocation,
13 guint state,
14 gpointer user_data)
15{
16 if (state > 1)
17 {
18 g_dbus_method_invocation_return_dbus_error (invocation,
19 "org.openbmc.PowerControl.Error.Failed",
20 "Invalid power state");
21 return TRUE;
22 }
23 if (state == power_control_get_state(pwr))
24 {
25 g_dbus_method_invocation_return_dbus_error (invocation,
26 "org.openbmc.PowerControl.Error.Failed",
27 "Power Control is already at requested state");
28 return TRUE;
29 }
30
31 // TODO: Implement gpio toggling
32 g_print("Set power state: %d\n",state);
33 if (state==1)
34 {
35 g_print("Turn on\n");
36 tmp_pgood=1;
37 }
38 else
39 {
40 g_print("Turn off\n");
41 tmp_pgood=0;
42 }
43 power_control_set_state(pwr,state);
44 power_control_complete_set_power_state(pwr,invocation);
45 return TRUE;
46}
47
48static gboolean
49on_get_power_state (PowerControl *pwr,
50 GDBusMethodInvocation *invocation,
51 gpointer user_data)
52{
53 guint pgood = power_control_get_pgood(pwr);
54 power_control_complete_get_power_state(pwr,invocation,pgood);
55 return TRUE;
56}
57
58static void
59on_bus_acquired (GDBusConnection *connection,
60 const gchar *name,
61 gpointer user_data)
62{
63 ObjectSkeleton *object;
64 guint n;
65
66 g_print ("Acquired a message bus connection: %s\n",name);
67
68 manager = g_dbus_object_manager_server_new ("/org/openbmc/PowerControl");
69
70 gchar *s;
71 s = g_strdup_printf ("/org/openbmc/PowerControl/0");
72 object = object_skeleton_new (s);
73 g_free (s);
74
75 power_control = power_control_skeleton_new ();
76 object_skeleton_set_power_control (object, power_control);
77 g_object_unref (power_control);
78
79 //define method callbacks here
80 g_signal_connect (power_control,
81 "handle-set-power-state",
82 G_CALLBACK (on_set_power_state),
83 NULL); /* user_data */
84
85 g_signal_connect (power_control,
86 "handle-get-power-state",
87 G_CALLBACK (on_get_power_state),
88 NULL); /* user_data */
89
90 /* Export the object (@manager takes its own reference to @object) */
91 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
92 g_object_unref (object);
93
94 /* Export all objects */
95 g_dbus_object_manager_server_set_connection (manager, connection);
96}
97
98static void
99on_name_acquired (GDBusConnection *connection,
100 const gchar *name,
101 gpointer user_data)
102{
103 g_print ("Acquired the name %s\n", name);
104}
105
106static void
107on_name_lost (GDBusConnection *connection,
108 const gchar *name,
109 gpointer user_data)
110{
111 g_print ("Lost the name %s\n", name);
112}
113
114static gboolean
115poll_pgood()
116{
117 guint pgood = power_control_get_pgood(power_control);
118 //TOOD: Change to actually read gpio
119 guint gpio = tmp_pgood;
120
121 g_print("Polling pgood: %d\n",gpio);
122
123 //if changed, set property and emit signal
124 if (gpio != power_control_get_pgood(power_control))
125 {
126 power_control_set_pgood(power_control,gpio);
127 if (gpio==0)
128 {
129 power_control_emit_power_lost(power_control);
130 }
131 else
132 {
133 power_control_emit_power_good(power_control);
134 }
135 }
136 return TRUE;
137}
138
139gint
140main (gint argc, gchar *argv[])
141{
142 GMainLoop *loop;
143
144 guint id;
145 //g_type_init ();
146 loop = g_main_loop_new (NULL, FALSE);
147
148 id = g_bus_own_name (G_BUS_TYPE_SESSION,
149 "org.openbmc.PowerControl",
150 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
151 G_BUS_NAME_OWNER_FLAGS_REPLACE,
152 on_bus_acquired,
153 on_name_acquired,
154 on_name_lost,
155 loop,
156 NULL);
157
158 g_timeout_add(5000, poll_pgood, NULL);
159 g_main_loop_run (loop);
160
161 g_bus_unown_name (id);
162 g_main_loop_unref (loop);
163 return 0;
164}