blob: c0047bd8eaf39bddc9007ecffbd3065c3a44175c [file] [log] [blame]
Norman James26072c02015-08-25 07:14:29 -05001#include <stdint.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5#include <fcntl.h>
6#include <unistd.h>
7#include <sys/stat.h>
8#include <sys/mman.h>
Norman Jamesce46e3e2015-08-30 22:25:55 -05009#include "interfaces/control.h"
Norman James10ff6a32015-08-27 14:24:17 -050010#include "openbmc.h"
11#include "gpio.h"
Norman Jamese2765102015-08-19 22:00:55 -050012
13/* ---------------------------------------------------------------------------------------------------- */
Norman James26072c02015-08-25 07:14:29 -050014static const gchar* dbus_object_path = "/org/openbmc/control/Power";
15static const gchar* dbus_name = "org.openbmc.control.Power";
16
Norman James3f97c5d2015-08-26 17:44:14 -050017GPIO power_pin = (GPIO){ "POWER_PIN" };
18GPIO pgood = (GPIO){ "PGOOD" };
Norman Jamese2765102015-08-19 22:00:55 -050019
20static GDBusObjectManagerServer *manager = NULL;
Norman Jamese2765102015-08-19 22:00:55 -050021
Norman Jamesce46e3e2015-08-30 22:25:55 -050022static gboolean poll_pgood(gpointer user_data)
23{
24 ControlPower *control_power = object_get_control_power((Object*)user_data);
25 Control* control = object_get_control((Object*)user_data);
26 EventLog* event_log = object_get_event_log((Object*)user_data);
27 control_emit_heartbeat(control,dbus_name);
28
29 //if (pgood.fd >= 0)
30 //{
31 uint8_t gpio = gpio_read(&pgood);
32 //if changed, set property and emit signal
33 if (gpio != control_power_get_pgood(control_power))
34 {
35 control_power_set_pgood(control_power,gpio);
36 if (gpio==0)
37 {
38 control_power_emit_power_lost(control_power);
39 }
40 else
41 {
42 control_power_emit_power_good(control_power);
43 }
44 }
45 //}
46 //else
47 //{
48 //TODO: error handling
49 /* GVariantBuilder *b;
50 GVariant *dict;
51 b = g_variant_builder_new (G_VARIANT_TYPE ("a{ss}"));
52 g_variant_builder_add (b, "{ss}", "object",dbus_object_path);
53 g_variant_builder_add (b, "{ss}", "message", "Unable to read pgood gpio");
54 char buf[254];
55 sprintf(buf,"%s/gpio%d",pgood.dev,pgood.num);
56 g_variant_builder_add (b, "{ss}", "gpio",buf);
57
58 dict = g_variant_builder_end (b);
59 event_log_emit_event_log(event_log,dict);
60
61 }*/
62 return TRUE;
63}
64
65
66
Norman Jamese2765102015-08-19 22:00:55 -050067static gboolean
Norman James3f97c5d2015-08-26 17:44:14 -050068on_set_power_state (ControlPower *pwr,
Norman Jamese2765102015-08-19 22:00:55 -050069 GDBusMethodInvocation *invocation,
70 guint state,
71 gpointer user_data)
72{
Norman James3f97c5d2015-08-26 17:44:14 -050073 if (state > 1)
74 {
75 g_dbus_method_invocation_return_dbus_error (invocation,
76 "org.openbmc.ControlPower.Error.Failed",
77 "Invalid power state");
78 return TRUE;
79 }
80 if (state == control_power_get_state(pwr))
81 {
82 g_dbus_method_invocation_return_dbus_error (invocation,
83 "org.openbmc.ControlPower.Error.Failed",
84 "Power Control is already at requested state");
85 return TRUE;
86 }
Norman Jamese2765102015-08-19 22:00:55 -050087
Norman James3f97c5d2015-08-26 17:44:14 -050088 //go ahead and return from method call
89 control_power_complete_set_power_state(pwr,invocation);
90
91 g_print("Set power state: %d\n",state);
92 gpio_open(&power_pin);
93 gpio_write(&power_pin,!state);
94 gpio_close(&power_pin);
95
96 control_power_set_state(pwr,state);
97 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -050098}
99
100static gboolean
Norman James3f97c5d2015-08-26 17:44:14 -0500101on_get_power_state (ControlPower *pwr,
Norman Jamese2765102015-08-19 22:00:55 -0500102 GDBusMethodInvocation *invocation,
103 gpointer user_data)
104{
Norman James3f97c5d2015-08-26 17:44:14 -0500105 guint pgood = control_power_get_pgood(pwr);
106 control_power_complete_get_power_state(pwr,invocation,pgood);
107 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -0500108}
109
110static void
111on_bus_acquired (GDBusConnection *connection,
112 const gchar *name,
113 gpointer user_data)
114{
Norman James3f97c5d2015-08-26 17:44:14 -0500115 ObjectSkeleton *object;
116 g_print ("Acquired a message bus connection: %s\n",name);
Norman James10ff6a32015-08-27 14:24:17 -0500117 cmdline *cmd = user_data;
118 if (cmd->argc < 2)
119 {
120 g_print("No objects created. Put object name(s) on command line\n");
121 return;
122 }
123 manager = g_dbus_object_manager_server_new (dbus_object_path);
124 int i=0;
125 for (i=1;i<cmd->argc;i++)
126 {
127 gchar *s;
128 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
129 object = object_skeleton_new (s);
130 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -0500131
Norman James10ff6a32015-08-27 14:24:17 -0500132 ControlPower* control_power = control_power_skeleton_new ();
133 object_skeleton_set_control_power (object, control_power);
134 g_object_unref (control_power);
Norman Jamese2765102015-08-19 22:00:55 -0500135
Norman Jamesce46e3e2015-08-30 22:25:55 -0500136 Control* control = control_skeleton_new ();
137 object_skeleton_set_control (object, control);
138 g_object_unref (control);
139
140 EventLog* event_log = event_log_skeleton_new ();
141 object_skeleton_set_event_log (object, event_log);
142 g_object_unref (event_log);
143
Norman James10ff6a32015-08-27 14:24:17 -0500144 //define method callbacks here
145 g_signal_connect (control_power,
146 "handle-set-power-state",
147 G_CALLBACK (on_set_power_state),
148 NULL); /* user_data */
Norman Jamese2765102015-08-19 22:00:55 -0500149
Norman James10ff6a32015-08-27 14:24:17 -0500150 g_signal_connect (control_power,
151 "handle-get-power-state",
152 G_CALLBACK (on_get_power_state),
153 NULL); /* user_data */
Norman Jamese2765102015-08-19 22:00:55 -0500154
Norman Jamesce46e3e2015-08-30 22:25:55 -0500155 g_timeout_add(5000, poll_pgood, object);
156
Norman James10ff6a32015-08-27 14:24:17 -0500157 /* Export the object (@manager takes its own reference to @object) */
158 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
159 g_object_unref (object);
160 }
Norman James3f97c5d2015-08-26 17:44:14 -0500161 /* Export all objects */
162 g_dbus_object_manager_server_set_connection (manager, connection);
163
164 // get gpio device paths
165 gpio_init(connection,&power_pin);
166 gpio_init(connection,&pgood);
167 gpio_open(&pgood);
Norman Jamese2765102015-08-19 22:00:55 -0500168}
169
170static void
171on_name_acquired (GDBusConnection *connection,
172 const gchar *name,
173 gpointer user_data)
174{
175 g_print ("Acquired the name %s\n", name);
176}
177
178static void
179on_name_lost (GDBusConnection *connection,
180 const gchar *name,
181 gpointer user_data)
182{
183 g_print ("Lost the name %s\n", name);
184}
185
Norman Jamese2765102015-08-19 22:00:55 -0500186
Norman James3f97c5d2015-08-26 17:44:14 -0500187
188
189/*----------------------------------------------------------------*/
190/* Main Event Loop */
191
Norman Jamese2765102015-08-19 22:00:55 -0500192gint
193main (gint argc, gchar *argv[])
194{
195 GMainLoop *loop;
Norman James90caa3c2015-08-27 21:28:48 -0500196 cmdline cmd;
197 cmd.argc = argc;
198 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500199
200 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500201 loop = g_main_loop_new (NULL, FALSE);
202
203 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500204 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500205 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
206 G_BUS_NAME_OWNER_FLAGS_REPLACE,
207 on_bus_acquired,
208 on_name_acquired,
209 on_name_lost,
Norman James90caa3c2015-08-27 21:28:48 -0500210 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500211 NULL);
212
Norman Jamesce46e3e2015-08-30 22:25:55 -0500213 g_main_loop_run (loop);
Norman Jamese2765102015-08-19 22:00:55 -0500214
215 g_bus_unown_name (id);
216 g_main_loop_unref (loop);
217 return 0;
218}