EdgePi-Cloud / edgepi-python-sdk

Python SDK to control EdgePi, an industrial PC/PLC/IoT device powered by Raspberry Pi CM4
MIT License
5 stars 3 forks source link

hardware test eeprom read user space is failing ` TypeError: argument must be an int, or have a fileno() method.` #413

Closed farzadpanahi closed 4 months ago

farzadpanahi commented 4 months ago
____________________________ test_reset_user_space _____________________________
eeprom = <edgepi.eeprom.edgepi_eeprom.EdgePiEEPROM object at 0x7f8672b610>
    def test_reset_user_space(eeprom):
        reset_vals = []
        eeprom.reset_user_space()
        num_of_pages = int(EEPROMInfo.NUM_OF_PAGE.value / 2)
        for page in range(num_of_pages, EEPROMInfo.NUM_OF_PAGE.value):
            # pylint: disable=line-too-long
            # pylint: disable=protected-access
>           reset_vals += eeprom._EdgePiEEPROM__sequential_read(page * EEPROMInfo.PAGE_SIZE.value,EEPROMInfo.PAGE_SIZE.value)
tests/hardware_tests/test_eeprom_userspace.py:41: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
venv_hardware_test/lib/python3.9/site-packages/edgepi/eeprom/edgepi_eeprom.py:203: in __sequential_read
    read_result = self.transfer(EEPROMInfo.DEV_ADDR.value, msg)
venv_hardware_test/lib/python3.9/site-packages/edgepi/peripherals/i2c.py:86: in transfer
    self.i2cdev.transfer(dev_addr, msg)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
self = <periphery.i2c.I2C object at 0x7f8672b940>, address = 80
messages = [<periphery.i2c.I2C.Message object at 0x7f8672b640>, <periphery.i2c.I2C.Message object at 0x7f8672bfd0>]
    def transfer(self, address, messages):
        """Transfer `messages` to the specified I2C `address`. Modifies the
        `messages` array with the results of any read transactions.

        Args:
            address (int): I2C address.
            messages (list): list of I2C.Message messages.

        Raises:
            I2CError: if an I/O or OS error occurs.
            TypeError: if `messages` type is not list.
            ValueError: if `messages` length is zero, or if message data is not valid bytes.

        """
        if not isinstance(messages, list):
            raise TypeError("Invalid messages type, should be list of I2C.Message.")
        elif len(messages) == 0:
            raise ValueError("Invalid messages data, should be non-zero length.")

        # Convert I2C.Message messages to _CI2CMessage messages
        cmessages = (_CI2CMessage * len(messages))()
        for i in range(len(messages)):
            # Convert I2C.Message data to bytes
            if isinstance(messages[i].data, bytes):
                data = messages[i].data
            elif isinstance(messages[i].data, bytearray):
                data = bytes(messages[i].data)
            elif isinstance(messages[i].data, list):
                data = bytes(bytearray(messages[i].data))

            cmessages[i].addr = address
            cmessages[i].flags = messages[i].flags | (I2C._I2C_M_RD if messages[i].read else 0)
            cmessages[i].len = len(data)
            cmessages[i].buf = ctypes.cast(ctypes.create_string_buffer(data, len(data)), ctypes.POINTER(ctypes.c_ubyte))

        # Prepare transfer structure
        i2c_xfer = _CI2CIocTransfer()
        i2c_xfer.nmsgs = len(cmessages)
        i2c_xfer.msgs = cmessages

        # Transfer
        try:
>           fcntl.ioctl(self._fd, I2C._I2C_IOC_RDWR, i2c_xfer, False)
E           TypeError: argument must be an int, or have a fileno() method.
venv_hardware_test/lib/python3.9/site-packages/periphery/i2c.py:1[35](https://github.com/EdgePi-Cloud/edgepi-python-sdk/actions/runs/8915119285/job/24485845997#step:4:36): TypeError