added experimental support for ati/amd gpu/fan
authorJean-Philippe Orsini <jeanfi@gmail.com>
Mon, 18 Jul 2011 16:22:38 +0000 (16:22 +0000)
committerJean-Philippe Orsini <jeanfi@gmail.com>
Mon, 18 Jul 2011 16:22:38 +0000 (16:22 +0000)
14 files changed:
AUTHORS
NEWS
po/POTFILES.in
po/fr.po
po/psensor.pot
po/tr.po
po/zh_CN.po
src/lib/Makefile.am
src/lib/Makefile.in
src/lib/amd.c [new file with mode: 0644]
src/lib/amd.h [new file with mode: 0644]
src/lib/psensor.c
src/lib/psensor.h
src/main.c

diff --git a/AUTHORS b/AUTHORS
index 42f6416..380b1d9 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,4 +1,5 @@
 Authors of psensor.
 
 jeanfi@gmail.com        all files.
-linux.dabao@gmail.com,royclarck         po/zh_CN.po
\ No newline at end of file
+linux.dabao@gmail.com,royclarck         po/zh_CN.po
+thgreasi@gmail.com              src/lib/amd.h src/lib/amd.h
\ No newline at end of file
diff --git a/NEWS b/NEWS
index b8a2ce1..e44d38c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@
    JSON web interface.
 ** psensor-server: added monitor.html using jquery and retrieving
    monitoring data from the JSON web interface.
+** added support for ATI/AMD gpus and fans.
 
 * v0.6.2.9
 
index a732feb..1bde9b0 100644 (file)
@@ -8,6 +8,7 @@ src/ui_pref.c
 src/ui_sensorpref.c  
 src/rsensor.c
 src/server/server.c
+src/lib/amd.c
 src/lib/hdd.c
 src/lib/nvidia.c
 src/lib/lmsensor.c
index 48d8e38..c43f9af 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.6.0.9\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2011-07-13 11:01+0200\n"
+"POT-Creation-Date: 2011-07-18 18:20+0200\n"
 "PO-Revision-Date: 2011-02-07 21:18+0100\n"
 "Last-Translator: Jean-Philippe Orsini <jeanfi@gmail.com>\n"
 "Language-Team: Oriya\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8-bit\n"
 
-#: src/main.c:72 src/server/server.c:76
+#: src/main.c:73 src/server/server.c:76
 #, fuzzy, c-format
 msgid ""
 "Copyright (C) %s jeanfi@gmail.com\n"
@@ -33,12 +33,12 @@ msgstr ""
 "Ce logiciel n'est accompagné d'ABSOLUMENT AUCUNE GARANTIE, dans les limites\n"
 "autorisees par la loi applicable.\n"
 
-#: src/main.c:82 src/server/server.c:86
+#: src/main.c:83 src/server/server.c:86
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
 msgstr "Utilisation: %s [OPTION]...\n"
 
-#: src/main.c:84
+#: src/main.c:85
 msgid ""
 "psensor is a GTK application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
@@ -46,11 +46,11 @@ msgstr ""
 "psensor est une application GTK pour surveiller les sondes matérielles "
 "thermiques et les ventilateurs."
 
-#: src/main.c:88
+#: src/main.c:89
 msgid "Options:"
 msgstr "Options:"
 
-#: src/main.c:89 src/server/server.c:93
+#: src/main.c:90 src/server/server.c:93
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
@@ -58,34 +58,29 @@ msgstr ""
 "  -h, --help          afficher cette aider et quitter\n"
 "  -v, --version       afficher les informations de version et quitter"
 
-#: src/main.c:95
+#: src/main.c:96
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server, example: http://"
 "hostname:3131"
 msgstr ""
 "  -u, --url=URL       l'URL de psensor-server, example: http://hostname:3131"
 
-#: src/main.c:101 src/server/server.c:106
+#: src/main.c:102 src/server/server.c:106
 #, c-format
 msgid "Report bugs to: %s\n"
 msgstr "Signaler les bugs à: %s\n"
 
-#: src/main.c:103 src/server/server.c:108
+#: src/main.c:104 src/server/server.c:108
 #, c-format
 msgid "%s home page: <%s>\n"
 msgstr "%s page d'acceuil: <%s>\n"
 
