blob: 70787dd9f80b21c0f4db906ab0994730cea82339 [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 James5d78b4d2015-09-05 13:34:34 -050024 SensorValue *sensor = object_get_sensor_value((Object*)user_data);
25 SensorThreshold *threshold = object_get_sensor_threshold((Object*)user_data);
Norman James90baede2015-09-02 20:32:49 -050026 SensorI2c *i2c = object_get_sensor_i2c((Object*)user_data);
27
Norman James5d78b4d2015-09-05 13:34:34 -050028 GVariant* v_value = sensor_value_get_value(sensor);
29 //TODO: Change to actually read sensor
30 double value = GET_VARIANT_D(v_value);
31 g_print("Reading I2C = %s; Address = %s; %f\n",
32 sensor_i2c_get_dev_path(i2c),sensor_i2c_get_address(i2c),value);
33
Norman James10ff6a32015-08-27 14:24:17 -050034 value = value+1;
Norman James5d78b4d2015-09-05 13:34:34 -050035
Norman Jamesce46e3e2015-08-30 22:25:55 -050036 if (heartbeat > 10000)
Norman James10ff6a32015-08-27 14:24:17 -050037 {
38 heartbeat = 0;
Norman James5d78b4d2015-09-05 13:34:34 -050039 sensor_value_emit_heartbeat(sensor,dbus_name);
Norman James10ff6a32015-08-27 14:24:17 -050040 }
41 else
42 {
43 heartbeat = heartbeat+poll_interval;
44 }
45
46 // End actually reading sensor
Norman James10ff6a32015-08-27 14:24:17 -050047
48 //if changed, set property and emit signal
Norman James5d78b4d2015-09-05 13:34:34 -050049 // if (value != sensor_value_get_value(sensor)
50 if (value != GET_VARIANT_D(v_value))
Norman James10ff6a32015-08-27 14:24:17 -050051 {
Norman James5d78b4d2015-09-05 13:34:34 -050052 // they don't appear to provide a function to modify float value in varait
53 // so it seems I have to create a new one
54 GVariant* v_new_value = NEW_VARIANT_D(value);
55 sensor_value_set_value(sensor,v_new_value);
56
57 sensor_value_set_value(sensor,v_new_value);
58 //sensor_value_emit_changed(sensor,v_new_value,sensor_value_get_units(sensor));
59 check_thresholds(threshold,v_new_value);
Norman James10ff6a32015-08-27 14:24:17 -050060 }
61 return TRUE;
62}
Norman James3f97c5d2015-08-26 17:44:14 -050063
Norman Jamesce46e3e2015-08-30 22:25:55 -050064static gboolean
Norman James5d78b4d2015-09-05 13:34:34 -050065on_init (SensorValue *sen,
Norman Jamesce46e3e2015-08-30 22:25:55 -050066 GDBusMethodInvocation *invocation,
67 gpointer user_data)
68{
69 inited = TRUE;
Norman James5d78b4d2015-09-05 13:34:34 -050070 sensor_value_complete_init(sen,invocation);
Norman Jamesce46e3e2015-08-30 22:25:55 -050071 return TRUE;
72}
73
Norman Jamese2765102015-08-19 22:00:55 -050074
Norman Jamese2765102015-08-19 22:00:55 -050075
76static void
77on_bus_acquired (GDBusConnection *connection,
78 const gchar *name,
79 gpointer user_data)
80{
Norman James10ff6a32015-08-27 14:24:17 -050081 g_print ("Acquired a message bus connection: %s\n",name);
Norman Jamese2765102015-08-19 22:00:55 -050082
Norman James10ff6a32015-08-27 14:24:17 -050083 cmdline *cmd = user_data;
84 if (cmd->argc < 2)
85 {
86 g_print("No objects created. Put object name(s) on command line\n");
87 return;
88 }
89 manager = g_dbus_object_manager_server_new (dbus_object_path);
90 int i=0;
91 for (i=1;i<cmd->argc;i++)
92 {
93 gchar *s;
94 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
95 ObjectSkeleton *object = object_skeleton_new (s);
96 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -050097
Norman James5d78b4d2015-09-05 13:34:34 -050098 SensorValue *sensor = sensor_value_skeleton_new ();
99 object_skeleton_set_sensor_value (object, sensor);
Norman James10ff6a32015-08-27 14:24:17 -0500100 g_object_unref (sensor);
101
Norman James5d78b4d2015-09-05 13:34:34 -0500102 SensorThreshold *threshold = sensor_threshold_skeleton_new();
103 object_skeleton_set_sensor_threshold (object,threshold);
Norman James10ff6a32015-08-27 14:24:17 -0500104 g_object_unref (threshold);
Norman Jamese2765102015-08-19 22:00:55 -0500105
Norman James90baede2015-09-02 20:32:49 -0500106 SensorI2c *i2c = sensor_i2c_skeleton_new();
107 object_skeleton_set_sensor_i2c (object,i2c);
108 g_object_unref (i2c);
109
110
Norman James5d78b4d2015-09-05 13:34:34 -0500111 // set properties
112 GVariant* value = g_variant_new_variant(g_variant_new_double(1.0));
113 sensor_value_set_value(sensor,value);
114 sensor_value_set_units(sensor,"C");
115 sensor_threshold_set_state(threshold,NOT_SET);
116
117 sensor_threshold_set_upper_critical(threshold,
118 g_variant_new_variant(g_variant_new_double(0.0)));
119 sensor_threshold_set_upper_warning(threshold,
120 g_variant_new_variant(g_variant_new_double(0.0)));
121 sensor_threshold_set_lower_warning(threshold,
122 g_variant_new_variant(g_variant_new_double(0.0)));
123 sensor_threshold_set_lower_critical(threshold,
124 g_variant_new_variant(g_variant_new_double(0.0)));
125
126 //define method callbacks here
Norman Jamese2765102015-08-19 22:00:55 -0500127
Norman Jamesce46e3e2015-08-30 22:25:55 -0500128 g_signal_connect (sensor,
129 "handle-init",
130 G_CALLBACK (on_init),
131 NULL); /* user_data */
Norman James3f97c5d2015-08-26 17:44:14 -0500132
Norman James10ff6a32015-08-27 14:24:17 -0500133 g_signal_connect (threshold,
Norman James10ff6a32015-08-27 14:24:17 -0500134 "handle-get-state",
135 G_CALLBACK (get_threshold_state),
Norman James3f97c5d2015-08-26 17:44:14 -0500136 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500137
Norman James10ff6a32015-08-27 14:24:17 -0500138 g_timeout_add(poll_interval, poll_sensor, object);
Norman Jamese2765102015-08-19 22:00:55 -0500139
Norman James10ff6a32015-08-27 14:24:17 -0500140 /* Export the object (@manager takes its own reference to @object) */
141 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
142 g_object_unref (object);
143 }
Norman Jamese2765102015-08-19 22:00:55 -0500144
145 /* Export all objects */
146 g_dbus_object_manager_server_set_connection (manager, connection);
147}
148
149static void
150on_name_acquired (GDBusConnection *connection,
151 const gchar *name,
152 gpointer user_data)
153{
154 g_print ("Acquired the name %s\n", name);
155}
156
157static void
158on_name_lost (GDBusConnection *connection,
159 const gchar *name,
160 gpointer user_data)
161{
162 g_print ("Lost the name %s\n", name);
163}
164
Norman Jamese2765102015-08-19 22:00:55 -0500165
166gint
167main (gint argc, gchar *argv[])
168{
169 GMainLoop *loop;
Norman James10ff6a32015-08-27 14:24:17 -0500170 cmdline cmd;
171 cmd.argc = argc;
172 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500173 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500174 loop = g_main_loop_new (NULL, FALSE);
175
176 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500177 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500178 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
179 G_BUS_NAME_OWNER_FLAGS_REPLACE,
180 on_bus_acquired,
181 on_name_acquired,
182 on_name_lost,
Norman James10ff6a32015-08-27 14:24:17 -0500183 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500184 NULL);
185
Norman Jamese2765102015-08-19 22:00:55 -0500186 g_main_loop_run (loop);
187
188 g_bus_unown_name (id);
189 g_main_loop_unref (loop);
190 return 0;
191}