aboutsummaryrefslogtreecommitdiffstats
path: root/src/lm75.c
blob: fac61c2458ac1555b5c94c11729796fa681908b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>


#include "lm75.h"

extern int file;
extern void bus_err(int ern);
extern void print_help(void);
unsigned char buf[5];


void lm75_list_all(void)
{
    printf(
        "00: Temperature data  [°C]     (reg: 0x00)\n"
        "01: Configuration     [hex]    (reg: 0x01)\n"
        "02: Tos (Overtemp)    [°C]     (reg: 0x03)\n"
        "03: Thys (Hysteresis) [°C]     (reg: 0x04)\n"
        "\n");
}



void lm75_get_data(void)
{
	if(write(file, buf, 1) != 1) 
    {
        bus_err(errno);
    }

    if(read(file, buf, 2) != 2) 
    {
        bus_err(errno);
    } 
}



float lm75_read_temp(float offset)
{
    signed int rawtemp = 0;
    float temp;

    buf[0] = 0x00;
    
    lm75_get_data();
     
    rawtemp = (buf[0]*256 + buf[1]) >> 5;  //(buf[0] << 8), and (>> 5), 11bit device is also supported

	if((rawtemp & 0x400) == 0x400)         //check if the msb(bit11) is 1 (1024 = 0x400),  2'complement negative number
	{
	    rawtemp = rawtemp - 2048;          //2^11 = 2048 
	}

	temp = rawtemp * 0.125 ;               //11bit->0.125°C  or  9bit->0.5°C	
    return (temp + offset);    
}



float lm75_read_tos(void)          
{                                           
    int rawtemp = 0;                        
                                            
    buf[0] = 0x02;                          
                                            
    lm75_get_data();                                                         
                                                           
    rawtemp = buf[0]*256 + buf[1];                           
    rawtemp = (rawtemp) >> 7;           //9bit data
    
    if((rawtemp & 256) == 256)          // check if the msb  2'complement negative number
    {
        rawtemp = rawtemp - 512 ;       // 2^9 = 512;
    }
    
    return (rawtemp * 0.5);             //9bit -> 0.5 celsius                                                                                                                 
}                       



float lm75_read_thys(void)          
{                                           
    int rawtemp = 0;                        
                                            
    buf[0] = 0x03;                          
                                            
    lm75_get_data();                                                      
                                                           
    rawtemp = buf[0]*256 + buf[1];                           
    rawtemp = (rawtemp) >> 7;           //9bit data
    
    if((rawtemp & 256) == 256)          // check if the msb  2'complement negative number
    {
        rawtemp = rawtemp - 512 ;       // 2^9 = 512;
    }
    
    return (rawtemp * 0.5);             //9bit -> 0.5 celsius                                                                                                                 
}                       
     

char lm75_read_conf(void)                                                                                                         
{
    
    buf[0] = 0x01;                                                                                                                 
    
    lm75_get_data();
    
    return buf[0];                                                                                                                                   
}



void lm75_read_all(const char *opts)
{
    if(opts != NULL)
    {
        printf("00:%f\n", lm75_read_temp(strtof(opts, NULL)));
    }
    else
    {
        printf("00:%f\n", lm75_read_temp(0.0));
    }     

    printf("01:0x%x\n", lm75_read_conf()); 
    printf("02:%f\n", lm75_read_tos()); 
    printf("03:%f\n", lm75_read_thys()); 
}



void lm75_read_one(const char *opts)
{
    int id;
    char *ptr;
    
    id = strtol (opts,&ptr,0); //all format allowed
    ptr++;      //one separator allowed
        
    switch (id)
    {
        case 0x00:
            printf("00:%f\n", lm75_read_temp(strtof(ptr, NULL)));
            break;
        case 0x01:
            printf("01:0x%x\n", lm75_read_conf());
            break;
        case 0x02:
            printf("02:%f\n", lm75_read_tos());
            break;
        case 0x03:
            printf("03:%f\n", lm75_read_thys()); 
            break;
        default:
            print_help();
    } 
}