static gboolean poll_occ(gpointer user_data) { //g_dbus_object_get_object_path(G_DBUS_OBJECT(user_data)), Occ* occ = object_get_occ((Object*)user_data); gchar *s; s = g_strdup_printf ("%s/Temperature/P8_%s_Core_%d", dbus_object_path,occ_get_instance_name(occ),1); g_print("%s\n",s); GDBusInterface* interface = g_dbus_object_manager_get_interface((GDBusObjectManager*)manager,s, "org.openbmc.SensorValue"); if (interface != NULL) { SensorValue* sensor = (SensorValue*) interface; GVariant *value = NEW_VARIANT_U(10); sensor_value_set_value(sensor,value); const gchar* units = sensor_value_get_units(sensor); sensor_value_emit_changed(sensor,sensor_value_get_value(sensor),units); } g_free (s); //g_free(interface); return TRUE; }
static gboolean poll_hwmon(gpointer user_data) { Hwmon *hwmon = object_get_hwmon((Object*)user_data); SensorValue *sensor = object_get_sensor_value((Object*)user_data); const gchar* filename = hwmon_get_sysfs_path(hwmon); int fd = open(filename, O_RDONLY); if(fd != -1) { char buf[255]; if(read(fd,&buf,255) == -1) { g_print("ERROR: Unable to read value: %s\n",filename); } else { guint32 scale = hwmon_get_scale(hwmon); if(scale == 0) { g_print("ERROR: Invalid scale value of 0\n"); scale = 1; } guint32 value = atoi(buf)/scale; GVariant* v = NEW_VARIANT_U(value); GVariant* old_value = sensor_value_get_value(sensor); bool do_set = false; if(old_value == NULL) { do_set = true; } else { if(GET_VARIANT_U(old_value) != value) { do_set = true; } } if(do_set) { g_print("Sensor changed: %s,%d\n",filename,value); GVariant* v = NEW_VARIANT_U(value); const gchar* units = sensor_value_get_units(sensor); sensor_value_set_value(sensor,v); sensor_value_emit_changed(sensor,v,units); } } close(fd); } else { g_print("ERROR - hwmons: File %s doesn't exist\n",filename); } return TRUE; }
static void on_bus_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { //g_print ("Acquired a message bus connection: %s\n",name); cmdline *cmd = user_data; if (cmd->argc < 2) { g_print("No objects created. Put object name(s) on command line\n"); return; } manager = g_dbus_object_manager_server_new (dbus_object_path); int i=0; for (i=1;i<cmd->argc;i++) { gchar *s; s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[i]); ObjectSkeleton *object = object_skeleton_new (s); g_free (s); Occ *occ = occ_skeleton_new (); object_skeleton_set_occ (object, occ); g_object_unref (occ); occ_set_instance_name(occ,cmd->argv[i]); SensorI2c *i2c = sensor_i2c_skeleton_new (); object_skeleton_set_sensor_i2c (object, i2c); g_object_unref (i2c); g_signal_connect (occ, "handle-init", G_CALLBACK (on_init), object); /* user_data */ //g_timeout_add(3000, poll_occ, object); /* Export the object (@manager takes its own reference to @object) */ g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); g_object_unref (object); int c; for (c=0;c<12;c++) { s = g_strdup_printf ("%s/Temperature/P8_%s_Core_%d",dbus_object_path,cmd->argv[i],c); ObjectSkeleton *object = object_skeleton_new (s); g_free (s); SensorValue *sensor = sensor_value_skeleton_new (); object_skeleton_set_sensor_value (object, sensor); g_object_unref (sensor); GVariant* v_new_value = NEW_VARIANT_U(c); sensor_value_set_value(sensor,v_new_value); sensor_value_set_units(sensor,"C"); g_signal_connect (sensor, "handle-init", G_CALLBACK (on_init_sensor), NULL); /* user_data */ //emit changed signal so sensor manager sees initial value sensor_value_emit_changed(sensor,sensor_value_get_value(sensor),sensor_value_get_units(sensor)); /* Export the object (@manager takes its own reference to @object) */ g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); g_object_unref (object); } } /* Export all objects */ g_dbus_object_manager_server_set_connection (manager, connection); }