-#: src/main.c:323 src/server/server.c:346
+#: src/main.c:326 src/server/server.c:346
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Essayez `%s --help' pour plus d'informations.\n"
 
-#: src/main.c:346
-#, fuzzy, c-format
-msgid "ERROR: lmsensor init failure: %s\n"
-msgstr "ERREUR: Echec de l'initialisation de 'lm-sensors'\n"
-
-#: src/main.c:357
+#: src/main.c:355
 #, c-format
 msgid "ERROR: Not compiled with remote sensor support.\n"
 msgstr ""
@@ -286,22 +281,43 @@ msgstr "WWW repertoire: %s\n"
 msgid "URL: http://localhost:%d\n"
 msgstr "URL: http://localhost:%d\n"
 
-#: src/lib/hdd.c:59
+#: src/lib/amd.c:159
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open socket\n"
+msgid "ERROR: ADL library not found!\n"
+msgstr ""
+
+#: src/lib/amd.c:184
+#, c-format
+msgid "ERROR: ADL's API is missing!\n"
+msgstr ""
+
+#: src/lib/amd.c:193
+#, fuzzy, c-format
+msgid "ERROR: ADL Initialization Error!\n"
+msgstr "ERREUR: échec de l'initialisation nvidia\n"
+
+#: src/lib/amd.c:201
+#, fuzzy, c-format
+msgid "ERROR: Cannot get the number of adapters!\n"
+msgstr ""
+"ERREUR: Impossible de récuperer la valeur de la sous-fonctionnalité %s: %s\n"
+
+#: src/lib/hdd.c:59
+#, fuzzy, c-format
+msgid "ERROR: hdd fetch, failed to open socket\n"
 msgstr "ERREUR: hdd_fetch, écher d'ouverture de la socket\n"
 
 #: src/lib/hdd.c:73
-#, c-format
-msgid "ERROR: hdd_fetch, failed to open connection\n"
+#, fuzzy, c-format
+msgid "ERROR: hdd fetch, failed to open connection\n"
 msgstr "ERREUR: hdd_fetch, écher de l'ouverture de la connection\n"
 
-#: src/lib/hdd.c:182
+#: src/lib/hdd.c:183
 #, c-format
 msgid "ERROR: wrong hdd string: %s"
 msgstr "ERREUR: mauvaise chaine hdd: %s"
 
-#: src/lib/hdd.c:252
+#: src/lib/hdd.c:253
 #, c-format
 msgid "ERROR: wrong hdd string: %s\n"
 msgstr "ERREUR: mauvaise chaine hdd: %s\n"
@@ -311,37 +327,37 @@ msgstr "ERREUR: mauvaise chaine hdd: %s\n"
 msgid "ERROR: failed to retrieve nvidia temperature\n"
 msgstr "ERREUR: échec de la récupération des températures nvidia\n"
 
-#: src/lib/nvidia.c:99
+#: src/lib/nvidia.c:92
 #, fuzzy, c-format
 msgid "ERROR: Cannot open connection to X Server\n"
 msgstr "ERREUR: Echer de la connectio à: %s\n"
 
-#: src/lib/nvidia.c:107
+#: src/lib/nvidia.c:100
 #, fuzzy, c-format
 msgid "ERROR: Cannot retrieve NVidia information\n"
 msgstr "ERREUR: échec de la récupération des températures nvidia\n"
 
-#: src/lib/lmsensor.c:43
+#: src/lib/lmsensor.c:44
 #, c-format
 msgid "ERROR: Can't get value of subfeature %s: %s\n"
 msgstr ""
 "ERREUR: Impossible de récuperer la valeur de la sous-fonctionnalité %s: %s\n"
 
-#: src/lib/lmsensor.c:122
+#: src/lib/lmsensor.c:126
 #, c-format
 msgid "ERROR: create_sensor, wrong feature type\n"
 msgstr "ERREUR: create_sensor, mauvais type de fonctionnalité\n"
 
-#: src/lib/lmsensor.c:166
+#: src/lib/lmsensor.c:209
 #, c-format
 msgid "ERROR: lm-sensors initialization failure: %s\n"
 msgstr "ERREUR: échec de l'initialisation de lm-sensors: %s\n"
 
-#: src/lib/psensor.c:448
+#: src/lib/psensor.c:422
 msgid "C"
 msgstr ""
 
-#: src/lib/psensor.c:451
+#: src/lib/psensor.c:425
 msgid "RPM"
 msgstr ""
 
@@ -474,6 +490,10 @@ msgstr "Dessiner la courbe de la sonde"
 msgid "°C"
 msgstr "°C"
 
+#, fuzzy
+#~ msgid "ERROR: lmsensor init failure: %s\n"
+#~ msgstr "ERREUR: Echec de l'initialisation de 'lm-sensors'\n"
+
 #~ msgid "LUATPL Error: failed to load Lua script: %s.\n"
 #~ msgstr "LUATPL Erreur: échec du chargement du script LUA: %s.\n"
 
@@ -492,9 +512,6 @@ msgstr "°C"
 #~ msgid "LUATPL Error: code: %d.\n"
 #~ msgstr "LUATPL Erreur: code: %d.\n"
 
-#~ msgid "ERROR: nvidia initialization failure\n"
-#~ msgstr "ERREUR: échec de l'initialisation nvidia\n"
-
 #~ msgid "ERROR: nvidia initialization failure: %d\n"
 #~ msgstr "ERREUR: échec de l'initialisation nvidia: %d\n"
 
index 91bf893..4fd45d0 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2011-07-13 11:01+0200\n"
+"POT-Creation-Date: 2011-07-18 18:20+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/main.c:72 src/server/server.c:76
+#: src/main.c:73 src/server/server.c:76
 #, c-format
 msgid ""
 "Copyright (C) %s jeanfi@gmail.com\n"
@@ -27,54 +27,49 @@ msgid ""
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: src/main.c:82 src/server/server.c:86
+#: src/main.c:83 src/server/server.c:86
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
 msgstr ""
 
-#: src/main.c:84
+#: src/main.c:85
 msgid ""
 "psensor is a GTK application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
 msgstr ""
 
-#: src/main.c:88
+#: src/main.c:89
 msgid "Options:"
 msgstr ""
 
-#: src/main.c:89 src/server/server.c:93
+#: src/main.c:90 src/server/server.c:93
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
 msgstr ""
 
-#: src/main.c:95
+#: src/main.c:96
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server, example: http://"
 "hostname:3131"
 msgstr ""
 
-#: src/main.c:101 src/server/server.c:106
+#: src/main.c:102 src/server/server.c:106
 #, c-format
 msgid "Report bugs to: %s\n"
 msgstr ""
 
-#: src/main.c:103 src/server/server.c:108
+#: src/main.c:104 src/server/server.c:108
 #, c-format
 msgid "%s home page: <%s>\n"
 msgstr ""
 
-#: src/main.c:323 src/server/server.c:346
+#: src/main.c:326 src/server/server.c:346
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr ""
 
-#: src/main.c:346
-#, c-format
-msgid "ERROR: lmsensor init failure: %s\n"
-msgstr ""
-
-#: src/main.c:357
+#: src/main.c:355
 #, c-format
 msgid "ERROR: Not compiled with remote sensor support.\n"
 msgstr ""
@@ -260,22 +255,42 @@ msgstr ""
 msgid "URL: http://localhost:%d\n"
 msgstr ""
 
+#: src/lib/amd.c:159
+#, c-format
+msgid "ERROR: ADL library not found!\n"
+msgstr ""
+
+#: src/lib/amd.c:184
+#, c-format
+msgid "ERROR: ADL's API is missing!\n"
+msgstr ""
+
+#: src/lib/amd.c:193
+#, c-format
+msgid "ERROR: ADL Initialization Error!\n"
+msgstr ""
+
+#: src/lib/amd.c:201
+#, c-format
+msgid "ERROR: Cannot get the number of adapters!\n"
+msgstr ""
+
 #: src/lib/hdd.c:59
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open socket\n"
+msgid "ERROR: hdd fetch, failed to open socket\n"
 msgstr ""
 
 #: src/lib/hdd.c:73
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open connection\n"
+msgid "ERROR: hdd fetch, failed to open connection\n"
 msgstr ""
 
-#: src/lib/hdd.c:182
+#: src/lib/hdd.c:183
 #, c-format
 msgid "ERROR: wrong hdd string: %s"
 msgstr ""
 
-#: src/lib/hdd.c:252
+#: src/lib/hdd.c:253
 #, c-format
 msgid "ERROR: wrong hdd string: %s\n"
 msgstr ""
@@ -285,36 +300,36 @@ msgstr ""
 msgid "ERROR: failed to retrieve nvidia temperature\n"
 msgstr ""
 
-#: src/lib/nvidia.c:99
+#: src/lib/nvidia.c:92
 #, c-format
 msgid "ERROR: Cannot open connection to X Server\n"
 msgstr ""
 
-#: src/lib/nvidia.c:107
+#: src/lib/nvidia.c:100
 #, c-format
 msgid "ERROR: Cannot retrieve NVidia information\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:43
+#: src/lib/lmsensor.c:44
 #, c-format
 msgid "ERROR: Can't get value of subfeature %s: %s\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:122
+#: src/lib/lmsensor.c:126
 #, c-format
 msgid "ERROR: create_sensor, wrong feature type\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:166
+#: src/lib/lmsensor.c:209
 #, c-format
 msgid "ERROR: lm-sensors initialization failure: %s\n"
 msgstr ""
 
-#: src/lib/psensor.c:448
+#: src/lib/psensor.c:422
 msgid "C"
 msgstr ""
 
-#: src/lib/psensor.c:451
+#: src/lib/psensor.c:425
 msgid "RPM"
 msgstr ""
 
index 5cd299a..44e129c 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2011-07-13 11:01+0200\n"
+"POT-Creation-Date: 2011-07-18 18:20+0200\n"
 "PO-Revision-Date: 2011-04-10 13:11+0000\n"
 "Last-Translator: zeugma <Unknown>\n"
 "Language-Team: Turkish <tr@li.org>\n"
@@ -18,7 +18,7 @@ msgstr ""
 "X-Launchpad-Export-Date: 2011-04-11 05:41+0000\n"
 "X-Generator: Launchpad (build 12735)\n"
 
-#: src/main.c:72 src/server/server.c:76
+#: src/main.c:73 src/server/server.c:76
 #, c-format
 msgid ""
 "Copyright (C) %s jeanfi@gmail.com\n"
@@ -28,54 +28,49 @@ msgid ""
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: src/main.c:82 src/server/server.c:86
+#: src/main.c:83 src/server/server.c:86
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
 msgstr "Kullanım: %s [SEÇENEK]...\n"
 
-#: src/main.c:84
+#: src/main.c:85
 msgid ""
 "psensor is a GTK application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
 msgstr ""
 
-#: src/main.c:88
+#: src/main.c:89
 msgid "Options:"
 msgstr ""
 
-#: src/main.c:89 src/server/server.c:93
+#: src/main.c:90 src/server/server.c:93
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
 msgstr ""
 
-#: src/main.c:95
+#: src/main.c:96
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server, example: http://"
 "hostname:3131"
 msgstr ""
 
-#: src/main.c:101 src/server/server.c:106
+#: src/main.c:102 src/server/server.c:106
 #, c-format
 msgid "Report bugs to: %s\n"
 msgstr "Hataları rapor et:%s\n"
 
-#: src/main.c:103 src/server/server.c:108
+#: src/main.c:104 src/server/server.c:108
 #, c-format
 msgid "%s home page: <%s>\n"
 msgstr "%s ana sayfa: <%s>\n"
 
-#: src/main.c:323 src/server/server.c:346
+#: src/main.c:326 src/server/server.c:346
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr "Daha fazla bilgi için `%s --help' yazın.\n"
 
