blob: b1271e968e67e0d864f34464a48864177cf42159 [file] [log] [blame]
Norman James10ff6a32015-08-27 14:24:17 -05001#include "interfaces/sensor2.h"
2#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 Jamescc7ae122015-08-24 14:26:09 -050015static gchar* i2c_bus = "";
16static gchar* i2c_address = "";
Norman James3f97c5d2015-08-26 17:44:14 -050017
Norman James10ff6a32015-08-27 14:24:17 -050018static gboolean
19poll_sensor(gpointer user_data)
20{
21 SensorInteger *sensor = object_get_sensor_integer((Object*)user_data);
22 SensorIntegerThreshold *threshold = object_get_sensor_integer_threshold((Object*)user_data);
23
24 guint value = sensor_integer_get_value(sensor);
25 //TOOD: Change to actually read sensor
26 value = value+1;
27
28 if (heartbeat > 10000)
29 {
30 heartbeat = 0;
31 g_print(">>> Send Heartbeat\n");
32 sensor_integer_emit_heartbeat(sensor);
33 }
34 else
35 {
36 heartbeat = heartbeat+poll_interval;
37 }
38
39 // End actually reading sensor
40 g_print("Polling sensor: %d\n",value);
41
42 //if changed, set property and emit signal
43 if (value != sensor_integer_get_value(sensor))
44 {
45 g_print("Sensor changed\n");
46 sensor_integer_set_value(sensor,value);
47 sensor_integer_emit_changed(sensor,value);
48 check_thresholds(threshold,value);
49 }
50 return TRUE;
51}
Norman James3f97c5d2015-08-26 17:44:14 -050052
Norman Jamese2765102015-08-19 22:00:55 -050053
54static gboolean
55on_get_units (SensorInteger *sen,
56 GDBusMethodInvocation *invocation,
57 gpointer user_data)
58{
59 const gchar* val = sensor_integer_get_units(sen);
60 sensor_integer_complete_get_units(sen,invocation,val);
61 return TRUE;
62}
63
64static gboolean
65on_get (SensorInteger *sen,
66 GDBusMethodInvocation *invocation,
67 gpointer user_data)
68{
69 guint reading = sensor_integer_get_value(sen);
70 sensor_integer_complete_get_value(sen,invocation,reading);
71 return TRUE;
72}
73
Norman Jamescc7ae122015-08-24 14:26:09 -050074static gboolean
75on_set_config (SensorInteger *sen,
76 GDBusMethodInvocation *invocation,
77 gchar** config,
78 gpointer user_data)
79{
80 g_print("I2C bus = %s\n",config[0]);
81 g_print("I2C addr = %s\n",config[1]);
82 sensor_integer_complete_set_config_data(sen,invocation);
Norman Jamescc7ae122015-08-24 14:26:09 -050083 return TRUE;
84}
85
86
Norman Jamese2765102015-08-19 22:00:55 -050087static void
88on_bus_acquired (GDBusConnection *connection,
89 const gchar *name,
90 gpointer user_data)
91{
Norman James10ff6a32015-08-27 14:24:17 -050092 g_print ("Acquired a message bus connection: %s\n",name);
Norman Jamese2765102015-08-19 22:00:55 -050093
Norman James10ff6a32015-08-27 14:24:17 -050094 cmdline *cmd = user_data;
95 if (cmd->argc < 2)
96 {
97 g_print("No objects created. Put object name(s) on command line\n");
98 return;
99 }
100 manager = g_dbus_object_manager_server_new (dbus_object_path);
101 int i=0;
102 for (i=1;i<cmd->argc;i++)
103 {
104 gchar *s;
105 s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]);
106 ObjectSkeleton *object = object_skeleton_new (s);
107 g_free (s);
Norman Jamese2765102015-08-19 22:00:55 -0500108
Norman James10ff6a32015-08-27 14:24:17 -0500109 SensorInteger *sensor = sensor_integer_skeleton_new ();
110 object_skeleton_set_sensor_integer (object, sensor);
111 g_object_unref (sensor);
112
113 SensorIntegerThreshold *threshold = sensor_integer_threshold_skeleton_new();
114 object_skeleton_set_sensor_integer_threshold (object,threshold);
115 g_object_unref (threshold);
Norman Jamese2765102015-08-19 22:00:55 -0500116
Norman James10ff6a32015-08-27 14:24:17 -0500117 // set units
118 sensor_integer_set_units(sensor,"C");
119 sensor_integer_threshold_set_state(threshold,NOT_SET);
120 //define method callbacks here
121 g_signal_connect (sensor,
Norman Jamese2765102015-08-19 22:00:55 -0500122 "handle-get-value",
123 G_CALLBACK (on_get),
124 NULL); /* user_data */
Norman James10ff6a32015-08-27 14:24:17 -0500125 g_signal_connect (sensor,
Norman Jamese2765102015-08-19 22:00:55 -0500126 "handle-get-units",
127 G_CALLBACK (on_get_units),
128 NULL); /* user_data */
129
Norman James10ff6a32015-08-27 14:24:17 -0500130 g_signal_connect (sensor,
Norman Jamescc7ae122015-08-24 14:26:09 -0500131 "handle-set-config-data",
132 G_CALLBACK (on_set_config),
133 NULL); /* user_data */
Norman James3f97c5d2015-08-26 17:44:14 -0500134
Norman James10ff6a32015-08-27 14:24:17 -0500135 g_signal_connect (threshold,
136 "handle-set",
137 G_CALLBACK (set_thresholds),
Norman James3f97c5d2015-08-26 17:44:14 -0500138 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500139
Norman James10ff6a32015-08-27 14:24:17 -0500140 g_signal_connect (threshold,
141 "handle-get-state",
142 G_CALLBACK (get_threshold_state),
Norman James3f97c5d2015-08-26 17:44:14 -0500143 NULL); /* user_data */
Norman Jamescc7ae122015-08-24 14:26:09 -0500144
Norman James10ff6a32015-08-27 14:24:17 -0500145 g_timeout_add(poll_interval, poll_sensor, object);
Norman Jamese2765102015-08-19 22:00:55 -0500146
Norman James10ff6a32015-08-27 14:24:17 -0500147 /* Export the object (@manager takes its own reference to @object) */
148 g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
149 g_object_unref (object);
150 }
Norman Jamese2765102015-08-19 22:00:55 -0500151
152 /* Export all objects */
153 g_dbus_object_manager_server_set_connection (manager, connection);
154}
155
156static void
157on_name_acquired (GDBusConnection *connection,
158 const gchar *name,
159 gpointer user_data)
160{
161 g_print ("Acquired the name %s\n", name);
162}
163
164static void
165on_name_lost (GDBusConnection *connection,
166 const gchar *name,
167 gpointer user_data)
168{
169 g_print ("Lost the name %s\n", name);
170}
171
Norman Jamese2765102015-08-19 22:00:55 -0500172
173gint
174main (gint argc, gchar *argv[])
175{
176 GMainLoop *loop;
Norman James10ff6a32015-08-27 14:24:17 -0500177 cmdline cmd;
178 cmd.argc = argc;
179 cmd.argv = argv;
Norman Jamese2765102015-08-19 22:00:55 -0500180 guint id;
Norman Jamese2765102015-08-19 22:00:55 -0500181 loop = g_main_loop_new (NULL, FALSE);
182
183 id = g_bus_own_name (G_BUS_TYPE_SESSION,
Norman James26072c02015-08-25 07:14:29 -0500184 dbus_name,
Norman Jamese2765102015-08-19 22:00:55 -0500185 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
186 G_BUS_NAME_OWNER_FLAGS_REPLACE,
187 on_bus_acquired,
188 on_name_acquired,
189 on_name_lost,
Norman James10ff6a32015-08-27 14:24:17 -0500190 &cmd,
Norman Jamese2765102015-08-19 22:00:55 -0500191 NULL);
192
Norman Jamese2765102015-08-19 22:00:55 -0500193 g_main_loop_run (loop);
194
195 g_bus_unown_name (id);
196 g_main_loop_unref (loop);
197 return 0;
198}