Commit d5eca613 authored by Theodor-Adrian Stana's avatar Theodor-Adrian Stana

sw: Various changes in therm_id.py

The changes are listed below:
- added CRC calculation on reading of unique ID, to avoid writing an erroneous
  one in the log file and ultimately the MTF database
- aestaethic changes in the code (e.g., spaces added after 'if' statements)
- made the storage of the unique ID always be 16 characters long
parent 5a50f942
......@@ -99,7 +99,7 @@ class COpenCoresOneWire:
data = ((port<<self.CSR_SEL_OFS) & self.CSR_SEL_MSK) | self.CSR_CYC_MSK | self.CSR_RST_MSK
self.wr_reg(self.R_CSR, data)
tmo = 100
while(self.rd_reg(self.R_CSR) & self.CSR_CYC_MSK):
while (self.rd_reg(self.R_CSR) & self.CSR_CYC_MSK):
tmo = tmo -1
if tmo <= 0:
msg = "ERROR: TempID IC22: Not responding"
......@@ -112,7 +112,7 @@ class COpenCoresOneWire:
data = ((port<<self.CSR_SEL_OFS) & self.CSR_SEL_MSK) | self.CSR_CYC_MSK | (bit & self.CSR_DAT_MSK)
self.wr_reg(self.R_CSR, data)
tmo = 100
while(self.rd_reg(self.R_CSR) & self.CSR_CYC_MSK):
while (self.rd_reg(self.R_CSR) & self.CSR_CYC_MSK):
tmo = tmo -1
if tmo <= 0:
msg = "ERROR: TempID IC22: Not responding"
......@@ -139,13 +139,13 @@ class COpenCoresOneWire:
for i in range(8):
data |= self.write_bit(port, (byte & 0x1)) << i
byte >>= 1
if(byte_old == data):
if (byte_old == data):
return 0
else:
return -1
def write_block(self, port, block):
if(160 < len(block)):
if (160 < len(block)):
return -1
data = []
for i in range(len(block)):
......@@ -153,7 +153,7 @@ class COpenCoresOneWire:
return data
def read_block(self, port, length):
if(160 < length):
if (160 < length):
return -1
data = []
for i in range(length):
......@@ -184,7 +184,7 @@ class CDS18B20:
self.port = port
def read_serial_number(self):
if(1 != self.onewire.reset(self.port)):
if (1 != self.onewire.reset(self.port)):
msg = "ERROR: TempID IC22: Not responding"
raise PtsError(msg)
else:
......@@ -193,16 +193,17 @@ class CDS18B20:
msg = "ERROR: TempID IC22: Write failed"
raise PtsError(msg)
family_code = self.onewire.read_byte(self.port)
serial_number = 0
for i in range(6):
for i in range(8):
serial_number |= self.onewire.read_byte(self.port) << (i*8)
crc = self.onewire.read_byte(self.port)
if (self.crc(serial_number)):
msg = "ERROR: TempID IC22: Checksum calculation failed"
raise PtsError(msg)
return ((crc<<56) | (serial_number<<8) | family_code)
return serial_number
def access(self, serial_number):
if(1 != self.onewire.reset(self.port)):
if (1 != self.onewire.reset(self.port)):
msg = "ERROR: TempID IC22: Not responding"
raise PtsError(msg)
else:
......@@ -222,7 +223,7 @@ class CDS18B20:
err = self.onewire.write_byte(self.port, self.READ_SCRATCHPAD)
data = self.onewire.read_block(self.port, 9)
temp = (data[1] << 8) | (data[0])
if(temp & 0x1000):
if (temp & 0x1000):
temp = -0x10000 + temp
temp = temp/16.0
return temp
......@@ -230,6 +231,13 @@ class CDS18B20:
def crc(self, val):
ret = 0
for i in range(64):
if ((ret & 0x01) ^ (val & 0x01)):
ret >>= 1
ret ^= 0x8c
else:
ret >>= 1
val >>= 1
return ret
##-------------------------------------------------------------------------------------------------
## main --
......@@ -254,27 +262,23 @@ def main(bus,tname,inf,log):
# Reading of unique ID
unique_id = ds18b20.read_serial_number()
family_code = unique_id & 0xff
crc = (unique_id & 0xff00000000000000) >> 56
if(unique_id == -1):
if (unique_id == -1):
msg = "ERROR: TempID IC22: Unable to read 1-wire thermometer"
pel.set(msg)
else:
unique_id &= 0x00ffffffffffff00
inf.write("Unique ID: %012X\n" % (unique_id))
inf.write("Unique ID: %016X\n" % (unique_id))
# Reading of temperature
temp = ds18b20.read_temp(unique_id)
inf.write("Current temperature: %3.3f\n" % temp)
# Cheking if received values are reasonable
if temp < 10.0 or temp > 50.0:
if (temp < 10.0) or (temp > 50.0):
msg = "ERROR: TempID IC22: Temperature: %d out of range[10 .. 50oC]" % (temp)
pel.set(msg)
if((unique_id & 0xFF) != FAMILY_CODE):
family_code = unique_id & 0xFF
msg = "ERROR: TempID IC22: Invalid family code (0x%02X)\n" %
(family_code, FAMILY_CODE)
if (family_code != FAMILY_CODE):
msg = "ERROR: TempID IC22: Invalid family code (0x%02X)\n" % (family_code, FAMILY_CODE)
pel.set(msg)
return pel.get()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment