Skip to content

Commit 1864d83

Browse files
authored
Calibration suggestion (#129)
* Nov1 code review suggestions * refactoring eeprom access module to accomodate the hardware change * EEPROM class is refactored to accomodate the larger memory size #125 * pylint fix
1 parent 029d8e0 commit 1864d83

File tree

4 files changed

+75
-11
lines changed

4 files changed

+75
-11
lines changed

src/edgepi/calibration/edgepi_calibration.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ def __init__(self, module: ModuleNames):
4040
# TODO: to be used for prepare a value to be upkoaded to eeprom
4141
# pylint: disable=unused-private-member
4242
def __from_value_to_memory(self, param: float = None):
43+
# TODO: Create range check for calibration param, unittest,change packing into float and
44+
# chekc precision instead of int
4345
param = int(param*10**9)
4446
value = pack("i", param)
4547
return list(value)
4648

4749
def __from_memory_to_value(self, memory: list = None) -> float:
50+
# TODO: Create range check for calibration param, unittest
4851
value = pack("BBBB", memory[0], memory[1], memory[2], memory[3])
4952
value = int.from_bytes(value, "little", signed=True)
5053
return float(format(value*10**-9, '.9f'))

src/edgepi/calibration/edgepi_eeprom.py

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
'''Helper class to access on board eeprom'''
22

33
import logging
4+
import math
45

5-
from edgepi.calibration.eeprom_constants import EEPROMAddress
6+
from edgepi.calibration.eeprom_constants import EEPROMInfo
67
from edgepi.peripherals.i2c import I2CDevice
78

8-
9+
#TODO: Maybe use protobuff
10+
#TODO: EEPROM should return structured data class of parameters to calibration class.
911
class EdgePiEEPROM(I2CDevice):
1012
'''
1113
Helper class to read eeprom using I2C
@@ -16,6 +18,31 @@ def __init__(self):
1618
self.log = logging.getLogger(__name__)
1719
super().__init__(self.__dev_path)
1820

21+
def __pack_mem_address(self, page_addr: int = None, byte_addr: int = None):
22+
"""
23+
Pack page address and byte address to generate address message. The address message will
24+
let the EEPROM memory address point to know at which address the read/write operation to
25+
take in place
26+
Args:
27+
page_addr (int): page address (0~511)
28+
byte_addr (int): byte address in the page(0~63)
29+
return:
30+
(list): 2-byte address message
31+
"""
32+
address = page_addr<<6 | byte_addr
33+
return [(address>>8)&0xFF, address&0xFF]
34+
35+
def __byte_address_generation(self, memory_address: int = None):
36+
"""
37+
Generates page address and bytes address from the memory address provided.
38+
Args:
39+
memory_address (int): memory address to start read/write operation. This is in bytes
40+
from 0 - 32768
41+
"""
42+
page_addr = math.floor(memory_address/EEPROMInfo.PAGE_SIZE.value)
43+
byte_addr = memory_address%EEPROMInfo.PAGE_SIZE.value
44+
self.log.debug(f'Page address = {page_addr}, byte Address = {byte_addr}')
45+
return page_addr, byte_addr
1946

2047
def sequential_read(self, mem_addr: int = None, length: int = None):
2148
'''
@@ -28,9 +55,11 @@ def sequential_read(self, mem_addr: int = None, length: int = None):
2855
List of read data
2956
3057
'''
31-
msg = self.set_read_msg(mem_addr, [0x00]*length)
58+
page_addr, byte_addr = self.__byte_address_generation(mem_addr)
59+
mem_addr_list = self.__pack_mem_address(page_addr, byte_addr)
60+
msg = self.set_read_msg(mem_addr_list, [0x00]*length)
3261
self.log.debug(f'Reading Address {mem_addr}, {length} bytes, {msg[1].data}')
33-
read_result = self.transfer(EEPROMAddress.DEV_ADDR.value, msg)
62+
read_result = self.transfer(EEPROMInfo.DEV_ADDR.value, msg)
3463
self.log.debug(f'Read data: {msg[1].data}')
3564
return read_result
3665

@@ -43,9 +72,11 @@ def selective_read(self, mem_addr: int = None):
4372
Returns:
4473
List of read data
4574
'''
75+
page_addr, byte_addr = self.__byte_address_generation(mem_addr)
76+
mem_addr_list = self.__pack_mem_address(page_addr, byte_addr)
4677
msg = self.set_read_msg(mem_addr, [0x00])
47-
self.log.debug(f'Reading Address {mem_addr}, {msg[1].data}')
48-
read_result = self.transfer(EEPROMAddress.DEV_ADDR.value, msg)
78+
self.log.debug(f'Reading Address {mem_addr_list}, {msg[1].data}')
79+
read_result = self.transfer(EEPROMInfo.DEV_ADDR.value, msg)
4980
self.log.debug(f'Read data: {msg[1].data}')
5081
return read_result
5182

@@ -58,9 +89,11 @@ def byte_write_register(self, mem_addr: int = None, data: int = None):
5889
Returns:
5990
N/A
6091
'''
61-
msg = self.set_write_msg(mem_addr, [data])
92+
page_addr, byte_addr = self.__byte_address_generation(mem_addr)
93+
mem_addr_list = self.__pack_mem_address(page_addr, byte_addr)
94+
msg = self.set_write_msg(mem_addr_list, [data])
6295
self.log.debug(f'Writing {data} to memory address of {mem_addr}, {msg[0].data}')
63-
self.transfer(EEPROMAddress.DEV_ADDR.value, msg)
96+
self.transfer(EEPROMInfo.DEV_ADDR.value, msg)
6497

6598
def page_write_register(self, mem_addr: int = None, data: list = None):
6699
'''
@@ -71,6 +104,8 @@ def page_write_register(self, mem_addr: int = None, data: list = None):
71104
Returns:
72105
N/A
73106
'''
74-
msg = self.set_write_msg(mem_addr, data)
107+
page_addr, byte_addr = self.__byte_address_generation(mem_addr)
108+
mem_addr_list = self.__pack_mem_address(page_addr, byte_addr)
109+
msg = self.set_write_msg(mem_addr_list, data)
75110
self.log.debug(f'Writing {data} to memory address of {mem_addr}, {msg[0].data}')
76-
self.transfer(EEPROMAddress.DEV_ADDR.value, msg)
111+
self.transfer(EEPROMInfo.DEV_ADDR.value, msg)

src/edgepi/calibration/eeprom_constants.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
from enum import Enum
44

5-
class EEPROMAddress(Enum):
5+
class EEPROMInfo(Enum):
66
"""
77
EEPROM device address for I2C addressing
88
"""
99
DEV_ADDR = 0x50
10+
PAGE_SIZE = 64
11+
NUM_OF_PAGE = 512
1012

1113
class ModuleNames(Enum):
1214
"""

src/test_edgepi/unit_tests/test_calibration/test_access_eeprom.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,30 @@ def fixture_test_dac(mocker):
1515
mocker.patch("edgepi.peripherals.i2c.I2C")
1616
yield EdgePiEEPROM()
1717

18+
@pytest.mark.parametrize("page_addr, byte_addr, result",
19+
[(0, 8, [0x00, 0x08]),
20+
(0, 63, [0x00, 0x3F]),
21+
(511, 63, [0x7F, 0xFF]),
22+
(511, 0, [0x7F, 0xC0])
23+
])
24+
def test__pack_mem_address(page_addr, byte_addr, result, eeprom):
25+
# pylint: disable=protected-access
26+
address_message = eeprom._EdgePiEEPROM__pack_mem_address(page_addr, byte_addr)
27+
assert address_message == result
28+
29+
@pytest.mark.parametrize("memory_address, result",
30+
[(0, [0, 0]),
31+
(63, [0, 63]),
32+
(64, [1, 0]),
33+
(32767, [511, 63]),
34+
(32704, [511, 0])
35+
])
36+
def test__byte_address_generation(memory_address, result, eeprom):
37+
# pylint: disable=protected-access
38+
page_addr, byte_addr = eeprom._EdgePiEEPROM__byte_address_generation(memory_address)
39+
assert page_addr == result[0]
40+
assert byte_addr == result[1]
41+
1842
@pytest.mark.parametrize("reg_addr, mock_val, result", [(1, [23], [23])])
1943
def test_selective_read(mocker, eeprom, reg_addr, mock_val, result):
2044
mocker.patch("edgepi.peripherals.i2c.I2CDevice.transfer",return_value = mock_val)

0 commit comments

Comments
 (0)