Exd/lib/Printer/ESCPOS/Connections/Serial.pm

169 lines
3.7 KiB
Perl

use strict;
use warnings;
package Printer::ESCPOS::Connections::Serial;
# PODNAME: Printer::ESCPOS::Connections::Serial
# ABSTRACT: Serial Connection Interface for L<Printer::ESCPOS> (supports status commands)
#
# This file is part of Printer-ESCPOS
#
# This software is copyright (c) 2017 by Shantanu Bhadoria.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#
our $VERSION = '1.006'; # VERSION
# Dependencies
use 5.010;
use Moo;
with 'Printer::ESCPOS::Roles::Connection';
use Device::SerialPort;
use Time::HiRes qw(usleep);
has deviceFilePath => ( is => 'ro', );
has baudrate => (
is => 'ro',
default => 38400,
);
has readConstTime => (
is => 'ro',
default => 150,
);
has serialOverUSB => (
is => 'rw',
default => '0',
);
has _connection => (
is => 'lazy',
init_arg => undef,
);
sub _build__connection {
my ($self) = @_;
my $printer = new Device::SerialPort( $self->deviceFilePath )
|| die "Can't open Port: $!\n";
$printer->baudrate( $self->baudrate );
$printer->read_const_time( $self->readConstTime )
; # 1 second per unfulfilled "read" call
$printer->read_char_time(0); # don't wait for each character
return $printer;
}
sub read {
my ( $self, $question, $bytes ) = @_;
$bytes |= 1024;
$self->_connection->write($question);
my ( $count, $data ) = $self->_connection->read($bytes);
return $data;
}
sub print {
my ( $self, $raw ) = @_;
my @chunks;
my $buffer = $self->_buffer;
if ( defined $raw ) {
$buffer = $raw;
}
else {
$self->_buffer('');
}
my $n = 8; # Size of each chunk in bytes
$n = 64 if ( $self->serialOverUSB );
@chunks = unpack "a$n" x ( ( length($buffer) / $n ) - 1 ) . "a*", $buffer;
for my $chunk (@chunks) {
$self->_connection->write($chunk);
if ( $self->serialOverUSB ) {
$self->_connection->read();
}
else {
usleep(10000)
; # Serial Port is annoying, it doesn't tell you when it is ready to get the next chunk
}
}
}
no Moo;
__PACKAGE__->meta->make_immutable;
1;
__END__
=pod
=head1 NAME
Printer::ESCPOS::Connections::Serial - Serial Connection Interface for L<Printer::ESCPOS> (supports status commands)
=head1 VERSION
version 1.006
=head1 ATTRIBUTES
=head2 deviceFilePath
This variable contains the path for the printer device file like '/dev/ttyS0' when connected as a serial device on
UNIX-like systems. For Windows this will be the serial port name like 'COM1', 'COM2' etc. This must be passed in the
constructor. I haven't tested this on windows, so if you are able to use serial port successfully on windows, drop me a
email to let me know that I got it right :)
=head2 baudrate
When used as a local serial device you can set the baudrate of the printer too. Default (38400) will usually work, but
not always.This param may be specified when creating printer object to make sure it works properly.
$printer = Printer::Thermal->new(deviceFilePath => '/dev/ttyACM0', baudrate => 9600);
=head2 readConstTime
Seconds per unfulfilled read call, default 150
=head2 serialOverUSB
Set this value to 1 if you are connecting your printer using the USB Cable but it shows up as a serial device
=head1 METHODS
=head2 read
Read Data from the printer
=head2 print
Sends buffer data to the printer.
=head1 AUTHOR
Shantanu Bhadoria <shantanu@cpan.org> L<https://www.shantanubhadoria.com>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Shantanu Bhadoria.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut