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 )