blob: 52335d5be0806ebd1d8971c80512280a3e19cfa2 [file] [log] [blame]
Norman James90baede2015-09-02 20:32:49 -05001#include "interfaces/sensor.h"
Norman James10ff6a32015-08-27 14:24:17 -05002#include "openbmc.h"
3#include "sensor_threshold.h"
Norman James3f97c5d2015-08-26 17:44:14 -05004
5
Norman Jamese2765102015-08-19 22:00:55 -05006/* ---------------------------------------------------------------------------------------------------- */
Norman James3f97c5d2015-08-26 17:44:14 -05007
Norman James26072c02015-08-25 07:14:29 -05008static const gchar* dbus_object_path = "/org/openbmc/sensors/Temperature/Ambient";
9static const gchar* dbus_name = "org.openbmc.sensors.Temperature.Ambient";
Norman James10ff6a32015-08-27 14:24:17 -050010static const guint poll_interval = 3000;
11static guint heartbeat = 0;
Norman James3f97c5d2015-08-26 17:44:14 -050012
Norman Jamese2765102015-08-19 22:00:55 -050013static GDBusObjectManagerServer *manager = NULL;
Norman Jamese2765102015-08-19 22:00:55 -050014
Norman Jamesce46e3e2015-08-30 22:25:55 -050015static gboolean inited = FALSE;
Norman James3f97c5d2015-08-26 17:44:14 -050016
Norman James10ff6a32015-08-27 14:24:17 -050017static gboolean
18poll_sensor(gpointer user_data)
19{
Norman Jamesce46e3e2015-08-30 22:25:55 -050020 if (!inited)
21 {
22 return TRUE;
23 }
Norman James10ff6a32015-08-27 14:24:17 -050024 SensorInteger *sensor = object_get_sensor_integer((Object*)user_data);
25 SensorIntegerThreshold *threshold = object_get_sensor_integer_threshold((Object*)user_data);
Norman James90baede2015-09-02 20:32:49 -050026 SensorI2c *i2c = object_get_sensor_i2c((Object*)user_data);
27
Norman James10ff6a32015-08-27 14:24:17 -050028 guint value = sensor_integer_get_value(sensor);
29 //TOOD: Change to actually read sensor
Norman James90baede2015-09-02 20:32:49 -050030 g_print("Reading I2C = %s; Address = %s\n",sensor_i2c_get_dev_path(i2c),sensor_i2c_get_address(i2c));
Norman James10ff6a32015-08-27 14:24:17 -050031 value = value+1;
Norman Jamesce46e3e2015-08-30 22:25:55 -050032 if (heartbeat > 10000)
Norman James10ff6a32015-08-27 14:24:17 -050033 {
34 heartbeat = 0;
Norman James90caa3c2015-08-27 21:28:48 -050035 sensor_integer_emit_heartbeat(sensor,dbus_name);
Norman James10ff6a32015-08-27 14:24:17 -050036 }
37 else
38 {
39 heartbeat = heartbeat+poll_interval;
40 }
41
42 // End actually reading sensor
Norman James10ff6a32015-08-27 14:24:17 -050043
44 //if changed, set property and emit signal
45 if (value != sensor_integer_get_value(sensor))
46 {
Norman James10ff6a32015-08-27 14:24:17 -050047 sensor_integer_set_value(sensor,value);
Norman James90baede2015-09-02 20:32:49 -050048 sensor_integer_emit_changed(sensor,value,sensor_integer_get_units(sensor));
Norman James10ff6a32015-08-27 14:24:17 -050049 check_thresholds(threshold,value);
50 }
51 return TRUE;
52}
Norman James3f97c5d2015-08-26 17:44:14 -050053
Norman Jamesce46e3e2015-08-30 22:25:55 -050054static gboolean
55on_init (SensorInteger *sen,
56 GDBusMethodInvocation *invocation,
57 gpointer user_data)
58{
59 inited = TRUE;
Norman Jamesce46e3e2015-08-30 22:25:55 -050060 sensor_integer_complete_init(sen,invocation);
61 return TRUE;
62}
63
Norman Jamese2765102015-08-19 22:00:55 -050064
65static gboolean
66on_get_units (SensorInteger *sen,
67 GDBusMethodInvocation *invocation,
68 gpointer user_data)
69{
70 const gchar* val = sensor_integer_get_units(sen);
71 sensor_integer_complete_get_units(sen,invocation,val);
72 return TRUE;
73}
74
75static gboolean
76on_get (SensorInteger *sen,
77 GDBusMethodInvocation *invocation,
78 gpointer user_data)
79{
80 guint reading = sensor_integer_get_value(sen);
81 sensor_integer_complete_get_value(sen,invocation,reading);
82 return TRUE;
83}
84
85static void
86on_bus_acquired (GDBusConnection *connection,
87 const gchar *name,
88 gpointer user_data)
89{
Norman James10ff6a32015-08-27 14:24:17 -050090 g_print ("Acquired a message bus connection: %s\n",name);
Norman Jamese2765102015-08-19 22:00:55 -050091
Norman James10ff6a32015-08-27 14:24:17 -050092 cmdline *cmd = user_data;
93 if (cmd->argc < 2)
94 {
95 g_print("No objects created. Put object name(s) on command line\n");
96 return;
97 }
98 manager = g_dbus_object_manager_server_new (dbus_object_path);
99 int i=0;
100 for (i=1;i<cmd->argc;i++)
101 {
102 gchar *s;
103 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
104 ObjectSkeleton *object = object_skeleton_new (s);
105 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -0500106
Norman James10ff6a32015-08-27 14:24:17 -0500107 SensorInteger *sensor = sensor_integer_skeleton_new ();
108 object_skeleton_set_sensor_integer (object, sensor);
109 g_object_unref (sensor);
110
111 SensorIntegerThreshold *threshold = sensor_integer_threshold_skeleton_new();
112 object_skeleton_set_sensor_integer_threshold (object,threshold);
113 g_object_unref (threshold);
Norman Jamese2765102015-08-19 22:00:55 -0500114
Norman James90baede2015-09-02 20:32:49 -0500115 SensorI2c *i2c = sensor_i2c_skeleton_new();
116 object_skeleton_set_sensor_i2c (object,i2c);
117 g_object_unref (i2c);
118
119
Norman James10ff6a32015-08-27 14:24:17 -0500120 // set units
121 sensor_integer_set_units(sensor,"C");
122 sensor_integer_threshold_set_state(threshold,NOT_SET);
123 //define method callbacks here
124 g_signal_connect (sensor,
Norman Jamese2765102015-08-19 22:00:55 -0500125 "handle-get-value",
126 G_CALLBACK (on_get),
127 NULL); /* user_data */
Norman James10ff6a32015-08-27 14:24:17 -0500128 g_signal_connect (sensor,
Norman Jamese2765102015-08-19 22:00:55 -0500129 "handle-get-units",
130 G_CALLBACK (on_get_units),
131 NULL); /* user_data */
132
Norman Jamesce46e3e2015-08-30 22:25:55 -0500133 g_signal_connect (sensor,
134 "handle-init",
135 G_CALLBACK (on_init),
136 NULL); /* user_data */
Norman James3f97c5d2015-08-26 17:44:14 -0500137
Norman James10ff6a32015-08-27 14:24:17 -0500138 g_signal_connect (threshold,
139 "handle-set",
140 G_CALLBACK (set_thresholds),
Norman James3f97c5d2015-08-26 17:44:14 -0500141 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500142
Norman James10ff6a32015-08-27 14:24:17 -0500143 g_signal_connect (threshold,
144 "handle-get-state",
145 G_CALLBACK (get_threshold_state),
Norman James3f97c5d2015-08-26 17:44:14 -0500146 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500147
Norman James10ff6a32015-08-27 14:24:17 -0500148 g_timeout_add(poll_interval, poll_sensor, object);
Norman Jamese2765102015-08-19 22:00:55 -0500149
Norman James10ff6a32015-08-27 14:24:17 -0500150 /* Export the object (@manager takes its own reference to @object) */
151 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
152 g_object_unref (object);
153 }
Norman Jamese2765102015-08-19 22:00:55 -0500154
155 /* Export all objects */
156 g_dbus_object_manager_server_set_connection (manager, connection);
157}
158
159static void
160on_name_acquired (GDBusConnection *connection,
161 const gchar *name,
162 gpointer user_data)
163{
164 g_print ("Acquired the name %s\n", name);
165}
166
167static void
168on_name_lost (GDBusConnection *connection,
169 const gchar *name,
170 gpointer user_data)
171{
172 g_print ("Lost the name %s\n", name);
173}
174
Norman Jamese2765102015-08-19 22:00:55 -0500175
176gint
177main (gint argc, gchar *argv[])
178{
179 GMainLoop *loop;
Norman James10ff6a32015-08-27 14:24:17 -0500180 cmdline cmd;
181 cmd.argc = argc;
182 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500183 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500184 loop = g_main_loop_new (NULL, FALSE);
185
186 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500187 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500188 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
189 G_BUS_NAME_OWNER_FLAGS_REPLACE,
190 on_bus_acquired,
191 on_name_acquired,
192 on_name_lost,
Norman James10ff6a32015-08-27 14:24:17 -0500193 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500194 NULL);
195
Norman Jamese2765102015-08-19 22:00:55 -0500196 g_main_loop_run (loop);
197
198 g_bus_unown_name (id);
199 g_main_loop_unref (loop);
200 return 0;
201}