-#: src/main.c:346
-#, c-format
-msgid "ERROR: lmsensor init failure: %s\n"
-msgstr ""
-
-#: src/main.c:357
+#: src/main.c:355
 #, c-format
 msgid "ERROR: Not compiled with remote sensor support.\n"
 msgstr ""
@@ -265,22 +260,42 @@ msgstr ""
 msgid "URL: http://localhost:%d\n"
 msgstr ""
 
+#: src/lib/amd.c:159
+#, c-format
+msgid "ERROR: ADL library not found!\n"
+msgstr ""
+
+#: src/lib/amd.c:184
+#, c-format
+msgid "ERROR: ADL's API is missing!\n"
+msgstr ""
+
+#: src/lib/amd.c:193
+#, c-format
+msgid "ERROR: ADL Initialization Error!\n"
+msgstr ""
+
+#: src/lib/amd.c:201
+#, c-format
+msgid "ERROR: Cannot get the number of adapters!\n"
+msgstr ""
+
 #: src/lib/hdd.c:59
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open socket\n"
+msgid "ERROR: hdd fetch, failed to open socket\n"
 msgstr ""
 
 #: src/lib/hdd.c:73
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open connection\n"
+msgid "ERROR: hdd fetch, failed to open connection\n"
 msgstr ""
 
-#: src/lib/hdd.c:182
+#: src/lib/hdd.c:183
 #, c-format
 msgid "ERROR: wrong hdd string: %s"
 msgstr ""
 
-#: src/lib/hdd.c:252
+#: src/lib/hdd.c:253
 #, c-format
 msgid "ERROR: wrong hdd string: %s\n"
 msgstr ""
@@ -290,36 +305,36 @@ msgstr ""
 msgid "ERROR: failed to retrieve nvidia temperature\n"
 msgstr ""
 
-#: src/lib/nvidia.c:99
+#: src/lib/nvidia.c:92
 #, c-format
 msgid "ERROR: Cannot open connection to X Server\n"
 msgstr ""
 
-#: src/lib/nvidia.c:107
+#: src/lib/nvidia.c:100
 #, c-format
 msgid "ERROR: Cannot retrieve NVidia information\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:43
+#: src/lib/lmsensor.c:44
 #, c-format
 msgid "ERROR: Can't get value of subfeature %s: %s\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:122
+#: src/lib/lmsensor.c:126
 #, c-format
 msgid "ERROR: create_sensor, wrong feature type\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:166
+#: src/lib/lmsensor.c:209
 #, c-format
 msgid "ERROR: lm-sensors initialization failure: %s\n"
 msgstr ""
 
-#: src/lib/psensor.c:448
+#: src/lib/psensor.c:422
 msgid "C"
 msgstr ""
 
-#: src/lib/psensor.c:451
+#: src/lib/psensor.c:425
 msgid "RPM"
 msgstr ""
 
index be8c742..bdd9b20 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: psensor 0.6.0.10\n"
 "Report-Msgid-Bugs-To: jeanfi@gmail.com\n"
-"POT-Creation-Date: 2011-07-13 11:01+0200\n"
+"POT-Creation-Date: 2011-07-18 18:20+0200\n"
 "PO-Revision-Date: 2011-06-06 08:57+0000\n"
 "Last-Translator: royclark <Unknown>\n"
 "Language-Team: Chinese (simplified)\n"
@@ -18,7 +18,7 @@ msgstr ""
 "X-Launchpad-Export-Date: 2011-06-06 09:00+0000\n"
 "X-Generator: Launchpad (build 13144)\n"
 
