blob: ce9144b75c8e3c01f258dc2ddd4c59455abb3f35 [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 }
Norman Jamesce46e3e2015-08-30 22:25:55 -050045 return TRUE;
46}
47
48
49
Norman Jamese2765102015-08-19 22:00:55 -050050static gboolean
Norman James3f97c5d2015-08-26 17:44:14 -050051on_set_power_state (ControlPower *pwr,
Norman Jamese2765102015-08-19 22:00:55 -050052 GDBusMethodInvocation *invocation,
53 guint state,
54 gpointer user_data)
55{
Norman James3f97c5d2015-08-26 17:44:14 -050056 if (state > 1)
57 {
58 g_dbus_method_invocation_return_dbus_error (invocation,
59 "org.openbmc.ControlPower.Error.Failed",
60 "Invalid power state");
61 return TRUE;
62 }
Norman James9e6acf92015-09-08 07:00:04 -050063 // return from method call
64 control_power_complete_set_power_state(pwr,invocation);
Norman James3f97c5d2015-08-26 17:44:14 -050065 if (state == control_power_get_state(pwr))
66 {
Norman James9e6acf92015-09-08 07:00:04 -050067 g_print("Power already at requested state: %d\n",state);
Norman James3f97c5d2015-08-26 17:44:14 -050068 }
Norman James9e6acf92015-09-08 07:00:04 -050069 else
70 {
71 g_print("Set power state: %d\n",state);
72 gpio_open(&power_pin);
73 gpio_write(&power_pin,!state);
74 gpio_close(&power_pin);
75 control_power_set_state(pwr,state);
76 }
77 return TRUE;
78}
Norman Jamese2765102015-08-19 22:00:55 -050079
Norman James9e6acf92015-09-08 07:00:04 -050080static gboolean
81on_init (Control *control,
82 GDBusMethodInvocation *invocation,
83 gpointer user_data)
84{
85 guint poll_interval = control_get_poll_interval(control);
86 g_timeout_add(poll_interval, poll_pgood, user_data);
87 control_complete_init(control,invocation);
Norman James3f97c5d2015-08-26 17:44:14 -050088 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -050089}
90
91static gboolean
Norman James3f97c5d2015-08-26 17:44:14 -050092on_get_power_state (ControlPower *pwr,
Norman Jamese2765102015-08-19 22:00:55 -050093 GDBusMethodInvocation *invocation,
94 gpointer user_data)
95{
Norman James3f97c5d2015-08-26 17:44:14 -050096 guint pgood = control_power_get_pgood(pwr);
97 control_power_complete_get_power_state(pwr,invocation,pgood);
98 return TRUE;
Norman Jamese2765102015-08-19 22:00:55 -050099}
100
101static void
102on_bus_acquired (GDBusConnection *connection,
103 const gchar *name,
104 gpointer user_data)
105{
Norman James3f97c5d2015-08-26 17:44:14 -0500106 ObjectSkeleton *object;
107 g_print ("Acquired a message bus connection: %s\n",name);
Norman James10ff6a32015-08-27 14:24:17 -0500108 cmdline *cmd = user_data;
109 if (cmd->argc < 2)
110 {
111 g_print("No objects created. Put object name(s) on command line\n");
112 return;
113 }
114 manager = g_dbus_object_manager_server_new (dbus_object_path);
115 int i=0;
116 for (i=1;i<cmd->argc;i++)
117 {
118 gchar *s;
119 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
120 object = object_skeleton_new (s);
121 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -0500122
Norman James10ff6a32015-08-27 14:24:17 -0500123 ControlPower* control_power = control_power_skeleton_new ();
124 object_skeleton_set_control_power (object, control_power);
125 g_object_unref (control_power);
Norman Jamese2765102015-08-19 22:00:55 -0500126
Norman Jamesce46e3e2015-08-30 22:25:55 -0500127 Control* control = control_skeleton_new ();
128 object_skeleton_set_control (object, control);
129 g_object_unref (control);
130
131 EventLog* event_log = event_log_skeleton_new ();
132 object_skeleton_set_event_log (object, event_log);
133 g_object_unref (event_log);
134
Norman James10ff6a32015-08-27 14:24:17 -0500135 //define method callbacks here
136 g_signal_connect (control_power,
137 "handle-set-power-state",
138 G_CALLBACK (on_set_power_state),
139 NULL); /* user_data */
Norman Jamese2765102015-08-19 22:00:55 -0500140
Norman James10ff6a32015-08-27 14:24:17 -0500141 g_signal_connect (control_power,
142 "handle-get-power-state",
143 G_CALLBACK (on_get_power_state),
144 NULL); /* user_data */
Norman Jamese2765102015-08-19 22:00:55 -0500145
Norman James9e6acf92015-09-08 07:00:04 -0500146 g_signal_connect (control,
147 "handle-init",
148 G_CALLBACK (on_init),
149 object); /* user_data */
150
151
Norman Jamesce46e3e2015-08-30 22:25:55 -0500152
Norman James10ff6a32015-08-27 14:24:17 -0500153 /* Export the object (@manager takes its own reference to @object) */
154 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
155 g_object_unref (object);
156 }
Norman James3f97c5d2015-08-26 17:44:14 -0500157 /* Export all objects */
158 g_dbus_object_manager_server_set_connection (manager, connection);
159
160 // get gpio device paths
161 gpio_init(connection,&power_pin);
162 gpio_init(connection,&pgood);
163 gpio_open(&pgood);
Norman Jamese2765102015-08-19 22:00:55 -0500164}
165
166static void
167on_name_acquired (GDBusConnection *connection,
168 const gchar *name,
169 gpointer user_data)
170{
171 g_print ("Acquired the name %s\n", name);
172}
173
174static void
175on_name_lost (GDBusConnection *connection,
176 const gchar *name,
177 gpointer user_data)
178{
179 g_print ("Lost the name %s\n", name);
180}
181
Norman Jamese2765102015-08-19 22:00:55 -0500182
Norman James3f97c5d2015-08-26 17:44:14 -0500183
184
185/*----------------------------------------------------------------*/
186/* Main Event Loop */
187
Norman Jamese2765102015-08-19 22:00:55 -0500188gint
189main (gint argc, gchar *argv[])
190{
191 GMainLoop *loop;
Norman James90caa3c2015-08-27 21:28:48 -0500192 cmdline cmd;
193 cmd.argc = argc;
194 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500195
196 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500197 loop = g_main_loop_new (NULL, FALSE);
198
199 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500200 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500201 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
202 G_BUS_NAME_OWNER_FLAGS_REPLACE,
203 on_bus_acquired,
204 on_name_acquired,
205 on_name_lost,
Norman James90caa3c2015-08-27 21:28:48 -0500206 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500207 NULL);
208
Norman Jamesce46e3e2015-08-30 22:25:55 -0500209 g_main_loop_run (loop);
Norman Jamese2765102015-08-19 22:00:55 -0500210
211 g_bus_unown_name (id);
212 g_main_loop_unref (loop);
213 return 0;
214}