Differenze tra le versioni di "Controllare la temperatura dell'hardware mediante le funzioni del API di libsensors"

Da Gambas-it.org - Wikipedia.
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 !