Differenze tra le versioni di "Controllare la temperatura dell'hardware mediante le funzioni del API di libsensors"
Riga 19: | Riga 19: | ||
L'<I>Isteresi</i> è la capacità di molti chip di far scattare un allarme quando la temperatura supera il suo limite massimo e critico previsto per quel chip, e di far cessare l'allarme quando la temperatura scende al di sotto di quel limite critico. Quindi , oltre a ''tempX_max'', molti chip hanno una caratteristica secondaria: ''tempX_max_hyst'' e ''tempX_crit_hyst''. | L'<I>Isteresi</i> è la capacità di molti chip di far scattare un allarme quando la temperatura supera il suo limite massimo e critico previsto per quel chip, e di far cessare l'allarme quando la temperatura scende al di sotto di quel limite critico. Quindi , oltre a ''tempX_max'', molti chip hanno una caratteristica secondaria: ''tempX_max_hyst'' e ''tempX_crit_hyst''. | ||
+ | |||
+ | Per poter fruire delle risorse esterne della libreria ''libsensors'', si dovrà richiamare l'attuale libreria: ''libsensors.so.4.3.2'' . | ||
+ | |||
+ | |||
+ | ===Esempio pratico=== | ||
+ | Di seguito mostriamo un semplicissimo e breve esempio di codice per monitorare la temperatura dell'hardware: | ||
+ | Public Struct sensors_bus_id | ||
+ | type As Short | ||
+ | nr As Short | ||
+ | End Struct | ||
+ | |||
+ | Public Struct sensors_chip_name | ||
+ | prefix As Pointer | ||
+ | bus As Struct Sensors_bus_id | ||
+ | addr As Integer | ||
+ | path As Pointer | ||
+ | End Struct | ||
+ | |||
+ | Private scnm As New Sensors_chip_name | ||
+ | |||
+ | Public Struct sensors_feature | ||
+ | name As Pointer | ||
+ | number As Integer | ||
+ | type As Integer | ||
+ | first_subfeature As Integer ' Members below are For libsensors internal use only | ||
+ | padding1 As Integer | ||
+ | End Struct | ||
+ | |||
+ | Private sf As New Sensors_feature | ||
+ | |||
+ | Public Struct sensors_subfeature | ||
+ | name As Pointer | ||
+ | number As Integer | ||
+ | type As Integer | ||
+ | mapping As Integer | ||
+ | flags As Integer | ||
+ | End Struct | ||
+ | |||
+ | Private subf As New Sensors_subfeature | ||
+ | |||
+ | |||
+ | Private Const SENSORS_FEATURE_TEMP As Byte = 2 | ||
+ | Private Const SENSORS_MODE_R As Byte = 1 | ||
+ | |||
+ | |||
+ | Library "libsensors:4.3.2" | ||
+ | |||
+ | ' int sensors_init(FILE *input) | ||
+ | ' Load the configuration file and the detected chips list. If this returns a value unequal to zero, you are in trouble | ||
+ | Private Extern sensors_init(filename As File) As Integer | ||
+ | |||
+ | ' const sensors_chip_name *sensors_get_detected_chips(const sensors_chip_name *match, int *nr) | ||
+ | ' This function returns all detected chips that match a given chip name, one by one. If no chip name is provided, all detected chips are returned. | ||
+ | Private Extern sensors_get_detected_chips(scnMatch As Pointer, nrP As Pointer) As Sensors_chip_name | ||
+ | |||
+ | ' const sensors_feature * sensors_get_features(const sensors_chip_name *name, int *nr) | ||
+ | ' This returns all main features of a specific chip. nr is an internally used variable. Set it to zero to start at the begin of the list. | ||
+ | ' If no more features are found NULL is returned. | ||
+ | Private Extern sensors_get_features(chip_name As Sensors_chip_name, nrP As Pointer) As Sensors_feature | ||
+ | |||
+ | ' const sensors_subfeature * sensors_get_all_subfeatures(const sensors_chip_name *name, const sensors_feature *feature, int *nr) | ||
+ | ' This returns all subfeatures of a given main feature. nr is an internally used variable. | ||
+ | ' Set it to zero to start at the begin of the list. If no more features are found NULL is returned. | ||
+ | Private Extern sensors_get_all_subfeatures(chip_name As Sensors_chip_name, feature As Sensors_feature, nrP As Pointer) As Sensors_subfeature | ||
+ | |||
+ | ' int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, double *value) | ||
+ | ' Read the value of a subfeature of a certain chip. his function will return 0 on success, and <0 on failure. | ||
+ | Private Extern sensors_get_value(chip_name As Sensors_chip_name, subfeat_nr As Integer, value As Pointer) As Integer | ||
+ | |||
+ | ' int sensors_snprintf_chip_name(char *str, size_t size, const sensors_chip_name *chip) | ||
+ | ' prints a chip name from its internal representation. Return the number of characters printed on success (same as snprintf), <0 on error. | ||
+ | Private Extern sensors_snprintf_chip_name(strB As Byte[], size As Integer, chip As Sensors_chip_name) As Integer | ||
+ | |||
+ | ' const char* sensors_get_adapter_name (const sensors_bus_id * bus) | ||
+ | ' returns the adapter name of a bus number, as used within the sensors_chip_name structure. If it could not be found, it returns NULL. | ||
+ | Private Extern sensors_get_adapter_name(bus_id As Sensors_bus_id) As String | ||
+ | |||
+ | ' void sensors_cleanup(void) | ||
+ | ' cleans everything up: you can't access anything after this, until the next sensors_init() call! | ||
+ | Private Extern sensors_cleanup() | ||
+ | |||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim nomeB As New Byte[128] | ||
+ | Dim c, lung, f, s, rc As Integer | ||
+ | Dim valTemp As Float | ||
+ | |||
+ | |||
+ | If sensors_init(Null) <> 0 Then Print Error.Raise("Impossibile inizializzare la libreria 'libsensors' !") | ||
+ | |||
+ | |||
+ | scnm = sensors_get_detected_chips(0, VarPtr(c)) | ||
+ | |||
+ | lung = sensors_snprintf_chip_name(nomeB, 128, scnm) | ||
+ | Print nomeB.ToString(0, lung) | ||
+ | |||
+ | Print "Adapter: "; sensors_get_adapter_name(scnm.bus) | ||
+ | |||
+ | |||
+ | sf = sensors_get_features(scnm, VarPtr(f)) | ||
+ | |||
+ | Print "Tipo di sensore termico: "; sf_type(sf.type) | ||
+ | |||
+ | Print | ||
+ | |||
+ | |||
+ | subf = sensors_get_all_subfeatures(scnm, sf, VarPtr(s)) | ||
+ | If subf.flags And SENSORS_MODE_R Then | ||
+ | rc = sensors_get_value(scnm, subf.number, VarPtr(valTemp)) | ||
+ | If rc < 0 Then | ||
+ | Error.Raise("Errore nella lettura del valore !") | ||
+ | Else | ||
+ | Print String@(sf.name); " = "; valTemp; "°" | ||
+ | Endif | ||
+ | |||
+ | |||
+ | Endif | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Print ".........................................\n" | ||
+ | |||
+ | |||
+ | scnm = sensors_get_detected_chips(0, VarPtr(c)) | ||
+ | |||
+ | lung = sensors_snprintf_chip_name(nomeB, 128, scnm) | ||
+ | Print nomeB.ToString(0, lung) | ||
+ | |||
+ | Print "Adapter: "; sensors_get_adapter_name(scnm.bus) | ||
+ | |||
+ | Print "Tipo di sensore termico: "; sf_type(sf.type) | ||
+ | Print | ||
+ | |||
+ | If subf.flags And SENSORS_MODE_R Then | ||
+ | rc = sensors_get_value(scnm, subf.number, VarPtr(valTemp)) | ||
+ | If rc < 0 Then | ||
+ | Error.Raise("Errore nella lettura del valore !") | ||
+ | Else | ||
+ | Print "Temperatura CPU = "; valTemp; "°" | ||
+ | Endif | ||
+ | Endif | ||
+ | |||
+ | |||
+ | Print "'''''''''''''''''''''''''''''''''''''''''" | ||
+ | |||
+ | sensors_cleanup() | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | |||
+ | Private Function sf_type(numero As Byte) As String | ||
+ | |||
+ | Dim tipo As String | ||
+ | |||
+ | Select Case numero | ||
+ | Case 1 | ||
+ | tipo = "PII/Celeron Diode" | ||
+ | Case 2 | ||
+ | tipo = "3904 transistor" | ||
+ | Case 3 | ||
+ | tipo = "thermal diode" | ||
+ | Case 4 | ||
+ | tipo = "thermistor" | ||
+ | Case 5 | ||
+ | tipo = "AMD AMDSI" | ||
+ | Case 6 | ||
+ | tipo = "Intel PECI" | ||
+ | End Select | ||
+ | |||
+ | Return tipo | ||
+ | |||
+ | End | ||
Versione delle 13:06, 16 dic 2013
La libreria Libsensors mette a disposizioni risorse per poter effettuare controlli su alcune parti ed aspetti dell'hardware per Linux. In particolare, ad esempio, questa libreria consente di gestire e visualizzare i dati del sensore della temperatura dell'hardware principale.
In un dato sistema , ci possono essere uno o più chip di controllo hardware. I nomi delle funzioni sono standardizzati. Ogni funzione può a sua volta avere uno o più sub-caratteristiche , ognuna di esse rappresenta un attributo della funzione : valore di ingresso , limite inferiore , limite superiore, limite di allarme , ecc. I nomi delle sub-funzionalità sono anch'essi predefiniti. Le sub-caratteristiche effettivamente esistenti dipendono dal tipo di chip presente nel sistema hardware.
La descrizione chip, restituita dall'apposita funzione esterna sensors_snprintf_chip_name(), è formata da più elementi, separati da trattini. Il primo elemento è il tipo di chip, il secondo elemento è il nome del bus, e il terzo elemento è l'indirizzo esadecimale del chip.
Riguardo alla configurazione della temperatura dei chip essa può avere due specifici sub-caratteristiche:
- tipo di sensore di temperatura (tempX_type);
- valori di isteresi (tempX_max_hyst e tempX_crit_hyst).
I tipi di sensori termici disponibili sono:
1 PII/Celeron Diode
2 3904 transistor
3 thermal diode
4 thermistor
5 AMD AMDSI
6 Intel PECI
L'Isteresi è la capacità di molti chip di far scattare un allarme quando la temperatura supera il suo limite massimo e critico previsto per quel chip, e di far cessare l'allarme quando la temperatura scende al di sotto di quel limite critico. Quindi , oltre a tempX_max, molti chip hanno una caratteristica secondaria: tempX_max_hyst e tempX_crit_hyst.
Per poter fruire delle risorse esterne della libreria libsensors, si dovrà richiamare l'attuale libreria: libsensors.so.4.3.2 .
Esempio pratico
Di seguito mostriamo un semplicissimo e breve esempio di codice per monitorare la temperatura dell'hardware: Public Struct sensors_bus_id
type As Short nr As Short
End Struct
Public Struct sensors_chip_name
prefix As Pointer bus As Struct Sensors_bus_id addr As Integer path As Pointer
End Struct
Private scnm As New Sensors_chip_name
Public Struct sensors_feature
name As Pointer number As Integer type As Integer first_subfeature As Integer ' Members below are For libsensors internal use only padding1 As Integer
End Struct
Private sf As New Sensors_feature
Public Struct sensors_subfeature
name As Pointer number As Integer type As Integer mapping As Integer flags As Integer
End Struct
Private subf As New Sensors_subfeature
Private Const SENSORS_FEATURE_TEMP As Byte = 2
Private Const SENSORS_MODE_R As Byte = 1
Library "libsensors:4.3.2"
' int sensors_init(FILE *input) ' Load the configuration file and the detected chips list. If this returns a value unequal to zero, you are in trouble Private Extern sensors_init(filename As File) As Integer
' const sensors_chip_name *sensors_get_detected_chips(const sensors_chip_name *match, int *nr) ' This function returns all detected chips that match a given chip name, one by one. If no chip name is provided, all detected chips are returned. Private Extern sensors_get_detected_chips(scnMatch As Pointer, nrP As Pointer) As Sensors_chip_name
' const sensors_feature * sensors_get_features(const sensors_chip_name *name, int *nr) ' This returns all main features of a specific chip. nr is an internally used variable. Set it to zero to start at the begin of the list. ' If no more features are found NULL is returned. Private Extern sensors_get_features(chip_name As Sensors_chip_name, nrP As Pointer) As Sensors_feature
' const sensors_subfeature * sensors_get_all_subfeatures(const sensors_chip_name *name, const sensors_feature *feature, int *nr) ' This returns all subfeatures of a given main feature. nr is an internally used variable. ' Set it to zero to start at the begin of the list. If no more features are found NULL is returned. Private Extern sensors_get_all_subfeatures(chip_name As Sensors_chip_name, feature As Sensors_feature, nrP As Pointer) As Sensors_subfeature
' int sensors_get_value(const sensors_chip_name *name, int subfeat_nr, double *value) ' Read the value of a subfeature of a certain chip. his function will return 0 on success, and <0 on failure. Private Extern sensors_get_value(chip_name As Sensors_chip_name, subfeat_nr As Integer, value As Pointer) As Integer
' int sensors_snprintf_chip_name(char *str, size_t size, const sensors_chip_name *chip) ' prints a chip name from its internal representation. Return the number of characters printed on success (same as snprintf), <0 on error. Private Extern sensors_snprintf_chip_name(strB As Byte[], size As Integer, chip As Sensors_chip_name) As Integer
' const char* sensors_get_adapter_name (const sensors_bus_id * bus) ' returns the adapter name of a bus number, as used within the sensors_chip_name structure. If it could not be found, it returns NULL. Private Extern sensors_get_adapter_name(bus_id As Sensors_bus_id) As String
' void sensors_cleanup(void) ' cleans everything up: you can't access anything after this, until the next sensors_init() call! Private Extern sensors_cleanup()
Public Sub Main()
Dim nomeB As New Byte[128] Dim c, lung, f, s, rc As Integer Dim valTemp As Float
If sensors_init(Null) <> 0 Then Print Error.Raise("Impossibile inizializzare la libreria 'libsensors' !")
scnm = sensors_get_detected_chips(0, VarPtr(c))
lung = sensors_snprintf_chip_name(nomeB, 128, scnm) Print nomeB.ToString(0, lung) Print "Adapter: "; sensors_get_adapter_name(scnm.bus)
sf = sensors_get_features(scnm, VarPtr(f)) Print "Tipo di sensore termico: "; sf_type(sf.type) Print
subf = sensors_get_all_subfeatures(scnm, sf, VarPtr(s)) If subf.flags And SENSORS_MODE_R Then rc = sensors_get_value(scnm, subf.number, VarPtr(valTemp)) If rc < 0 Then Error.Raise("Errore nella lettura del valore !") Else Print String@(sf.name); " = "; valTemp; "°" Endif
Endif
Print ".........................................\n"
scnm = sensors_get_detected_chips(0, VarPtr(c))
lung = sensors_snprintf_chip_name(nomeB, 128, scnm) Print nomeB.ToString(0, lung)
Print "Adapter: "; sensors_get_adapter_name(scnm.bus)
Print "Tipo di sensore termico: "; sf_type(sf.type) Print If subf.flags And SENSORS_MODE_R Then rc = sensors_get_value(scnm, subf.number, VarPtr(valTemp)) If rc < 0 Then Error.Raise("Errore nella lettura del valore !") Else Print "Temperatura CPU = "; valTemp; "°" Endif Endif
Print "''''''''''''''''''''''''''''''''''''" sensors_cleanup() End Private Function sf_type(numero As Byte) As String
Dim tipo As String Select Case numero Case 1 tipo = "PII/Celeron Diode" Case 2 tipo = "3904 transistor" Case 3 tipo = "thermal diode" Case 4 tipo = "thermistor" Case 5 tipo = "AMD AMDSI" Case 6 tipo = "Intel PECI" End Select Return tipo End
Riferimenti
[1]
Pagina in costruzione !