-#: src/main.c:72 src/server/server.c:76
+#: src/main.c:73 src/server/server.c:76
 #, c-format
 msgid ""
 "Copyright (C) %s jeanfi@gmail.com\n"
@@ -28,22 +28,22 @@ msgid ""
 "There is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: src/main.c:82 src/server/server.c:86
+#: src/main.c:83 src/server/server.c:86
 #, c-format
 msgid "Usage: %s [OPTION]...\n"
 msgstr "用法:%s [选项]...\n"
 
-#: src/main.c:84
+#: src/main.c:85
 msgid ""
 "psensor is a GTK application for monitoring hardware sensors, including "
 "temperatures and fan speeds."
 msgstr "psensor 是一个 GTK 程序,用来监视硬件传感器,包括温度和风扇转速。"
 
-#: src/main.c:88
+#: src/main.c:89
 msgid "Options:"
 msgstr ""
 
-#: src/main.c:89 src/server/server.c:93
+#: src/main.c:90 src/server/server.c:93
 msgid ""
 "  -h, --help          display this help and exit\n"
 "  -v, --version       display version information and exit"
@@ -51,33 +51,28 @@ msgstr ""
 "  -h, --help 显示这个帮助并退出\n"
 "  -v, --version 显示版本信息并退出"
 
-#: src/main.c:95
+#: src/main.c:96
 msgid ""
 "  -u, --url=URL       the URL of the psensor-server, example: http://"
 "hostname:3131"
 msgstr "  -u, --url=URL psensor服务器的 URL ,比如:http://hostname:3131"
 
-#: src/main.c:101 src/server/server.c:106
+#: src/main.c:102 src/server/server.c:106
 #, c-format
 msgid "Report bugs to: %s\n"
 msgstr ""
 
-#: src/main.c:103 src/server/server.c:108
+#: src/main.c:104 src/server/server.c:108
 #, c-format
 msgid "%s home page: <%s>\n"
 msgstr ""
 
-#: src/main.c:323 src/server/server.c:346
+#: src/main.c:326 src/server/server.c:346
 #, c-format
 msgid "Try `%s --help' for more information.\n"
 msgstr ""
 
-#: src/main.c:346
-#, c-format
-msgid "ERROR: lmsensor init failure: %s\n"
-msgstr ""
-
-#: src/main.c:357
+#: src/main.c:355
 #, c-format
 msgid "ERROR: Not compiled with remote sensor support.\n"
 msgstr ""
@@ -264,22 +259,42 @@ msgstr ""
 msgid "URL: http://localhost:%d\n"
 msgstr ""
 
+#: src/lib/amd.c:159
+#, c-format
+msgid "ERROR: ADL library not found!\n"
+msgstr ""
+
+#: src/lib/amd.c:184
+#, c-format
+msgid "ERROR: ADL's API is missing!\n"
+msgstr ""
+
+#: src/lib/amd.c:193
+#, c-format
+msgid "ERROR: ADL Initialization Error!\n"
+msgstr ""
+
+#: src/lib/amd.c:201
+#, c-format
+msgid "ERROR: Cannot get the number of adapters!\n"
+msgstr ""
+
 #: src/lib/hdd.c:59
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open socket\n"
+msgid "ERROR: hdd fetch, failed to open socket\n"
 msgstr ""
 
 #: src/lib/hdd.c:73
 #, c-format
-msgid "ERROR: hdd_fetch, failed to open connection\n"
+msgid "ERROR: hdd fetch, failed to open connection\n"
 msgstr ""
 
-#: src/lib/hdd.c:182
+#: src/lib/hdd.c:183
 #, c-format
 msgid "ERROR: wrong hdd string: %s"
 msgstr ""
 
-#: src/lib/hdd.c:252
+#: src/lib/hdd.c:253
 #, c-format
 msgid "ERROR: wrong hdd string: %s\n"
 msgstr ""
@@ -289,36 +304,36 @@ msgstr ""
 msgid "ERROR: failed to retrieve nvidia temperature\n"
 msgstr ""
 
-#: src/lib/nvidia.c:99
+#: src/lib/nvidia.c:92
 #, c-format
 msgid "ERROR: Cannot open connection to X Server\n"
 msgstr ""
 
-#: src/lib/nvidia.c:107
+#: src/lib/nvidia.c:100
 #, c-format
 msgid "ERROR: Cannot retrieve NVidia information\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:43
+#: src/lib/lmsensor.c:44
 #, c-format
 msgid "ERROR: Can't get value of subfeature %s: %s\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:122
+#: src/lib/lmsensor.c:126
 #, c-format
 msgid "ERROR: create_sensor, wrong feature type\n"
 msgstr ""
 
-#: src/lib/lmsensor.c:166
+#: src/lib/lmsensor.c:209
 #, c-format
 msgid "ERROR: lm-sensors initialization failure: %s\n"
 msgstr ""
 
-#: src/lib/psensor.c:448
+#: src/lib/psensor.c:422
 msgid "C"
 msgstr ""
 
-#: src/lib/psensor.c:451
+#: src/lib/psensor.c:425
 msgid "RPM"
 msgstr ""
 
index 511fe34..bf596dc 100644 (file)
@@ -1,8 +1,9 @@
 noinst_LIBRARIES = libpsensor.a
 
-libpsensor_a_CFLAGS = -pedantic -Werror
+libpsensor_a_CFLAGS = -Werror
 
 libpsensor_a_SOURCES = \
+       amd.h \
        measure.h measure.c \
        color.h color.c \
        psensor.h psensor.c\
@@ -17,4 +18,10 @@ endif
 if LIBATIADL
 LIBS += $(LIBATIADL_LIBS)
 AM_CPPFLAGS = $(LIBATIADL_CFLAGS)
-endif
\ No newline at end of file
+else
+libpsensor_a_CFLAGS += -pedantic
+endif
+
+EXTRA_DIST=$(libpsensor_a_SOURCES) \
+       amd.c \
+       nvidia.c
\ No newline at end of file
index 29dace8..64027fd 100644 (file)
@@ -36,6 +36,7 @@ build_triplet = @build@
 host_triplet = @host@
 @NVIDIA_TRUE@am__append_1 = nvidia.c
 @LIBATIADL_TRUE@am__append_2 = $(LIBATIADL_LIBS)
+@LIBATIADL_FALSE@am__append_3 = -pedantic
 subdir = src/lib
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -51,9 +52,9 @@ AR = ar
 ARFLAGS = cru
 libpsensor_a_AR = $(AR) $(ARFLAGS)
 libpsensor_a_LIBADD =
