EAFDSS

 view release on metacpan or  search on metacpan

lib/EAFDSS.pm  view on Meta::CPAN

   0x02: Field too long
   0x03: Field too small
   0x04: Field fixed size mismatch
   0x05: Field range or type check failed
   0x06: Bad request code
   0x09: Printing type bad
   0x0A: Cannot execute with day open
   0x0B: RTC programming requires jumper
   0x0C: RTC date or time invalid
   0x0D: No records in fiscal period
   0x0E: Device is busy in another task
   0x0F: No more header records allowed
   0x10: Cannot execute with block open
   0x11: Block not open
   0x12: Bad data stream
   0x13: Bad signature field
   0x14: Z closure time limit
   0x15: Z closure not found
   0x16: Z closure record bad
   0x17: User browsing in progress
   0x18: Signature daily limit reached

lib/EAFDSS/Base.pm  view on Meta::CPAN

	return (0, $deviceDir);
}

sub _Recover {
	my($self) = shift @_;
	my($reply, $status1, $status2, $lastZ, $total, $daily, $signBlock, $remainDaily);

	($reply, $status1, $status2) = $self->PROTO_GetStatus();
	if ($reply ne "0") { return $reply };

	my($busy, $fatal, $paper, $cmos, $printer, $user, $fiscal, $battery) = $self->UTIL_devStatus($status1);
	if ($cmos != 1) { return 0 };

	my($day, $signature, $recovery, $fiscalWarn, $dailyFull, $fiscalFull) = $self->UTIL_appStatus($status1);

	$self->debug("   CMOS is set, going for recovery!");

	($reply, $status1, $status2, $lastZ, $total, $daily, $signBlock, $remainDaily) = $self->PROTO_ReadSummary(0);
	if ($reply != 0) {
		$self->debug("   Aborting recovery because of ReadClosure reply [%d]", $reply);
		return $reply

lib/EAFDSS/Dummy.pm  view on Meta::CPAN

		case 00+0x02	 { return "Field too long"}
		case 00+0x03	 { return "Field too small"}
		case 00+0x04	 { return "Field fixed size mismatch"}
		case 00+0x05	 { return "Field range or type check failed"}
		case 00+0x06	 { return "Bad request code"}
		case 00+0x09	 { return "Printing type bad"}
		case 00+0x0A	 { return "Cannot execute with day open"}
		case 00+0x0B	 { return "RTC programming requires jumper"}
		case 00+0x0C	 { return "RTC date or time invalid"}
		case 00+0x0D	 { return "No records in fiscal period"}
		case 00+0x0E	 { return "Device is busy in another task"}
		case 00+0x0F	 { return "No more header records allowed"}
		case 00+0x10	 { return "Cannot execute with block open"}
		case 00+0x11	 { return "Block not open"}
		case 00+0x12	 { return "Bad data stream"}
		case 00+0x13	 { return "Bad signature field"}
		case 00+0x14	 { return "Z closure time limit"}
		case 00+0x15	 { return "Z closure not found"}
		case 00+0x16	 { return "Z closure record bad"}
		case 00+0x17	 { return "User browsing in progress"}
		case 00+0x18	 { return "Signature daily limit reached"}

lib/EAFDSS/Dummy.pm  view on Meta::CPAN


=head2 UTIL_devStatus

=cut

sub UTIL_devStatus {
	my($self)   = shift @_;
	my($status) = sprintf("%08b", shift);
	my(@status) = split(//, $status);

	my($busy, $fatal, $paper, $cmos, $printer, $user, $fiscal, $battery) = 
		($status[7],$status[6],$status[5],$status[4],$status[3],$status[2],$status[1],$status[0]);

	return ($busy, $fatal, $paper, $cmos, $printer, $user, $fiscal, $battery);
}

=head2 UTIL_appStatus

=cut

sub UTIL_appStatus {
	my($self)   = shift @_;

	my($status) = sprintf("%08b", shift);

lib/EAFDSS/Micrelec.pm  view on Meta::CPAN

		case 00+0x02	 { return "Field too long"}
		case 00+0x03	 { return "Field too small"}
		case 00+0x04	 { return "Field fixed size mismatch"}
		case 00+0x05	 { return "Field range or type check failed"}
		case 00+0x06	 { return "Bad request code"}
		case 00+0x09	 { return "Printing type bad"}
		case 00+0x0A	 { return "Cannot execute with day open"}
		case 00+0x0B	 { return "RTC programming requires jumper"}
		case 00+0x0C	 { return "RTC date or time invalid"}
		case 00+0x0D	 { return "No records in fiscal period"}
		case 00+0x0E	 { return "Device is busy in another task"}
		case 00+0x0F	 { return "No more header records allowed"}
		case 00+0x10	 { return "Cannot execute with block open"}
		case 00+0x11	 { return "Block not open"}
		case 00+0x12	 { return "Bad data stream"}
		case 00+0x13	 { return "Bad signature field"}
		case 00+0x14	 { return "Z closure time limit"}
		case 00+0x15	 { return "Z closure not found"}
		case 00+0x16	 { return "Z closure record bad"}
		case 00+0x17	 { return "User browsing in progress"}
		case 00+0x18	 { return "Signature daily limit reached"}

lib/EAFDSS/Micrelec.pm  view on Meta::CPAN


=head2 UTIL_devStatus

=cut

sub UTIL_devStatus {
	my($self)   = shift @_;
	my($status) = sprintf("%08b", shift);
	my(@status) = split(//, $status);

	my($busy, $fatal, $paper, $cmos, $printer, $user, $fiscal, $battery) = 
		($status[7],$status[6],$status[5],$status[4],$status[3],$status[2],$status[1],$status[0]);

	return ($busy, $fatal, $paper, $cmos, $printer, $user, $fiscal, $battery);
}

=head2 UTIL_appStatus

=cut

sub UTIL_appStatus {
	my($self)   = shift @_;

	my($status) = sprintf("%08b", shift);

lib/EAFDSS/SDNP.pm  view on Meta::CPAN


sub SendRequest {
	my($self)   = shift @_;
	my($opcode) = shift @_;
	my($opdata) = shift @_;
	my($data)   = shift @_;

	my(%reply) = ();

	# For at least 6 times do:
	my($busy_try, $state, $try);
	BUSY: for ($busy_try = 1; $busy_try <= 3; $busy_try++) {
		for ($try = 1; $try < 6; $try++) {
			my(%reply)  = ();
			$self->debug("    Send Request try #%d", $try);
			SYNC:
			# If state is UNSYNCHRONIZED or connection SYNC timer expired then:
			if ($self->_getTimer('_TSYNC') >= 0) {
				$self->debug("      Syncing with device");
				if ( $self->_sdnpSync() == 0) {
					$self->debug("        Sync Failed");
					$self->error(64+3);

lib/EAFDSS/SDNP.pm  view on Meta::CPAN

							}
							#$self->debug(  "        Checking Data checksum [%04X]", $checksum);
							if ($checksum != $reply{CHECKSUM}) {
								# Create and send NAK frame with FSN set to received FSN;
								my($msg) = $self->sdnpPacket(0x13, 0x00);
								$self->_sdnpPrintFrame("      ----> [%s]\n", $msg);
								$self->{_SOCKET}->send($msg);
								next;
							} else {
								if ( $reply{DATA} =~ /^0E/ ) {
									$self->debug("      Will retry because of busyness $busy_try");
									$state = "BUSY";
									sleep 2;
									next BUSY;
								} else {
									$self->debug("      Done Getting reply");

									# Renew connection's SYNC timer;
									$self->_setTimer('_TSYNC', 4);
	
									# Advance connection's NextFSN by one;

lib/EAFDSS/SDNP.pm  view on Meta::CPAN

						next;
					}
				} else {
					$self->debug(  "        Bad Frame, Discarding");
				}
			}
		}
	}

	if ($state eq "BUSY") {
		$self->debug("      Too busy device... aborting");
		$reply{DATA}   = "0E/0/";
	}

	# Return request transmittion failure;
	return %reply;
}

sub _sdnpQuery {
	my($self)  = shift @_;
	my($devices);

lib/EAFDSS/SDSP.pm  view on Meta::CPAN

	$self->{_SERIAL}->stopbits(1); 

	$self->{_SERIAL}->read_const_time(1);

	my($reply, $deviceID) = $self->PROTO_ReadDeviceID();
	if ( ($reply == 0) && ($deviceID ne $self->{SN}) ) {
		return $self->error("Serial Number not matching");
	}
	
	if ( $reply ==0x0E ) {
		return $self->error("Device is too busy!");
	}

	if ( $reply != 0 ) {
		return $self->error("Error initializing device");
	}

	return $self;
}

=head2 SendRequest

lib/EAFDSS/SDSP.pm  view on Meta::CPAN

=cut

sub SendRequest {
	my($self)   = shift @_;
	my($opcode) = shift @_;
	my($opdata) = shift @_;
	my($data)   = shift @_;

	my(%reply) = ();

	my($busy_try, $try, $state);

	BUSY: for ($busy_try = 1; $busy_try <= 3; $busy_try++) {
		$self->{_SERIAL}->read_const_time(3000);
		$self->{_SERIAL}->read_char_time(0);
		$state = "ENQ";
		ENQ: for ($try = 1; $try <= 3; $try++) {
			my($count_out);
			$self->debug("    Sending ENQ [try %d]", $try);
			$count_out = $self->{_SERIAL}->write($control->{'CAN'});
			$count_out = $self->{_SERIAL}->write($control->{'CAN'});
			$count_out = $self->{_SERIAL}->write($control->{'CAN'});
			$count_out = $self->{_SERIAL}->write($control->{'ENQ'});

lib/EAFDSS/SDSP.pm  view on Meta::CPAN

					if ($count_in && ($c ne $control->{'ETX'} ) ) {
						$full_reply .= $c;
					}
				} until ($c eq $control->{'ETX'});
				$full_reply =~ /(.*)\/(\d\d)$/;
				($reply, $checksum) =  ($1, $2);
				if ( $checksum == $self->_checksum($reply . "/")) {
					$self->debug("      Got Reply [%s]", $reply);
					$self->{_SERIAL}->write($control->{'ACK'});
					if ( $reply =~ /^0E/ ) {
						$self->debug("      Will retry because of busyness");
						sleep 2;
						next BUSY;
					} else {
						$self->debug("      Done Getting reply");
						$state = "DONE";
						last REPLY;
					}
				} else {
					$self->{_SERIAL}->write($control->{'NAK'});
					$self->debug("      Discarding because of bad checksum");

lib/EAFDSS/SDSP.pm  view on Meta::CPAN

		}
		if ($state ne "DONE") {
			$reply{DATA}   = "02/0/";
			return %reply;
		} else {
			$reply{DATA}   = $reply;	
			return %reply;
		}
	}

	$self->debug("      Too busy device... aborting");
	$reply{DATA}   = "0E/0/";
	return %reply;
}

sub _sdnpQuery {
	my($self)  = shift @_;
	return (0, undef);
}

sub _checksum {



( run in 0.271 second using v1.01-cache-2.11-cpan-87723dcf8b7 )