blob: fab2f1aed73df108861db3d0d99041f3dea05d1c [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 "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 James362a80f2015-09-14 14:04:39 -05008static const gchar* dbus_object_path = "/org/openbmc/sensors";
Norman James26072c02015-08-25 07:14:29 -05009static const gchar* dbus_name = "org.openbmc.sensors.Temperature.Ambient";
Norman James10ff6a32015-08-27 14:24:17 -050010static guint heartbeat = 0;
Norman James3f97c5d2015-08-26 17:44:14 -050011
Norman Jamese2765102015-08-19 22:00:55 -050012static GDBusObjectManagerServer *manager = NULL;
Norman Jamese2765102015-08-19 22:00:55 -050013
Norman James10ff6a32015-08-27 14:24:17 -050014static gboolean
15poll_sensor(gpointer user_data)
16{
Norman James5d78b4d2015-09-05 13:34:34 -050017 SensorValue *sensor = object_get_sensor_value((Object*)user_data);
18 SensorThreshold *threshold = object_get_sensor_threshold((Object*)user_data);
Norman James90baede2015-09-02 20:32:49 -050019 SensorI2c *i2c = object_get_sensor_i2c((Object*)user_data);
20
Norman James5d78b4d2015-09-05 13:34:34 -050021 GVariant* v_value = sensor_value_get_value(sensor);
Norman James9e6acf92015-09-08 07:00:04 -050022 guint poll_interval = sensor_value_get_poll_interval(sensor);
23
Norman James5d78b4d2015-09-05 13:34:34 -050024 //TODO: Change to actually read sensor
25 double value = GET_VARIANT_D(v_value);
Norman James362a80f2015-09-14 14:04:39 -050026 //g_print("Reading I2C = %s; Address = %s; %f\n",
27 // sensor_i2c_get_dev_path(i2c),sensor_i2c_get_address(i2c),value);
Norman James5d78b4d2015-09-05 13:34:34 -050028
Norman James10ff6a32015-08-27 14:24:17 -050029 value = value+1;
Norman James5d78b4d2015-09-05 13:34:34 -050030
Norman James362a80f2015-09-14 14:04:39 -050031 if (heartbeat > 4000)
Norman James10ff6a32015-08-27 14:24:17 -050032 {
33 heartbeat = 0;
Norman James5d78b4d2015-09-05 13:34:34 -050034 sensor_value_emit_heartbeat(sensor,dbus_name);
Norman James10ff6a32015-08-27 14:24:17 -050035 }
36 else
37 {
38 heartbeat = heartbeat+poll_interval;
39 }
40
41 // End actually reading sensor
Norman James10ff6a32015-08-27 14:24:17 -050042
43 //if changed, set property and emit signal
Norman James5d78b4d2015-09-05 13:34:34 -050044 if (value != GET_VARIANT_D(v_value))
Norman James10ff6a32015-08-27 14:24:17 -050045 {
Norman James5d78b4d2015-09-05 13:34:34 -050046 GVariant* v_new_value = NEW_VARIANT_D(value);
47 sensor_value_set_value(sensor,v_new_value);
Norman James9e6acf92015-09-08 07:00:04 -050048 const gchar* units = sensor_value_get_units(sensor);
49 sensor_value_emit_changed(sensor,v_new_value,units);
50 check_thresholds(threshold,v_new_value);
Norman James10ff6a32015-08-27 14:24:17 -050051 }
52 return TRUE;
53}
Norman James3f97c5d2015-08-26 17:44:14 -050054
Norman Jamesce46e3e2015-08-30 22:25:55 -050055static gboolean
Norman James5d78b4d2015-09-05 13:34:34 -050056on_init (SensorValue *sen,
Norman Jamesce46e3e2015-08-30 22:25:55 -050057 GDBusMethodInvocation *invocation,
58 gpointer user_data)
59{
Norman James9e6acf92015-09-08 07:00:04 -050060
61 guint poll_interval = sensor_value_get_poll_interval(sen);
62 g_timeout_add(poll_interval, poll_sensor, user_data);
63 sensor_value_complete_init(sen,invocation);
64 return TRUE;
Norman Jamesce46e3e2015-08-30 22:25:55 -050065}
66
Norman Jamese2765102015-08-19 22:00:55 -050067
Norman Jamese2765102015-08-19 22:00:55 -050068
69static void
70on_bus_acquired (GDBusConnection *connection,
71 const gchar *name,
72 gpointer user_data)
73{
Norman James362a80f2015-09-14 14:04:39 -050074 // g_print ("Acquired a message bus connection: %s\n",name);
Norman Jamese2765102015-08-19 22:00:55 -050075
Norman James10ff6a32015-08-27 14:24:17 -050076 cmdline *cmd = user_data;
77 if (cmd->argc < 2)
78 {
79 g_print("No objects created. Put object name(s) on command line\n");
80 return;
81 }
82 manager = g_dbus_object_manager_server_new (dbus_object_path);
83 int i=0;
84 for (i=1;i<cmd->argc;i++)
85 {
86 gchar *s;
Norman James362a80f2015-09-14 14:04:39 -050087 s = g_strdup_printf ("%s/Temperature/%s",dbus_object_path,cmd->argv[i]);
Norman James10ff6a32015-08-27 14:24:17 -050088 ObjectSkeleton *object = object_skeleton_new (s);
89 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -050090
Norman James5d78b4d2015-09-05 13:34:34 -050091 SensorValue *sensor = sensor_value_skeleton_new ();
92 object_skeleton_set_sensor_value (object, sensor);
Norman James10ff6a32015-08-27 14:24:17 -050093 g_object_unref (sensor);
94
Norman James5d78b4d2015-09-05 13:34:34 -050095 SensorThreshold *threshold = sensor_threshold_skeleton_new();
96 object_skeleton_set_sensor_threshold (object,threshold);
Norman James10ff6a32015-08-27 14:24:17 -050097 g_object_unref (threshold);
Norman Jamese2765102015-08-19 22:00:55 -050098
Norman James90baede2015-09-02 20:32:49 -050099 SensorI2c *i2c = sensor_i2c_skeleton_new();
100 object_skeleton_set_sensor_i2c (object,i2c);
101 g_object_unref (i2c);
102
103
Norman James5d78b4d2015-09-05 13:34:34 -0500104 // set properties
105 GVariant* value = g_variant_new_variant(g_variant_new_double(1.0));
106 sensor_value_set_value(sensor,value);
107 sensor_value_set_units(sensor,"C");
Norman James9e6acf92015-09-08 07:00:04 -0500108 sensor_value_set_settable(sensor,FALSE);
Norman James5d78b4d2015-09-05 13:34:34 -0500109 sensor_threshold_set_state(threshold,NOT_SET);
110
111 sensor_threshold_set_upper_critical(threshold,
112 g_variant_new_variant(g_variant_new_double(0.0)));
113 sensor_threshold_set_upper_warning(threshold,
114 g_variant_new_variant(g_variant_new_double(0.0)));
115 sensor_threshold_set_lower_warning(threshold,
116 g_variant_new_variant(g_variant_new_double(0.0)));
117 sensor_threshold_set_lower_critical(threshold,
118 g_variant_new_variant(g_variant_new_double(0.0)));
119
120 //define method callbacks here
Norman Jamese2765102015-08-19 22:00:55 -0500121
Norman Jamesce46e3e2015-08-30 22:25:55 -0500122 g_signal_connect (sensor,
123 "handle-init",
124 G_CALLBACK (on_init),
Norman James9e6acf92015-09-08 07:00:04 -0500125 object); /* user_data */
Norman James3f97c5d2015-08-26 17:44:14 -0500126
Norman James10ff6a32015-08-27 14:24:17 -0500127 g_signal_connect (threshold,
Norman James10ff6a32015-08-27 14:24:17 -0500128 "handle-get-state",
129 G_CALLBACK (get_threshold_state),
Norman James3f97c5d2015-08-26 17:44:14 -0500130 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500131
Norman James9e6acf92015-09-08 07:00:04 -0500132
Norman Jamese2765102015-08-19 22:00:55 -0500133
Norman James10ff6a32015-08-27 14:24:17 -0500134 /* Export the object (@manager takes its own reference to @object) */
135 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
136 g_object_unref (object);
137 }
Norman Jamese2765102015-08-19 22:00:55 -0500138
139 /* Export all objects */
140 g_dbus_object_manager_server_set_connection (manager, connection);
141}
142
143static void
144on_name_acquired (GDBusConnection *connection,
145 const gchar *name,
146 gpointer user_data)
147{
Norman James362a80f2015-09-14 14:04:39 -0500148// g_print ("Acquired the name %s\n", name);
Norman Jamese2765102015-08-19 22:00:55 -0500149}
150
151static void
152on_name_lost (GDBusConnection *connection,
153 const gchar *name,
154 gpointer user_data)
155{
Norman James362a80f2015-09-14 14:04:39 -0500156// g_print ("Lost the name %s\n", name);
Norman Jamese2765102015-08-19 22:00:55 -0500157}
158
Norman Jamese2765102015-08-19 22:00:55 -0500159
160gint
161main (gint argc, gchar *argv[])
162{
163 GMainLoop *loop;
Norman James10ff6a32015-08-27 14:24:17 -0500164 cmdline cmd;
165 cmd.argc = argc;
166 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500167 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500168 loop = g_main_loop_new (NULL, FALSE);
169
170 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500171 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500172 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
173 G_BUS_NAME_OWNER_FLAGS_REPLACE,
174 on_bus_acquired,
175 on_name_acquired,
176 on_name_lost,
Norman James10ff6a32015-08-27 14:24:17 -0500177 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500178 NULL);
179
Norman Jamese2765102015-08-19 22:00:55 -0500180 g_main_loop_run (loop);
181
182 g_bus_unown_name (id);
183 g_main_loop_unref (loop);
184 return 0;
185}