-am__libpsensor_a_SOURCES_DIST = measure.h measure.c color.h color.c \
-       psensor.h psensor.c hdd.h hdd.c nvidia.h lmsensor.h lmsensor.c \
-       nvidia.c
+am__libpsensor_a_SOURCES_DIST = amd.h measure.h measure.c color.h \
+       color.c psensor.h psensor.c hdd.h hdd.c nvidia.h lmsensor.h \
+       lmsensor.c nvidia.c
 @NVIDIA_TRUE@am__objects_1 = libpsensor_a-nvidia.$(OBJEXT)
 am_libpsensor_a_OBJECTS = libpsensor_a-measure.$(OBJEXT) \
        libpsensor_a-color.$(OBJEXT) libpsensor_a-psensor.$(OBJEXT) \
@@ -218,11 +219,15 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 noinst_LIBRARIES = libpsensor.a
-libpsensor_a_CFLAGS = -pedantic -Werror
-libpsensor_a_SOURCES = measure.h measure.c color.h color.c psensor.h \
-       psensor.c hdd.h hdd.c nvidia.h lmsensor.h lmsensor.c \
+libpsensor_a_CFLAGS = -Werror $(am__append_3)
+libpsensor_a_SOURCES = amd.h measure.h measure.c color.h color.c \
+       psensor.h psensor.c hdd.h hdd.c nvidia.h lmsensor.h lmsensor.c \
        $(am__append_1)
 @LIBATIADL_TRUE@AM_CPPFLAGS = $(LIBATIADL_CFLAGS)
+EXTRA_DIST = $(libpsensor_a_SOURCES) \
+       amd.c \
+       nvidia.c
+
 all: all-am
 
 .SUFFIXES:
