- def set_region_to_update(
- self,
- column_command: int,
- row_command: int,
- set_current_column_command: Optional[int],
- set_current_row_command: Optional[int],
- data_as_commands: bool,
- always_toggle_chip_select: bool,
- area: Area,
- SH1107_addressing: bool,
- ) -> None:
- # pylint: disable=invalid-name, too-many-arguments, too-many-locals, too-many-branches,
- # pylint: disable=too-many-statements
-
- big_endian = True # default is True # TODO ????
-
- x1 = area.x1 + self._colstart
- x2 = area.x2 + self._colstart
- y1 = area.y1 + self._rowstart
- y2 = area.y2 + self._rowstart
-
- # Collapse down the dimension where multiple pixels are in a byte.
- if self._colorspace.depth < 8:
- pixels_per_byte = 8 // self._colorspace.depth
- if self._colorspace.pixels_in_byte_share_row:
- x1 //= pixels_per_byte * self._colorspace.bytes_per_cell
- x2 //= pixels_per_byte * self._colorspace.bytes_per_cell
- else:
- y1 //= pixels_per_byte * self._colorspace.bytes_per_cell
- y2 //= pixels_per_byte * self._colorspace.bytes_per_cell
-
- x2 -= 1
- y2 -= 1
-
- chip_select = CHIP_SELECT_UNTOUCHED
- if always_toggle_chip_select or data_as_commands:
- chip_select = CHIP_SELECT_TOGGLE_EVERY_BYTE
-
- # Set column
- self._begin_transaction()
- data = bytearray(5)
- data[0] = column_command
- if not data_as_commands:
- self._send(DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, data, 1)
- data_type = DISPLAY_DATA
- data_length = 0
- else:
- data_type = DISPLAY_COMMAND
- data_length = 1
-
- if self._ram_width < 0x100:
- data[data_length] = x1
- data_length += 1
- data[data_length] = x2
- data_length += 1
- else:
- if big_endian:
- data[data_length] = x1 >> 8
- data_length += 1
- data[data_length] = x1 & 0xFF
- data_length += 1
- data[data_length] = x2 >> 8
- data_length += 1
- data[data_length] = x2 & 0xFF
- data_length += 1
- else:
- data[data_length] = x1 & 0xFF
- data_length += 1
- data[data_length] = x1 >> 8
- data_length += 1
- data[data_length] = x2 & 0xFF
- data_length += 1
- data[data_length] = x2 >> 8
- data_length += 1
-
- # Quirk for "SH1107_addressing"
- # Column lower command = 0x00, Column upper command = 0x10
- if SH1107_addressing:
- data[0] = ((x1 >> 4) & 0x0F) | 0x10 # 0x10 to 0x17
- data[1] = x1 & 0x0F # 0x00 to 0x0F
- data_length = 2
-
- self._send(data_type, chip_select, data, data_length)
- self._end_transaction()
-
- if set_current_column_command is not None:
- command = bytearray(1)
- command[0] = set_current_column_command
- self._begin_transaction()
- self._send(DISPLAY_COMMAND, chip_select, command, 1)
- self._send(DISPLAY_DATA, chip_select, data, data_length // 2)
- self._end_transaction()
-
- # Set row
- self._begin_transaction()
- data[0] = row_command
- data_length = 1
- if not data_as_commands:
- self._send(DISPLAY_COMMAND, CHIP_SELECT_UNTOUCHED, data, 1)
- data_length = 0
-
- if self._ram_height < 0x100:
- data[data_length] = y1
- data_length += 1
- data[data_length] = y2
- data_length += 1
- else:
- if big_endian:
- data[data_length] = y1 >> 8
- data_length += 1
- data[data_length] = y1 & 0xFF
- data_length += 1
- data[data_length] = y2 >> 8
- data_length += 1
- data[data_length] = y2 & 0xFF
- data_length += 1
- # TODO Which is right? The core uses above
- else:
- data[data_length] = y1 & 0xFF
- data_length += 1
- data[data_length] = y1 >> 8
- data_length += 1
- data[data_length] = y2 & 0xFF
- data_length += 1
- data[data_length] = y2 >> 8
- data_length += 1
-
- # Quirk for "SH1107_addressing"
- # Page address command = 0xB0
- if SH1107_addressing:
- # Set the page to out y value
- data[0] = 0xB0 | y1
- data_length = 1
-
- self._send(data_type, chip_select, data, data_length)
- self._end_transaction()
-
- if set_current_row_command is not None:
- command = bytearray(1)
- command[0] = set_current_row_command
- self._begin_transaction()
- self._send(DISPLAY_COMMAND, chip_select, command, 1)
- self._send(DISPLAY_DATA, chip_select, data, data_length // 2)
- self._end_transaction()
-