HiPi
view release on metacpan or search on metacpan
lib/HiPi/Interface/EPaper/TypeA.pm view on Meta::CPAN
__PACKAGE__->create_ro_accessors( qw(
driver_ouput_control_bytes
booster_soft_start_control_bytes
vcom_register_bytes
dummy_line_period_bytes
gate_time_bytes
border_control_bytes
data_entry_mode_bytes
analog_control_bytes
inky_magic_bytes
source_driving_bytes
display_update_setting
) );
our $VERSION ='0.81';
use constant {
DRIVER_OUTPUT_CONTROL => 0x01,
SOURCE_DRIVING_CONTROL => 0x04,
BOOSTER_SOFT_START_CONTROL => 0x0C,
GATE_SCAN_START_POSITION => 0x0F,
DEEP_SLEEP_MODE => 0x10,
DATA_ENTRY_MODE_SETTING => 0x11,
SW_RESET => 0x12,
TEMPERATURE_SENSOR_CONTROL => 0x1A,
MASTER_ACTIVATION => 0x20,
DISPLAY_UPDATE_CONTROL_1 => 0x21,
DISPLAY_UPDATE_CONTROL_2 => 0x22,
WRITE_RAM => 0x24,
WRITE_RAM_2 => 0x26,
WRITE_VCOM_REGISTER => 0x2C,
WRITE_LUT_REGISTER => 0x32,
SET_DUMMY_LINE_PERIOD => 0x3A,
SET_GATE_TIME => 0x3B,
BORDER_WAVEFORM_CONTROL => 0x3C,
SET_RAM_X_ADDRESS_START_END_POSITION => 0x44,
SET_RAM_Y_ADDRESS_START_END_POSITION => 0x45,
SET_RAM_X_ADDRESS_COUNTER => 0x4E,
SET_RAM_Y_ADDRESS_COUNTER => 0x4F,
ANALOG_CONTROL_BLOCK => 0x74,
INKY_MAGIC_MAGIC_COMMAND => 0x75,
TERMINATE_FRAME_READ_WRITE => 0xFF,
HIPI_BORDER_POR => 0b011100010,
HIPI_BORDER_BLACK => 0b010100010,
HIPI_BORDER_COLOUR => 0b010100001,
HIPI_BORDER_WHITE => 0b011100010,
};
sub _create {
my( $class, %params ) = @_;
# Default pins for WaveShare 'HAT' modules
# reset_pin => RPI_PIN_11, # 17
# dc_pin => RPI_PIN_22, # 25
# busy_pin => RPI_PIN_18, # 24
$params{reset_pin} //= RPI_PIN_11;
$params{dc_pin} //= RPI_PIN_22;
$params{busy_pin} //= RPI_PIN_18;
$params{display_update_setting} //= 0xC4;
my $self = $class->SUPER::_create( %params );
return $self;
}
sub set_update_mode {
my($self, $newmode) = @_;
my $current = $self->lut_state;
if( $newmode ) {
if( ( $newmode == EPD_UPD_MODE_FULL && $current != EPD_UPD_MODE_FULL ) ) {
$self->lut_state( $newmode );
$self->display_reset;
} elsif( $self->can_partial && $newmode == EPD_UPD_MODE_PARTIAL && $current != EPD_UPD_MODE_PARTIAL) {
$self->lut_state( $newmode );
$self->display_reset;
}
}
return $self->lut_state;
}
sub set_lut_full {
my $self = shift;
my $buffer = $self->lut_full;
next unless ($buffer && ref($buffer) eq 'ARRAY' && @$buffer );
$self->send_command(WRITE_LUT_REGISTER);
$self->send_data( @$buffer );
$self->lut_state( EPD_UPD_MODE_FULL );
}
sub set_lut_partial {
my $self = shift;
return unless $self->can_partial;
my $buffer = $self->lut_partial;
next unless ($buffer && ref($buffer) eq 'ARRAY' && @$buffer );
$self->send_command(WRITE_LUT_REGISTER);
$self->send_data( @$buffer );
$self->lut_state( EPD_UPD_MODE_PARTIAL );
}
sub display_update {
my $self = shift;
$self->set_frame_memory( 0, 0, $self->context );
$self->display_frame();
}
sub display_partial_update {
my($self, $x, $y, $context ) = @_;
return unless $self->can_partial;
return unless $context->isa('HiPi::Interface::EPaper::PartialContext');
($x, $y) = $self->get_partial_coordinates( $x, $y, $context->logical_width, $context->logical_height );
$self->set_frame_memory($x, $y, $context );
$self->display_frame();
return;
}
sub get_partial_coordinates {
my($self, $x, $y, $w, $h) = @_;
( run in 1.686 second using v1.01-cache-2.11-cpan-39bf76dae61 )