diff --git a/src/lib/amd.c b/src/lib/amd.c
new file mode 100644 (file)
index 0000000..93428b8
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+    Copyright (C) 2010-2011 thgreasi@gmail.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301 USA
+*/
+#ifndef LINUX
+#define LINUX 1
+#endif
+#ifdef HAVE_LIBATIADL
+       /* AMD id for the aticonfig */
+       int amd_id;
+#endif
+
+#include <locale.h>
+#include <libintl.h>
+#define _(str) gettext(str)
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <adl_sdk.h>
+
+#include "psensor.h"
+
+typedef int (*ADL_MAIN_CONTROL_CREATE)(ADL_MAIN_MALLOC_CALLBACK, int);
+typedef int (*ADL_MAIN_CONTROL_DESTROY)();
+typedef int (*ADL_ADAPTER_NUMBEROFADAPTERS_GET) (int *);
+typedef int (*ADL_ADAPTER_ADAPTERINFO_GET) (LPAdapterInfo, int);
+typedef int (*ADL_ADAPTER_ACTIVE_GET) (int, int*);
+typedef int (*ADL_OVERDRIVE5_TEMPERATURE_GET) (int, int, ADLTemperature*);
+typedef int (*ADL_OVERDRIVE5_FANSPEED_GET) (int, int, ADLFanSpeedValue*);
+
+static ADL_MAIN_CONTROL_CREATE            adl_main_control_create;
+static ADL_MAIN_CONTROL_DESTROY           adl_main_control_destroy;
+static ADL_ADAPTER_NUMBEROFADAPTERS_GET   adl_adapter_numberofadapters_get;
+static ADL_ADAPTER_ADAPTERINFO_GET        adl_adapter_adapterinfo_get;
+static ADL_ADAPTER_ACTIVE_GET             adl_adapter_active_get;
+static ADL_OVERDRIVE5_TEMPERATURE_GET     adl_overdrive5_temperature_get;
+static ADL_OVERDRIVE5_FANSPEED_GET        adl_overdrive5_fanspeed_get;
+
+static void *hdll;
+static int adl_main_control_done;
+static int *active_amd_adapters;
+
+/* Memory allocation function */
+static void __stdcall *adl_main_memory_alloc(int isize)
+{
+    void *lpbuffer = malloc(isize);
+    return lpbuffer;
+}
+
+/* Optional Memory de-allocation function */
+static void __stdcall adl_main_memory_free(void **lpbuffer)
+{
+       if (*lpbuffer) {
+               free(*lpbuffer);
+               *lpbuffer = NULL;
+       }
+}
+
+static void *getprocaddress(void *plibrary, const char * name)
+{
+    return dlsym(plibrary, name);
+}
+
+/*
+  Returns the temperature (Celcius) of an AMD/Ati GPU.
+*/
+static double get_temp(struct psensor *sensor)
+{
+       ADLTemperature temperature;
+
+       temperature.iSize = sizeof(ADLTemperature);
+       temperature.iTemperature = -273;
+       if (ADL_OK != adl_overdrive5_temperature_get(sensor->amd_id,
+                0, &temperature))
+               return UNKNOWN_DBL_VALUE;
+
+       return temperature.iTemperature/1000;
+}
+
+static double get_fanspeed(struct psensor *sensor)
+{
+       ADLFanSpeedValue fanspeedvalue;
+
+       fanspeedvalue.iSize = sizeof(ADLFanSpeedValue);
+       fanspeedvalue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_RPM;
+       fanspeedvalue.iFanSpeed = -1;
+       if (ADL_OK != adl_overdrive5_fanspeed_get(sensor->amd_id,
+                0, &fanspeedvalue))
+               return UNKNOWN_DBL_VALUE;
+
+       return fanspeedvalue.iFanSpeed;
+}
+
+static struct psensor *create_sensor(int id, int values_len)
+{
+       char name[200];
+       char *sid;
+       int sensor_type;
+
+       struct psensor *s;
+
+       if (id & 1) {/* odd number ids represent fan sensors */
+               id = id >> 1;
+               sprintf(name, "GPU%dfan", id);
+               sensor_type = SENSOR_TYPE_AMD_FAN;
+       } else {/* even number ids represent temperature sensors */
+               id = id >> 1;
+               sprintf(name, "GPU%dtemp", id);
+               sensor_type = SENSOR_TYPE_AMD_TEMP;
+       }
+
+       sid = malloc(strlen("AMD") + 1 + strlen(name) + 1);
+       sprintf(sid, "AMD %s", name);
+
+       s = psensor_create(sid, strdup(name),
+                          sensor_type, values_len);
+
+       s->amd_id = active_amd_adapters[id];
+
+       return s;
+}
+
+/*
+  Returns the number of AMD/Ati GPU sensors (temperature and fan
+  speed).
+
+  Return 0 if no AMD/Ati gpus or cannot get information.
+*/
+static int init()
+{
+       LPAdapterInfo lpadapterinfo = NULL;
+       int  i, inumberadapters, inumberadaptersactive = 0;
+       int lpstatus, iadapterindex;
+
+       hdll = NULL;
+       adl_main_control_done = 0;
+       active_amd_adapters = NULL;
+       hdll = dlopen("libatiadlxx.so", RTLD_LAZY|RTLD_GLOBAL);
+
+       if (!hdll) {
+               fprintf(stderr,
+                       _("ERROR: ADL library not found!\n"));
+               return 0;
+       }
+
+       adl_main_control_create = (ADL_MAIN_CONTROL_CREATE)
+                getprocaddress(hdll, "ADL_Main_Control_Create");
+       adl_main_control_destroy = (ADL_MAIN_CONTROL_DESTROY)
+                getprocaddress(hdll, "ADL_Main_Control_Destroy");
+       adl_adapter_numberofadapters_get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET)
+                getprocaddress(hdll, "ADL_Adapter_NumberOfAdapters_Get");
+       adl_adapter_adapterinfo_get = (ADL_ADAPTER_ADAPTERINFO_GET)
+                getprocaddress(hdll, "ADL_Adapter_AdapterInfo_Get");
+       adl_adapter_active_get = (ADL_ADAPTER_ACTIVE_GET)
+                getprocaddress(hdll, "ADL_Adapter_Active_Get");
+       adl_overdrive5_temperature_get = (ADL_OVERDRIVE5_TEMPERATURE_GET)
+                getprocaddress(hdll, "ADL_Overdrive5_Temperature_Get");
+       adl_overdrive5_fanspeed_get = (ADL_OVERDRIVE5_FANSPEED_GET)
+                getprocaddress(hdll, "ADL_Overdrive5_FanSpeed_Get");
+       if (!adl_main_control_create ||
+               !adl_main_control_destroy ||
+               !adl_adapter_numberofadapters_get ||
+               !adl_adapter_adapterinfo_get ||
+               !adl_overdrive5_temperature_get ||
+               !adl_overdrive5_fanspeed_get) {
+               fprintf(stderr,
+                       _("ERROR: ADL's API is missing!\n"));
+               return 0;
+       }
+
+       /* Initialize ADL. The second parameter is 1, which means:
+          retrieve adapter information only for adapters that
+          are physically present and enabled in the system */
+       if (ADL_OK != adl_main_control_create(adl_main_memory_alloc, 1)) {
+               fprintf(stderr,
+                       _("ERROR: ADL Initialization Error!\n"));
+               return 0;
+       }
+       adl_main_control_done = 1;
+
+       /* Obtain the number of adapters for the system */
+       if (ADL_OK != adl_adapter_numberofadapters_get(&inumberadapters)) {
+               fprintf(stderr,
+                       _("ERROR: Cannot get the number of adapters!\n"));
+               return 0;
+       }
+
+       if (!inumberadapters)
+               return 0;
+
+    lpadapterinfo = malloc(sizeof(AdapterInfo) * inumberadapters);
+    memset(lpadapterinfo, '\0', sizeof(AdapterInfo) * inumberadapters);
+
+    /* Get the AdapterInfo structure for all adapters in the system */
+    adl_adapter_adapterinfo_get(lpadapterinfo,
+                sizeof(AdapterInfo) * inumberadapters);
+
+    /* Repeat for all available adapters in the system */
+    for (i = 0; i < inumberadapters; i++) {
+               iadapterindex = lpadapterinfo[i].iAdapterIndex;
+               if (ADL_OK != adl_adapter_active_get(iadapterindex, &lpstatus))
+                       continue;
+               if (lpstatus != ADL_TRUE)
+                       /* count only if the adapter is active */
+                       continue;
+
+               if (!active_amd_adapters) {
+                       active_amd_adapters = (int *) malloc(sizeof(int));
+                       inumberadaptersactive = 1;
+               } else {
+                       ++inumberadaptersactive;
+                       active_amd_adapters =
+                                (int *) realloc(active_amd_adapters,
+                                sizeof(int)*inumberadaptersactive);
+               }
+               active_amd_adapters[inumberadaptersactive-1] = iadapterindex;
+    }
+
+    adl_main_memory_free((void **) &lpadapterinfo);
+
+    /* Each Adapter has one GPU temperature
+       sensor and one fan control sensor */
+    return 2*inumberadaptersactive;
+}
+
+void amd_psensor_list_update(struct psensor **sensors)
+{
+       struct psensor **ss, *s;
+
+       ss = sensors;
+       while (*ss) {
+               s = *ss;
+
+               if (s->type == SENSOR_TYPE_AMD_TEMP)
+                       psensor_set_current_value(s, get_temp(s));
+               else if (s->type == SENSOR_TYPE_AMD_FAN)
+                       psensor_set_current_value(s, get_fanspeed(s));
+
+               ss++;
+       }
+}
+
+struct psensor * *
+amd_psensor_list_add(struct psensor **sensors, int values_len)
+{
+       int i, n;
+       struct psensor **tmp, **ss, *s;
+
+       n = init();
+
+       ss = sensors;
+       for (i = 0; i < n; i++) {
+               s = create_sensor(i, values_len);
+
+               tmp = psensor_list_add(ss, s);
+
+               if (ss != tmp)
+                       free(ss);
+
+               ss = tmp;
+       }
+
+       return ss;
+}
+
+void amd_cleanup()
+{
+       if (hdll) {
+               if (adl_main_control_done)
+                       adl_main_control_destroy();
+               dlclose(hdll);
+       }
+
+       if (active_amd_adapters) {
+               free(active_amd_adapters);
+               active_amd_adapters = NULL;
+       }
+}
diff --git a/src/lib/amd.h b/src/lib/amd.h
new file mode 100644 (file)
index 0000000..57e1149
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+    Copyright (C) 2010-2011 thgreasi@gmail.com
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301 USA
+*/
+#ifndef LINUX
+#define LINUX 1
+#endif
+#ifdef HAVE_LIBATIADL
+       /* AMD id for the aticonfig */
+       int amd_id;
+#endif
+
+#include <locale.h>
+#include <libintl.h>
+#define _(str) gettext(str)
+
+#include <adl_sdk.h>
+#include <dlfcn.h>     /* dyopen, dlsym, dlclose */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>    /* memeset */
+
+#include "psensor.h"
+
+/* Definitions of the used function pointers.
+        Add more if you use other ADL APIs */
+typedef int (*ADL_MAIN_CONTROL_CREATE)(ADL_MAIN_MALLOC_CALLBACK, int);
+typedef int (*ADL_MAIN_CONTROL_DESTROY)();
+typedef int (*ADL_ADAPTER_NUMBEROFADAPTERS_GET) (int *);
+typedef int (*ADL_ADAPTER_ADAPTERINFO_GET) (LPAdapterInfo, int);
+typedef int (*ADL_ADAPTER_ACTIVE_GET) (int, int*);
+typedef int (*ADL_OVERDRIVE5_TEMPERATURE_GET) (int, int, ADLTemperature*);
+typedef int (*ADL_OVERDRIVE5_FANSPEED_GET) (int, int, ADLFanSpeedValue*);
+
+static ADL_MAIN_CONTROL_CREATE            adl_main_control_create;
+static ADL_MAIN_CONTROL_DESTROY           adl_main_control_destroy;
+static ADL_ADAPTER_NUMBEROFADAPTERS_GET   adl_adapter_numberofadapters_get;
+static ADL_ADAPTER_ADAPTERINFO_GET        adl_adapter_adapterinfo_get;
+static ADL_ADAPTER_ACTIVE_GET             adl_adapter_active_get;
+static ADL_OVERDRIVE5_TEMPERATURE_GET     adl_overdrive5_temperature_get;
+static ADL_OVERDRIVE5_FANSPEED_GET        adl_overdrive5_fanspeed_get;
+
+static void *hdll;
+static int adl_main_control_done;
+static int *active_amd_adapters;
+
+/* Memory allocation function */
+static void __stdcall *adl_main_memory_alloc(int isize)
+{
+    void *lpbuffer = malloc(isize);
+    return lpbuffer;
+}
+
+/* Optional Memory de-allocation function */
+static void __stdcall adl_main_memory_free(void** lpbuffer)
+{
+       if (*lpbuffer) {
+               free(*lpbuffer);
+               *lpbuffer = NULL;
+       }
+}
+
+static void *getprocaddress(void * plibrary, const char * name)
+{
+    return dlsym(plibrary, name);
+}
+
+/*
+  Returns the temperature (Celcius) of an AMD/Ati GPU.
+*/
+static int get_temp(struct psensor *sensor)
+{
+       ADLTemperature temperature;
+
+       temperature.iSize = sizeof(ADLTemperature);
+       temperature.iTemperature = -273;
+       if (ADL_OK != adl_overdrive5_temperature_get(sensor->amd_id,
+                0, &temperature))
+               return -273;
+
+       return temperature.iTemperature/1000;
+}
+
+static int get_fanspeed(struct psensor *sensor)
+{
+       ADLFanSpeedValue fanspeedvalue;
+
+       fanspeedvalue.iSize = sizeof(ADLFanSpeedValue);
+       fanspeedvalue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_RPM;
+       fanspeedvalue.iFanSpeed = -1;
+       if (ADL_OK != adl_overdrive5_fanspeed_get(sensor->amd_id,
+                0, &fanspeedvalue))
+               return -1;
+
+       return fanspeedvalue.iFanSpeed;
+}
+
+static struct psensor *create_sensor(int id, int values_len)
+{
+       char name[200];
+       char *sid;
+       int sensor_type;
+
+       struct psensor *s;
+
+       if (id & 1) {/* odd number ids represent fan sensors */
+               id = id >> 1;
+               sprintf(name, "GPU%dfan", id);
+               sensor_type = SENSOR_TYPE_AMD_FAN;
+       } else {/* even number ids represent temperature sensors */
+               id = id >> 1;
+               sprintf(name, "GPU%dtemp", id);
+               sensor_type = SENSOR_TYPE_AMD_TEMP;
+       }
+
+       sid = malloc(strlen("AMD") + 1 + strlen(name) + 1);
+       sprintf(sid, "AMD %s", name);
+
+       s = psensor_create(sid, strdup(name),
+                          sensor_type, values_len);
+
+       s->amd_id = active_amd_adapters[id];
+
+       return s;
+}
+
+/*
+  Returns the number of AMD/Ati GPU sensors (temperature and fan speed).
+
+  Return 0 if no AMD/Ati gpus or cannot get information.
+*/
+static int init()
+{
+       LPAdapterInfo lpadapterinfo = NULL;
+       int  i, inumberadapters, inumberadaptersactive = 0;
+       int lpstatus, iadapterindex;
+
+       hdll = NULL;
+       adl_main_control_done = 0;
+       active_amd_adapters = NULL;
+       hdll = dlopen("libatiadlxx.so", RTLD_LAZY|RTLD_GLOBAL);
+
+
+       if (!hdll) {
+               fprintf(stderr,
+                       _("ERROR: ADL library not found!\n"));
+               return 0;
+       }
+
+       adl_main_control_create = (ADL_MAIN_CONTROL_CREATE)
+                getprocaddress(hdll, "ADL_Main_Control_Create");
+       adl_main_control_destroy = (ADL_MAIN_CONTROL_DESTROY)
+                getprocaddress(hdll, "ADL_Main_Control_Destroy");
+       adl_adapter_numberofadapters_get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET)
+                getprocaddress(hdll, "ADL_Adapter_NumberOfAdapters_Get");
+       adl_adapter_adapterinfo_get = (ADL_ADAPTER_ADAPTERINFO_GET)
+                getprocaddress(hdll, "ADL_Adapter_AdapterInfo_Get");
+       adl_adapter_active_get = (ADL_ADAPTER_ACTIVE_GET)
+                getprocaddress(hdll, "ADL_Adapter_Active_Get");
+       adl_overdrive5_temperature_get = (ADL_OVERDRIVE5_TEMPERATURE_GET)
+                getprocaddress(hdll, "ADL_Overdrive5_Temperature_Get");
+       adl_overdrive5_fanspeed_get = (ADL_OVERDRIVE5_FANSPEED_GET)
+                getprocaddress(hdll, "ADL_Overdrive5_FanSpeed_Get");
+       if (!adl_main_control_create ||
+               !adl_main_control_destroy ||
+               !adl_adapter_numberofadapters_get ||
+               !adl_adapter_adapterinfo_get ||
+               !adl_overdrive5_temperature_get ||
+               !adl_overdrive5_fanspeed_get) {
+               fprintf(stderr,
+                       _("ERROR: ADL's API is missing!\n"));
+               return 0;
+       }
+
+       /* Initialize ADL. The second parameter is 1, which means:
+          retrieve adapter information only for adapters that
+          are physically present and enabled in the system */
+       if (ADL_OK != adl_main_control_create(adl_main_memory_alloc, 1)) {
+               fprintf(stderr,
+                       _("ERROR: ADL Initialization Error!\n"));
+               return 0;
+       }
+       adl_main_control_done = 1;
+
+       /* Obtain the number of adapters for the system */
+       if (ADL_OK != adl_adapter_numberofadapters_get(&inumberadapters)) {
+               fprintf(stderr,
+                       _("ERROR: Cannot get the number of adapters!\n"));
+               return 0;
+       }
+
+       if (!inumberadapters)
+               return 0;
+
+    lpadapterinfo = malloc(sizeof(AdapterInfo) * inumberadapters);
+    memset(lpadapterinfo, '\0', sizeof(AdapterInfo) * inumberadapters);
+
+    /* Get the AdapterInfo structure for all adapters in the system */
+    adl_adapter_adapterinfo_get(lpadapterinfo,
+                sizeof(AdapterInfo) * inumberadapters);
+
+    /* Repeat for all available adapters in the system */
+    for (i = 0; i < inumberadapters; i++) {
+               iadapterindex = lpadapterinfo[i].iAdapterIndex;
+               if (ADL_OK != adl_adapter_active_get(iadapterindex, &lpstatus))
+                       continue;
+               if (lpstatus != ADL_TRUE)
+                       /* count only if the adapter is active */
+                       continue;
+
+               if (!active_amd_adapters) {
+                       active_amd_adapters = (int *) malloc(sizeof(int));
+                       inumberadaptersactive = 1;
+               } else {
+                       ++inumberadaptersactive;
+                       active_amd_adapters =
+                                (int *) realloc(active_amd_adapters,
+                                sizeof(int)*inumberadaptersactive);
+               }
+               active_amd_adapters[inumberadaptersactive-1] = iadapterindex;
+    }
+
+    adl_main_memory_free((void **) &lpadapterinfo);
+
+       /* Each Adapter has one GPU temperature
+        sensor and one fan control sensor */
+       return 2*inumberadaptersactive;
+}
+
+void amd_psensor_list_update(struct psensor **sensors)
+{
+       struct psensor **ss, *s;
+
+       ss = sensors;
+       while (*ss) {
+               s = *ss;
+
+               if (s->type == SENSOR_TYPE_AMD_TEMP)
+                       psensor_set_current_value(s, get_temp(s));
+               else if (s->type == SENSOR_TYPE_AMD_FAN)
+                       psensor_set_current_value(s, get_fanspeed(s));
+
+               ss++;
+       }
+}
+
+struct psensor * *
+amd_psensor_list_add(struct psensor **sensors, int values_len)
+{
+       int i, n;
+       struct psensor **tmp, **ss, *s;
+
+       n = init();
+
+       ss = sensors;
+       for (i = 0; i < n; i++) {
+               s = create_sensor(i, values_len);
+
+               tmp = psensor_list_add(ss, s);
+
+               if (ss != tmp)
+                       free(ss);
+
+               ss = tmp;
+       }
+
+       if (active_amd_adapters) {
+               free(active_amd_adapters);
+               active_amd_adapters = NULL;
+       }
+
+       return ss;
+}
+
+void amd_cleanup()
+{
+       if (hdll) {
+               if (adl_main_control_done)
+                       adl_main_control_destroy();
+               dlclose(hdll);
+       }
+       if (active_amd_adapters) {
+               free(active_amd_adapters);
+               active_amd_adapters = NULL;
+       }
+}
index 128dc02..3cd6956 100644 (file)
@@ -403,6 +403,12 @@ const char *psensor_type_to_str(unsigned int type)
        if (type & SENSOR_TYPE_NVIDIA)
                return "NVidia GPU Temperature";
 
+       if (type & SENSOR_TYPE_AMD_TEMP)
+               return "AMD GPU Temperature";
+
+       if (type & SENSOR_TYPE_AMD_FAN)
+               return "AMD GPU Fan Speed";
+
        if (type & SENSOR_TYPE_HDD_TEMP)
                return "HDD Temperature";
 
index 06df8cf..a0fef38 100644 (file)
@@ -34,7 +34,10 @@ enum psensor_type {
        SENSOR_TYPE_LMSENSOR_TEMP = 0x0100 | SENSOR_TYPE_TEMP,
        SENSOR_TYPE_NVIDIA = 0x0200 | SENSOR_TYPE_TEMP,
        SENSOR_TYPE_HDD_TEMP = 0x0400 | SENSOR_TYPE_TEMP,
-       SENSOR_TYPE_LMSENSOR_FAN = 0x0800 | SENSOR_TYPE_FAN
+       SENSOR_TYPE_LMSENSOR_FAN = 0x0800 | SENSOR_TYPE_FAN,
+       SENSOR_TYPE_AMD = 0x1000,
+       SENSOR_TYPE_AMD_TEMP = SENSOR_TYPE_AMD | SENSOR_TYPE_TEMP,
+       SENSOR_TYPE_AMD_FAN = SENSOR_TYPE_AMD | SENSOR_TYPE_FAN
 };
 
 struct psensor {
@@ -91,6 +94,10 @@ struct psensor {
        /* Nvidia id for the nvctrl */
        int nvidia_id;
 #endif
+#ifdef HAVE_LIBATIADL
+       /* AMD id for the aticonfig */
+       int amd_id;
+#endif
 
        char *url;
 };
index da7fdef..3a55482 100644 (file)
 #include "nvidia.h"
 #endif
 
+#ifdef HAVE_LIBATIADL
+#include "amd.h"
+#endif
+
 #ifdef HAVE_REMOTE_SUPPORT
 #include "rsensor.h"
 #endif
@@ -141,7 +145,9 @@ void update_psensor_measures(struct ui_psensor *ui)
 #ifdef HAVE_NVIDIA
                nvidia_psensor_list_update(sensors);
 #endif
-
+#ifdef HAVE_LIBATIADL
+               amd_psensor_list_update(sensors);
+#endif
                g_mutex_unlock(ui->sensors_mutex);
 
                sleep(cfg->sensor_update_interval);
@@ -354,6 +360,9 @@ int main(int argc, char **argv)
 #ifdef HAVE_NVIDIA
                ui.sensors = nvidia_psensor_list_add(ui.sensors, 600);
 #endif
+#ifdef HAVE_LIBATIADL
+               ui.sensors = amd_psensor_list_add(ui.sensors, 600);
+#endif
        }
 
        associate_preferences(ui.sensors);
@@ -396,6 +405,8 @@ int main(int argc, char **argv)
 #ifdef HAVE_NVIDIA
        nvidia_cleanup();
 #endif
-
+#ifdef HAVE_LIBATIADL
+       amd_cleanup();
+#endif
        return 0;
 }