commit
a3223e197c
@ -0,0 +1,409 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Creator: Terry Burton
|
||||
%%BoundingBox: 50 40 168 122
|
||||
%%EndComments
|
||||
%%EndProlog
|
||||
|
||||
currentglobal
|
||||
true setglobal
|
||||
/Generic /Category findresource
|
||||
dup length 1 add dict copy
|
||||
dup /InstanceType /packedarraytype put
|
||||
/uk.co.terryburton.bwipp exch /Category defineresource pop
|
||||
setglobal
|
||||
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
begin
|
||||
/renlinear {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/args exch def % We are given some arguments
|
||||
|
||||
% Default options
|
||||
/sbs [] def
|
||||
/bhs [] def
|
||||
/bbs [] def
|
||||
/txt [] def
|
||||
/barcolor (unset) def
|
||||
/includetext false def
|
||||
/textcolor (unset) def
|
||||
/textxalign (unset) def
|
||||
/textyalign (unset) def
|
||||
/textfont (Courier) def
|
||||
/textsize 10 def
|
||||
/textxoffset 0 def
|
||||
/textyoffset 0 def
|
||||
/textgaps 0 def
|
||||
/alttext () def
|
||||
/bordercolor (unset) def
|
||||
/backgroundcolor (unset) def
|
||||
/inkspread 0.15 def
|
||||
/width 0 def
|
||||
/barratio 1 def
|
||||
/spaceratio 1 def
|
||||
/showborder false def
|
||||
/borderleft 10 def
|
||||
/borderright 10 def
|
||||
/bordertop 1 def
|
||||
/borderbottom 1 def
|
||||
/borderwidth 0.5 def
|
||||
/guardwhitespace false def
|
||||
/guardleftpos 0 def
|
||||
/guardleftypos 0 def
|
||||
/guardrightpos 0 def
|
||||
/guardrightypos 0 def
|
||||
/guardwidth 6 def
|
||||
/guardheight 7 def
|
||||
|
||||
% Apply the renderer options and the user options
|
||||
args {def} forall
|
||||
opt {def} forall
|
||||
|
||||
/barcolor barcolor cvlit def
|
||||
/textcolor textcolor cvlit def
|
||||
/textxalign textxalign cvlit def
|
||||
/textyalign textyalign cvlit def
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textxoffset textxoffset cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/textgaps textgaps cvr def
|
||||
/alttext alttext cvlit def
|
||||
/bordercolor bordercolor cvlit def
|
||||
/backgroundcolor backgroundcolor cvlit def
|
||||
/inkspread inkspread cvr def
|
||||
/width width cvr def
|
||||
/barratio barratio cvr def
|
||||
/spaceratio spaceratio cvr def
|
||||
/borderleft borderleft cvr def
|
||||
/borderright borderright cvr def
|
||||
/bordertop bordertop cvr def
|
||||
/borderbottom borderbottom cvr def
|
||||
/borderwidth borderwidth cvr def
|
||||
/guardleftpos guardleftpos cvr def
|
||||
/guardleftypos guardleftypos cvr def
|
||||
/guardrightpos guardrightpos cvr def
|
||||
/guardrightypos guardrightypos cvr def
|
||||
/guardwidth guardwidth cvr def
|
||||
/guardheight guardheight cvr def
|
||||
|
||||
% Create bar elements and put them into the bars array
|
||||
/bars sbs length 1 add 2 idiv array def
|
||||
/x 0.00 def /maxh 0 def
|
||||
0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
|
||||
/i exch def
|
||||
i 2 mod 0 eq { % i is even
|
||||
/d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
|
||||
sbs i get 0 ne {
|
||||
/h bhs i 2 idiv get 72 mul def % Height from bhs
|
||||
/c d 2 div x add def % Centre of the bar = x + d/2
|
||||
/y bbs i 2 idiv get 72 mul def % Baseline from bbs
|
||||
/w d inkspread sub def % bar width = digit - inkspread
|
||||
bars i 2 idiv [h c y w] put % Add the bar entry
|
||||
h y add maxh gt {/maxh h y add def} if
|
||||
} {
|
||||
bars i 2 idiv -1 put % Dummy entry
|
||||
} ifelse
|
||||
} {
|
||||
/d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
|
||||
} ifelse
|
||||
/x x d add def % x+=d
|
||||
} for
|
||||
|
||||
gsave
|
||||
|
||||
currentpoint translate
|
||||
|
||||
% Force symbol to given width
|
||||
width 0 ne {
|
||||
width 72 mul x div 1 scale
|
||||
} if
|
||||
|
||||
% Set RGB or CMYK color depending on length of given hex string
|
||||
/setanycolor {
|
||||
/anycolor exch def
|
||||
anycolor length 6 eq {
|
||||
(< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
|
||||
} if
|
||||
anycolor length 8 eq {
|
||||
(< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
|
||||
} if
|
||||
} bind def
|
||||
|
||||
% Display the border and background
|
||||
newpath
|
||||
borderleft neg borderbottom neg moveto
|
||||
x borderleft add borderright add 0 rlineto
|
||||
0 maxh borderbottom add bordertop add rlineto
|
||||
x borderleft add borderright add neg 0 rlineto
|
||||
0 maxh borderbottom add bordertop add neg rlineto
|
||||
closepath
|
||||
backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
|
||||
showborder {
|
||||
gsave
|
||||
bordercolor (unset) ne { bordercolor setanycolor } if
|
||||
borderwidth setlinewidth stroke
|
||||
grestore
|
||||
} if
|
||||
|
||||
% Display the bars for elements in the bars array
|
||||
gsave
|
||||
0 setlinecap
|
||||
barcolor (unset) ne { barcolor setanycolor } if
|
||||
bars {
|
||||
dup -1 ne {
|
||||
aload pop newpath setlinewidth moveto 0 exch rlineto stroke
|
||||
} {
|
||||
pop
|
||||
} ifelse
|
||||
} forall
|
||||
grestore
|
||||
|
||||
% Display the text for elements in the text array
|
||||
textcolor (unset) ne { textcolor setanycolor } if
|
||||
includetext {
|
||||
textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
|
||||
/s 0 def /f () def
|
||||
txt {
|
||||
{} forall
|
||||
2 copy s ne exch f ne or {
|
||||
2 copy /s exch def /f exch def
|
||||
exch findfont exch scalefont setfont
|
||||
} {
|
||||
pop pop
|
||||
} ifelse
|
||||
moveto show
|
||||
} forall
|
||||
} {
|
||||
textfont findfont textsize scalefont setfont
|
||||
alttext () eq {
|
||||
/txt [ txt { 0 get {} forall } forall ] def
|
||||
/tstr txt length string def
|
||||
0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
|
||||
} {
|
||||
/tstr alttext def
|
||||
} ifelse
|
||||
|
||||
% Find true ascent of font
|
||||
tstr length 0 eq {
|
||||
0
|
||||
} {
|
||||
gsave
|
||||
newpath 0 0 moveto (0) false charpath pathbbox
|
||||
4 1 roll pop pop pop
|
||||
grestore
|
||||
currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
|
||||
currentfont /StrokeWidth known and {
|
||||
currentfont /StrokeWidth get 2 div 0 exch
|
||||
currentfont /FontMatrix get dtransform
|
||||
dup mul exch dup mul add sqrt
|
||||
add
|
||||
} if
|
||||
} ifelse
|
||||
/textascent exch def
|
||||
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
|
||||
|
||||
/textxpos textxoffset x textwidth sub 2 div add def
|
||||
textxalign (left) eq { /textxpos textxoffset def } if
|
||||
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
|
||||
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
|
||||
textxalign (offright) eq { /textxpos x textxoffset add def } if
|
||||
textxalign (justify) eq textwidth x lt and {
|
||||
/textxpos 0 def
|
||||
/textgaps x textwidth sub tstr length 1 sub div def
|
||||
} if
|
||||
/textypos textyoffset textascent add 1 add neg def
|
||||
textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
|
||||
textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
|
||||
textxpos textypos moveto textgaps 0 tstr ashow
|
||||
} ifelse
|
||||
} if
|
||||
|
||||
% Display the guard elements
|
||||
guardwhitespace {
|
||||
0.75 setlinewidth
|
||||
guardleftpos 0 ne {
|
||||
newpath
|
||||
guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
guardrightpos 0 ne {
|
||||
newpath
|
||||
guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
} if
|
||||
|
||||
grestore
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
% --DESC: Code 93
|
||||
% --EXAM: THIS IS CODE 93
|
||||
% --EXOP: includetext includecheck
|
||||
% --RNDR: renlinear
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
|
||||
begin
|
||||
/code93 {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/options exch def % We are given an option string
|
||||
/barcode exch def % We are given a barcode string
|
||||
|
||||
/dontdraw false def
|
||||
/includecheck false def % Enable/disable checkdigit
|
||||
/includetext false def % Enable/disable text
|
||||
/textfont /Courier def
|
||||
/textsize 10 def
|
||||
/textyoffset -7 def
|
||||
/height 1 def
|
||||
/parsefnc false def
|
||||
|
||||
% Parse the input options
|
||||
options type /stringtype eq {
|
||||
1 dict begin
|
||||
options {
|
||||
token false eq {exit} if dup length string cvs (=) search
|
||||
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
||||
} loop
|
||||
currentdict end /options exch def
|
||||
} if
|
||||
options {def} forall
|
||||
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/height height cvr def
|
||||
|
||||
/encs
|
||||
[ (131112) (111213) (111312) (111411) (121113)
|
||||
(121212) (121311) (111114) (131211) (141111)
|
||||
(211113) (211212) (211311) (221112) (221211)
|
||||
(231111) (112113) (112212) (112311) (122112)
|
||||
(132111) (111123) (111222) (111321) (121122)
|
||||
(131121) (212112) (212211) (211122) (211221)
|
||||
(221121) (222111) (112122) (112221) (122121)
|
||||
(123111) (121131) (311112) (311211) (321111)
|
||||
(112131) (113121) (211131) (121221) (312111)
|
||||
(311121) (122211) (111141) (1111411)
|
||||
] def
|
||||
|
||||
% Create a string of the available characters
|
||||
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
|
||||
|
||||
/barlen barcode length def
|
||||
|
||||
% Special function characters
|
||||
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
|
||||
/fncvals <<
|
||||
(SFT$) sft1
|
||||
(SFT%) sft2
|
||||
(SFT/) sft3
|
||||
(SFT+) sft4
|
||||
>> def
|
||||
|
||||
% Convert input into bytes accounting for shift characters
|
||||
/msg barlen array def
|
||||
/i 0 def /j 0 def {
|
||||
i barlen eq {exit} if
|
||||
/char barcode i get def
|
||||
parsefnc char 94 eq and i barlen 4 sub lt and {
|
||||
barcode i 1 add get 94 ne {
|
||||
/char fncvals barcode i 1 add 4 getinterval get def
|
||||
/i i 4 add def
|
||||
} {
|
||||
/i i 1 add def
|
||||
} ifelse
|
||||
} if
|
||||
msg j char put
|
||||
/i i 1 add def
|
||||
/j j 1 add def
|
||||
} loop
|
||||
/msg msg 0 j getinterval def
|
||||
/msglen msg length def
|
||||
|
||||
includecheck {
|
||||
/sbs msglen 6 mul 25 add string def
|
||||
} {
|
||||
/sbs msglen 6 mul 13 add string def
|
||||
} ifelse
|
||||
/txt msglen array def
|
||||
|
||||
% Put the start character
|
||||
sbs 0 encs 47 get putinterval
|
||||
|
||||
/checksum1 0 def /checksum2 0 def
|
||||
0 1 msglen 1 sub {
|
||||
/i exch def
|
||||
% Lookup the encoding for the each barcode character
|
||||
msg i get dup 0 lt {
|
||||
42 exch sub /indx exch def
|
||||
/char ( ) def
|
||||
} {
|
||||
1 string dup 0 4 -1 roll put /char exch def
|
||||
barchars char search
|
||||
pop % Discard true leaving pre
|
||||
length /indx exch def % indx is the length of pre
|
||||
pop pop % Discard seek and post
|
||||
} ifelse
|
||||
/enc encs indx get def % Get the indxth encoding
|
||||
sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
|
||||
txt i [char i 9 mul 9 add textyoffset textfont textsize] put
|
||||
/checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
|
||||
/checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
|
||||
} for
|
||||
|
||||
includecheck {
|
||||
% Put the first checksum character
|
||||
/checksum1 checksum1 47 mod def
|
||||
/checksum2 checksum2 checksum1 add 47 mod def
|
||||
sbs msglen 6 mul 6 add encs checksum1 get putinterval
|
||||
sbs msglen 6 mul 12 add encs checksum2 get putinterval
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 18 add encs 48 get putinterval
|
||||
} {
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 6 add encs 48 get putinterval
|
||||
} ifelse
|
||||
|
||||
% Return the arguments
|
||||
<<
|
||||
/ren //renlinear
|
||||
/sbs [sbs {48 sub} forall]
|
||||
/bhs [sbs length 1 add 2 idiv {height} repeat]
|
||||
/bbs [sbs length 1 add 2 idiv {0} repeat]
|
||||
includetext {
|
||||
/txt txt
|
||||
} if
|
||||
/opt options
|
||||
>>
|
||||
|
||||
dontdraw not //renlinear if
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/code93 dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
gsave
|
||||
50 50 translate
|
||||
0 0 moveto <544f20474f20414c4c> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
|
||||
grestore
|
||||
|
||||
showpage
|
@ -0,0 +1,409 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Creator: Terry Burton
|
||||
%%BoundingBox: 50 40 177 122
|
||||
%%EndComments
|
||||
%%EndProlog
|
||||
|
||||
currentglobal
|
||||
true setglobal
|
||||
/Generic /Category findresource
|
||||
dup length 1 add dict copy
|
||||
dup /InstanceType /packedarraytype put
|
||||
/uk.co.terryburton.bwipp exch /Category defineresource pop
|
||||
setglobal
|
||||
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
begin
|
||||
/renlinear {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/args exch def % We are given some arguments
|
||||
|
||||
% Default options
|
||||
/sbs [] def
|
||||
/bhs [] def
|
||||
/bbs [] def
|
||||
/txt [] def
|
||||
/barcolor (unset) def
|
||||
/includetext false def
|
||||
/textcolor (unset) def
|
||||
/textxalign (unset) def
|
||||
/textyalign (unset) def
|
||||
/textfont (Courier) def
|
||||
/textsize 10 def
|
||||
/textxoffset 0 def
|
||||
/textyoffset 0 def
|
||||
/textgaps 0 def
|
||||
/alttext () def
|
||||
/bordercolor (unset) def
|
||||
/backgroundcolor (unset) def
|
||||
/inkspread 0.15 def
|
||||
/width 0 def
|
||||
/barratio 1 def
|
||||
/spaceratio 1 def
|
||||
/showborder false def
|
||||
/borderleft 10 def
|
||||
/borderright 10 def
|
||||
/bordertop 1 def
|
||||
/borderbottom 1 def
|
||||
/borderwidth 0.5 def
|
||||
/guardwhitespace false def
|
||||
/guardleftpos 0 def
|
||||
/guardleftypos 0 def
|
||||
/guardrightpos 0 def
|
||||
/guardrightypos 0 def
|
||||
/guardwidth 6 def
|
||||
/guardheight 7 def
|
||||
|
||||
% Apply the renderer options and the user options
|
||||
args {def} forall
|
||||
opt {def} forall
|
||||
|
||||
/barcolor barcolor cvlit def
|
||||
/textcolor textcolor cvlit def
|
||||
/textxalign textxalign cvlit def
|
||||
/textyalign textyalign cvlit def
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textxoffset textxoffset cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/textgaps textgaps cvr def
|
||||
/alttext alttext cvlit def
|
||||
/bordercolor bordercolor cvlit def
|
||||
/backgroundcolor backgroundcolor cvlit def
|
||||
/inkspread inkspread cvr def
|
||||
/width width cvr def
|
||||
/barratio barratio cvr def
|
||||
/spaceratio spaceratio cvr def
|
||||
/borderleft borderleft cvr def
|
||||
/borderright borderright cvr def
|
||||
/bordertop bordertop cvr def
|
||||
/borderbottom borderbottom cvr def
|
||||
/borderwidth borderwidth cvr def
|
||||
/guardleftpos guardleftpos cvr def
|
||||
/guardleftypos guardleftypos cvr def
|
||||
/guardrightpos guardrightpos cvr def
|
||||
/guardrightypos guardrightypos cvr def
|
||||
/guardwidth guardwidth cvr def
|
||||
/guardheight guardheight cvr def
|
||||
|
||||
% Create bar elements and put them into the bars array
|
||||
/bars sbs length 1 add 2 idiv array def
|
||||
/x 0.00 def /maxh 0 def
|
||||
0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
|
||||
/i exch def
|
||||
i 2 mod 0 eq { % i is even
|
||||
/d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
|
||||
sbs i get 0 ne {
|
||||
/h bhs i 2 idiv get 72 mul def % Height from bhs
|
||||
/c d 2 div x add def % Centre of the bar = x + d/2
|
||||
/y bbs i 2 idiv get 72 mul def % Baseline from bbs
|
||||
/w d inkspread sub def % bar width = digit - inkspread
|
||||
bars i 2 idiv [h c y w] put % Add the bar entry
|
||||
h y add maxh gt {/maxh h y add def} if
|
||||
} {
|
||||
bars i 2 idiv -1 put % Dummy entry
|
||||
} ifelse
|
||||
} {
|
||||
/d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
|
||||
} ifelse
|
||||
/x x d add def % x+=d
|
||||
} for
|
||||
|
||||
gsave
|
||||
|
||||
currentpoint translate
|
||||
|
||||
% Force symbol to given width
|
||||
width 0 ne {
|
||||
width 72 mul x div 1 scale
|
||||
} if
|
||||
|
||||
% Set RGB or CMYK color depending on length of given hex string
|
||||
/setanycolor {
|
||||
/anycolor exch def
|
||||
anycolor length 6 eq {
|
||||
(< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
|
||||
} if
|
||||
anycolor length 8 eq {
|
||||
(< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
|
||||
} if
|
||||
} bind def
|
||||
|
||||
% Display the border and background
|
||||
newpath
|
||||
borderleft neg borderbottom neg moveto
|
||||
x borderleft add borderright add 0 rlineto
|
||||
0 maxh borderbottom add bordertop add rlineto
|
||||
x borderleft add borderright add neg 0 rlineto
|
||||
0 maxh borderbottom add bordertop add neg rlineto
|
||||
closepath
|
||||
backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
|
||||
showborder {
|
||||
gsave
|
||||
bordercolor (unset) ne { bordercolor setanycolor } if
|
||||
borderwidth setlinewidth stroke
|
||||
grestore
|
||||
} if
|
||||
|
||||
% Display the bars for elements in the bars array
|
||||
gsave
|
||||
0 setlinecap
|
||||
barcolor (unset) ne { barcolor setanycolor } if
|
||||
bars {
|
||||
dup -1 ne {
|
||||
aload pop newpath setlinewidth moveto 0 exch rlineto stroke
|
||||
} {
|
||||
pop
|
||||
} ifelse
|
||||
} forall
|
||||
grestore
|
||||
|
||||
% Display the text for elements in the text array
|
||||
textcolor (unset) ne { textcolor setanycolor } if
|
||||
includetext {
|
||||
textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
|
||||
/s 0 def /f () def
|
||||
txt {
|
||||
{} forall
|
||||
2 copy s ne exch f ne or {
|
||||
2 copy /s exch def /f exch def
|
||||
exch findfont exch scalefont setfont
|
||||
} {
|
||||
pop pop
|
||||
} ifelse
|
||||
moveto show
|
||||
} forall
|
||||
} {
|
||||
textfont findfont textsize scalefont setfont
|
||||
alttext () eq {
|
||||
/txt [ txt { 0 get {} forall } forall ] def
|
||||
/tstr txt length string def
|
||||
0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
|
||||
} {
|
||||
/tstr alttext def
|
||||
} ifelse
|
||||
|
||||
% Find true ascent of font
|
||||
tstr length 0 eq {
|
||||
0
|
||||
} {
|
||||
gsave
|
||||
newpath 0 0 moveto (0) false charpath pathbbox
|
||||
4 1 roll pop pop pop
|
||||
grestore
|
||||
currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
|
||||
currentfont /StrokeWidth known and {
|
||||
currentfont /StrokeWidth get 2 div 0 exch
|
||||
currentfont /FontMatrix get dtransform
|
||||
dup mul exch dup mul add sqrt
|
||||
add
|
||||
} if
|
||||
} ifelse
|
||||
/textascent exch def
|
||||
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
|
||||
|
||||
/textxpos textxoffset x textwidth sub 2 div add def
|
||||
textxalign (left) eq { /textxpos textxoffset def } if
|
||||
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
|
||||
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
|
||||
textxalign (offright) eq { /textxpos x textxoffset add def } if
|
||||
textxalign (justify) eq textwidth x lt and {
|
||||
/textxpos 0 def
|
||||
/textgaps x textwidth sub tstr length 1 sub div def
|
||||
} if
|
||||
/textypos textyoffset textascent add 1 add neg def
|
||||
textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
|
||||
textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
|
||||
textxpos textypos moveto textgaps 0 tstr ashow
|
||||
} ifelse
|
||||
} if
|
||||
|
||||
% Display the guard elements
|
||||
guardwhitespace {
|
||||
0.75 setlinewidth
|
||||
guardleftpos 0 ne {
|
||||
newpath
|
||||
guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
guardrightpos 0 ne {
|
||||
newpath
|
||||
guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
} if
|
||||
|
||||
grestore
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
% --DESC: Code 93
|
||||
% --EXAM: THIS IS CODE 93
|
||||
% --EXOP: includetext includecheck
|
||||
% --RNDR: renlinear
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
|
||||
begin
|
||||
/code93 {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/options exch def % We are given an option string
|
||||
/barcode exch def % We are given a barcode string
|
||||
|
||||
/dontdraw false def
|
||||
/includecheck false def % Enable/disable checkdigit
|
||||
/includetext false def % Enable/disable text
|
||||
/textfont /Courier def
|
||||
/textsize 10 def
|
||||
/textyoffset -7 def
|
||||
/height 1 def
|
||||
/parsefnc false def
|
||||
|
||||
% Parse the input options
|
||||
options type /stringtype eq {
|
||||
1 dict begin
|
||||
options {
|
||||
token false eq {exit} if dup length string cvs (=) search
|
||||
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
||||
} loop
|
||||
currentdict end /options exch def
|
||||
} if
|
||||
options {def} forall
|
||||
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/height height cvr def
|
||||
|
||||
/encs
|
||||
[ (131112) (111213) (111312) (111411) (121113)
|
||||
(121212) (121311) (111114) (131211) (141111)
|
||||
(211113) (211212) (211311) (221112) (221211)
|
||||
(231111) (112113) (112212) (112311) (122112)
|
||||
(132111) (111123) (111222) (111321) (121122)
|
||||
(131121) (212112) (212211) (211122) (211221)
|
||||
(221121) (222111) (112122) (112221) (122121)
|
||||
(123111) (121131) (311112) (311211) (321111)
|
||||
(112131) (113121) (211131) (121221) (312111)
|
||||
(311121) (122211) (111141) (1111411)
|
||||
] def
|
||||
|
||||
% Create a string of the available characters
|
||||
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
|
||||
|
||||
/barlen barcode length def
|
||||
|
||||
% Special function characters
|
||||
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
|
||||
/fncvals <<
|
||||
(SFT$) sft1
|
||||
(SFT%) sft2
|
||||
(SFT/) sft3
|
||||
(SFT+) sft4
|
||||
>> def
|
||||
|
||||
% Convert input into bytes accounting for shift characters
|
||||
/msg barlen array def
|
||||
/i 0 def /j 0 def {
|
||||
i barlen eq {exit} if
|
||||
/char barcode i get def
|
||||
parsefnc char 94 eq and i barlen 4 sub lt and {
|
||||
barcode i 1 add get 94 ne {
|
||||
/char fncvals barcode i 1 add 4 getinterval get def
|
||||
/i i 4 add def
|
||||
} {
|
||||
/i i 1 add def
|
||||
} ifelse
|
||||
} if
|
||||
msg j char put
|
||||
/i i 1 add def
|
||||
/j j 1 add def
|
||||
} loop
|
||||
/msg msg 0 j getinterval def
|
||||
/msglen msg length def
|
||||
|
||||
includecheck {
|
||||
/sbs msglen 6 mul 25 add string def
|
||||
} {
|
||||
/sbs msglen 6 mul 13 add string def
|
||||
} ifelse
|
||||
/txt msglen array def
|
||||
|
||||
% Put the start character
|
||||
sbs 0 encs 47 get putinterval
|
||||
|
||||
/checksum1 0 def /checksum2 0 def
|
||||
0 1 msglen 1 sub {
|
||||
/i exch def
|
||||
% Lookup the encoding for the each barcode character
|
||||
msg i get dup 0 lt {
|
||||
42 exch sub /indx exch def
|
||||
/char ( ) def
|
||||
} {
|
||||
1 string dup 0 4 -1 roll put /char exch def
|
||||
barchars char search
|
||||
pop % Discard true leaving pre
|
||||
length /indx exch def % indx is the length of pre
|
||||
pop pop % Discard seek and post
|
||||
} ifelse
|
||||
/enc encs indx get def % Get the indxth encoding
|
||||
sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
|
||||
txt i [char i 9 mul 9 add textyoffset textfont textsize] put
|
||||
/checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
|
||||
/checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
|
||||
} for
|
||||
|
||||
includecheck {
|
||||
% Put the first checksum character
|
||||
/checksum1 checksum1 47 mod def
|
||||
/checksum2 checksum2 checksum1 add 47 mod def
|
||||
sbs msglen 6 mul 6 add encs checksum1 get putinterval
|
||||
sbs msglen 6 mul 12 add encs checksum2 get putinterval
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 18 add encs 48 get putinterval
|
||||
} {
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 6 add encs 48 get putinterval
|
||||
} ifelse
|
||||
|
||||
% Return the arguments
|
||||
<<
|
||||
/ren //renlinear
|
||||
/sbs [sbs {48 sub} forall]
|
||||
/bhs [sbs length 1 add 2 idiv {height} repeat]
|
||||
/bbs [sbs length 1 add 2 idiv {0} repeat]
|
||||
includetext {
|
||||
/txt txt
|
||||
} if
|
||||
/opt options
|
||||
>>
|
||||
|
||||
dontdraw not //renlinear if
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/code93 dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
gsave
|
||||
50 50 translate
|
||||
0 0 moveto <544f20474f204e4f4e45> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
|
||||
grestore
|
||||
|
||||
showpage
|
@ -0,0 +1,409 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Creator: Terry Burton
|
||||
%%BoundingBox: 50 40 177 122
|
||||
%%EndComments
|
||||
%%EndProlog
|
||||
|
||||
currentglobal
|
||||
true setglobal
|
||||
/Generic /Category findresource
|
||||
dup length 1 add dict copy
|
||||
dup /InstanceType /packedarraytype put
|
||||
/uk.co.terryburton.bwipp exch /Category defineresource pop
|
||||
setglobal
|
||||
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
begin
|
||||
/renlinear {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/args exch def % We are given some arguments
|
||||
|
||||
% Default options
|
||||
/sbs [] def
|
||||
/bhs [] def
|
||||
/bbs [] def
|
||||
/txt [] def
|
||||
/barcolor (unset) def
|
||||
/includetext false def
|
||||
/textcolor (unset) def
|
||||
/textxalign (unset) def
|
||||
/textyalign (unset) def
|
||||
/textfont (Courier) def
|
||||
/textsize 10 def
|
||||
/textxoffset 0 def
|
||||
/textyoffset 0 def
|
||||
/textgaps 0 def
|
||||
/alttext () def
|
||||
/bordercolor (unset) def
|
||||
/backgroundcolor (unset) def
|
||||
/inkspread 0.15 def
|
||||
/width 0 def
|
||||
/barratio 1 def
|
||||
/spaceratio 1 def
|
||||
/showborder false def
|
||||
/borderleft 10 def
|
||||
/borderright 10 def
|
||||
/bordertop 1 def
|
||||
/borderbottom 1 def
|
||||
/borderwidth 0.5 def
|
||||
/guardwhitespace false def
|
||||
/guardleftpos 0 def
|
||||
/guardleftypos 0 def
|
||||
/guardrightpos 0 def
|
||||
/guardrightypos 0 def
|
||||
/guardwidth 6 def
|
||||
/guardheight 7 def
|
||||
|
||||
% Apply the renderer options and the user options
|
||||
args {def} forall
|
||||
opt {def} forall
|
||||
|
||||
/barcolor barcolor cvlit def
|
||||
/textcolor textcolor cvlit def
|
||||
/textxalign textxalign cvlit def
|
||||
/textyalign textyalign cvlit def
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textxoffset textxoffset cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/textgaps textgaps cvr def
|
||||
/alttext alttext cvlit def
|
||||
/bordercolor bordercolor cvlit def
|
||||
/backgroundcolor backgroundcolor cvlit def
|
||||
/inkspread inkspread cvr def
|
||||
/width width cvr def
|
||||
/barratio barratio cvr def
|
||||
/spaceratio spaceratio cvr def
|
||||
/borderleft borderleft cvr def
|
||||
/borderright borderright cvr def
|
||||
/bordertop bordertop cvr def
|
||||
/borderbottom borderbottom cvr def
|
||||
/borderwidth borderwidth cvr def
|
||||
/guardleftpos guardleftpos cvr def
|
||||
/guardleftypos guardleftypos cvr def
|
||||
/guardrightpos guardrightpos cvr def
|
||||
/guardrightypos guardrightypos cvr def
|
||||
/guardwidth guardwidth cvr def
|
||||
/guardheight guardheight cvr def
|
||||
|
||||
% Create bar elements and put them into the bars array
|
||||
/bars sbs length 1 add 2 idiv array def
|
||||
/x 0.00 def /maxh 0 def
|
||||
0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
|
||||
/i exch def
|
||||
i 2 mod 0 eq { % i is even
|
||||
/d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
|
||||
sbs i get 0 ne {
|
||||
/h bhs i 2 idiv get 72 mul def % Height from bhs
|
||||
/c d 2 div x add def % Centre of the bar = x + d/2
|
||||
/y bbs i 2 idiv get 72 mul def % Baseline from bbs
|
||||
/w d inkspread sub def % bar width = digit - inkspread
|
||||
bars i 2 idiv [h c y w] put % Add the bar entry
|
||||
h y add maxh gt {/maxh h y add def} if
|
||||
} {
|
||||
bars i 2 idiv -1 put % Dummy entry
|
||||
} ifelse
|
||||
} {
|
||||
/d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
|
||||
} ifelse
|
||||
/x x d add def % x+=d
|
||||
} for
|
||||
|
||||
gsave
|
||||
|
||||
currentpoint translate
|
||||
|
||||
% Force symbol to given width
|
||||
width 0 ne {
|
||||
width 72 mul x div 1 scale
|
||||
} if
|
||||
|
||||
% Set RGB or CMYK color depending on length of given hex string
|
||||
/setanycolor {
|
||||
/anycolor exch def
|
||||
anycolor length 6 eq {
|
||||
(< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
|
||||
} if
|
||||
anycolor length 8 eq {
|
||||
(< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
|
||||
} if
|
||||
} bind def
|
||||
|
||||
% Display the border and background
|
||||
newpath
|
||||
borderleft neg borderbottom neg moveto
|
||||
x borderleft add borderright add 0 rlineto
|
||||
0 maxh borderbottom add bordertop add rlineto
|
||||
x borderleft add borderright add neg 0 rlineto
|
||||
0 maxh borderbottom add bordertop add neg rlineto
|
||||
closepath
|
||||
backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
|
||||
showborder {
|
||||
gsave
|
||||
bordercolor (unset) ne { bordercolor setanycolor } if
|
||||
borderwidth setlinewidth stroke
|
||||
grestore
|
||||
} if
|
||||
|
||||
% Display the bars for elements in the bars array
|
||||
gsave
|
||||
0 setlinecap
|
||||
barcolor (unset) ne { barcolor setanycolor } if
|
||||
bars {
|
||||
dup -1 ne {
|
||||
aload pop newpath setlinewidth moveto 0 exch rlineto stroke
|
||||
} {
|
||||
pop
|
||||
} ifelse
|
||||
} forall
|
||||
grestore
|
||||
|
||||
% Display the text for elements in the text array
|
||||
textcolor (unset) ne { textcolor setanycolor } if
|
||||
includetext {
|
||||
textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
|
||||
/s 0 def /f () def
|
||||
txt {
|
||||
{} forall
|
||||
2 copy s ne exch f ne or {
|
||||
2 copy /s exch def /f exch def
|
||||
exch findfont exch scalefont setfont
|
||||
} {
|
||||
pop pop
|
||||
} ifelse
|
||||
moveto show
|
||||
} forall
|
||||
} {
|
||||
textfont findfont textsize scalefont setfont
|
||||
alttext () eq {
|
||||
/txt [ txt { 0 get {} forall } forall ] def
|
||||
/tstr txt length string def
|
||||
0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
|
||||
} {
|
||||
/tstr alttext def
|
||||
} ifelse
|
||||
|
||||
% Find true ascent of font
|
||||
tstr length 0 eq {
|
||||
0
|
||||
} {
|
||||
gsave
|
||||
newpath 0 0 moveto (0) false charpath pathbbox
|
||||
4 1 roll pop pop pop
|
||||
grestore
|
||||
currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
|
||||
currentfont /StrokeWidth known and {
|
||||
currentfont /StrokeWidth get 2 div 0 exch
|
||||
currentfont /FontMatrix get dtransform
|
||||
dup mul exch dup mul add sqrt
|
||||
add
|
||||
} if
|
||||
} ifelse
|
||||
/textascent exch def
|
||||
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
|
||||
|
||||
/textxpos textxoffset x textwidth sub 2 div add def
|
||||
textxalign (left) eq { /textxpos textxoffset def } if
|
||||
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
|
||||
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
|
||||
textxalign (offright) eq { /textxpos x textxoffset add def } if
|
||||
textxalign (justify) eq textwidth x lt and {
|
||||
/textxpos 0 def
|
||||
/textgaps x textwidth sub tstr length 1 sub div def
|
||||
} if
|
||||
/textypos textyoffset textascent add 1 add neg def
|
||||
textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
|
||||
textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
|
||||
textxpos textypos moveto textgaps 0 tstr ashow
|
||||
} ifelse
|
||||
} if
|
||||
|
||||
% Display the guard elements
|
||||
guardwhitespace {
|
||||
0.75 setlinewidth
|
||||
guardleftpos 0 ne {
|
||||
newpath
|
||||
guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
guardrightpos 0 ne {
|
||||
newpath
|
||||
guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
} if
|
||||
|
||||
grestore
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
% --DESC: Code 93
|
||||
% --EXAM: THIS IS CODE 93
|
||||
% --EXOP: includetext includecheck
|
||||
% --RNDR: renlinear
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
|
||||
begin
|
||||
/code93 {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/options exch def % We are given an option string
|
||||
/barcode exch def % We are given a barcode string
|
||||
|
||||
/dontdraw false def
|
||||
/includecheck false def % Enable/disable checkdigit
|
||||
/includetext false def % Enable/disable text
|
||||
/textfont /Courier def
|
||||
/textsize 10 def
|
||||
/textyoffset -7 def
|
||||
/height 1 def
|
||||
/parsefnc false def
|
||||
|
||||
% Parse the input options
|
||||
options type /stringtype eq {
|
||||
1 dict begin
|
||||
options {
|
||||
token false eq {exit} if dup length string cvs (=) search
|
||||
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
||||
} loop
|
||||
currentdict end /options exch def
|
||||
} if
|
||||
options {def} forall
|
||||
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/height height cvr def
|
||||
|
||||
/encs
|
||||
[ (131112) (111213) (111312) (111411) (121113)
|
||||
(121212) (121311) (111114) (131211) (141111)
|
||||
(211113) (211212) (211311) (221112) (221211)
|
||||
(231111) (112113) (112212) (112311) (122112)
|
||||
(132111) (111123) (111222) (111321) (121122)
|
||||
(131121) (212112) (212211) (211122) (211221)
|
||||
(221121) (222111) (112122) (112221) (122121)
|
||||
(123111) (121131) (311112) (311211) (321111)
|
||||
(112131) (113121) (211131) (121221) (312111)
|
||||
(311121) (122211) (111141) (1111411)
|
||||
] def
|
||||
|
||||
% Create a string of the available characters
|
||||
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
|
||||
|
||||
/barlen barcode length def
|
||||
|
||||
% Special function characters
|
||||
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
|
||||
/fncvals <<
|
||||
(SFT$) sft1
|
||||
(SFT%) sft2
|
||||
(SFT/) sft3
|
||||
(SFT+) sft4
|
||||
>> def
|
||||
|
||||
% Convert input into bytes accounting for shift characters
|
||||
/msg barlen array def
|
||||
/i 0 def /j 0 def {
|
||||
i barlen eq {exit} if
|
||||
/char barcode i get def
|
||||
parsefnc char 94 eq and i barlen 4 sub lt and {
|
||||
barcode i 1 add get 94 ne {
|
||||
/char fncvals barcode i 1 add 4 getinterval get def
|
||||
/i i 4 add def
|
||||
} {
|
||||
/i i 1 add def
|
||||
} ifelse
|
||||
} if
|
||||
msg j char put
|
||||
/i i 1 add def
|
||||
/j j 1 add def
|
||||
} loop
|
||||
/msg msg 0 j getinterval def
|
||||
/msglen msg length def
|
||||
|
||||
includecheck {
|
||||
/sbs msglen 6 mul 25 add string def
|
||||
} {
|
||||
/sbs msglen 6 mul 13 add string def
|
||||
} ifelse
|
||||
/txt msglen array def
|
||||
|
||||
% Put the start character
|
||||
sbs 0 encs 47 get putinterval
|
||||
|
||||
/checksum1 0 def /checksum2 0 def
|
||||
0 1 msglen 1 sub {
|
||||
/i exch def
|
||||
% Lookup the encoding for the each barcode character
|
||||
msg i get dup 0 lt {
|
||||
42 exch sub /indx exch def
|
||||
/char ( ) def
|
||||
} {
|
||||
1 string dup 0 4 -1 roll put /char exch def
|
||||
barchars char search
|
||||
pop % Discard true leaving pre
|
||||
length /indx exch def % indx is the length of pre
|
||||
pop pop % Discard seek and post
|
||||
} ifelse
|
||||
/enc encs indx get def % Get the indxth encoding
|
||||
sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
|
||||
txt i [char i 9 mul 9 add textyoffset textfont textsize] put
|
||||
/checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
|
||||
/checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
|
||||
} for
|
||||
|
||||
includecheck {
|
||||
% Put the first checksum character
|
||||
/checksum1 checksum1 47 mod def
|
||||
/checksum2 checksum2 checksum1 add 47 mod def
|
||||
sbs msglen 6 mul 6 add encs checksum1 get putinterval
|
||||
sbs msglen 6 mul 12 add encs checksum2 get putinterval
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 18 add encs 48 get putinterval
|
||||
} {
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 6 add encs 48 get putinterval
|
||||
} ifelse
|
||||
|
||||
% Return the arguments
|
||||
<<
|
||||
/ren //renlinear
|
||||
/sbs [sbs {48 sub} forall]
|
||||
/bhs [sbs length 1 add 2 idiv {height} repeat]
|
||||
/bbs [sbs length 1 add 2 idiv {0} repeat]
|
||||
includetext {
|
||||
/txt txt
|
||||
} if
|
||||
/opt options
|
||||
>>
|
||||
|
||||
dontdraw not //renlinear if
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/code93 dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
gsave
|
||||
50 50 translate
|
||||
0 0 moveto <544f20474f204f4e4c59> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
|
||||
grestore
|
||||
|
||||
showpage
|
@ -0,0 +1,409 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Creator: Terry Burton
|
||||
%%BoundingBox: 50 40 177 122
|
||||
%%EndComments
|
||||
%%EndProlog
|
||||
|
||||
currentglobal
|
||||
true setglobal
|
||||
/Generic /Category findresource
|
||||
dup length 1 add dict copy
|
||||
dup /InstanceType /packedarraytype put
|
||||
/uk.co.terryburton.bwipp exch /Category defineresource pop
|
||||
setglobal
|
||||
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
begin
|
||||
/renlinear {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/args exch def % We are given some arguments
|
||||
|
||||
% Default options
|
||||
/sbs [] def
|
||||
/bhs [] def
|
||||
/bbs [] def
|
||||
/txt [] def
|
||||
/barcolor (unset) def
|
||||
/includetext false def
|
||||
/textcolor (unset) def
|
||||
/textxalign (unset) def
|
||||
/textyalign (unset) def
|
||||
/textfont (Courier) def
|
||||
/textsize 10 def
|
||||
/textxoffset 0 def
|
||||
/textyoffset 0 def
|
||||
/textgaps 0 def
|
||||
/alttext () def
|
||||
/bordercolor (unset) def
|
||||
/backgroundcolor (unset) def
|
||||
/inkspread 0.15 def
|
||||
/width 0 def
|
||||
/barratio 1 def
|
||||
/spaceratio 1 def
|
||||
/showborder false def
|
||||
/borderleft 10 def
|
||||
/borderright 10 def
|
||||
/bordertop 1 def
|
||||
/borderbottom 1 def
|
||||
/borderwidth 0.5 def
|
||||
/guardwhitespace false def
|
||||
/guardleftpos 0 def
|
||||
/guardleftypos 0 def
|
||||
/guardrightpos 0 def
|
||||
/guardrightypos 0 def
|
||||
/guardwidth 6 def
|
||||
/guardheight 7 def
|
||||
|
||||
% Apply the renderer options and the user options
|
||||
args {def} forall
|
||||
opt {def} forall
|
||||
|
||||
/barcolor barcolor cvlit def
|
||||
/textcolor textcolor cvlit def
|
||||
/textxalign textxalign cvlit def
|
||||
/textyalign textyalign cvlit def
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textxoffset textxoffset cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/textgaps textgaps cvr def
|
||||
/alttext alttext cvlit def
|
||||
/bordercolor bordercolor cvlit def
|
||||
/backgroundcolor backgroundcolor cvlit def
|
||||
/inkspread inkspread cvr def
|
||||
/width width cvr def
|
||||
/barratio barratio cvr def
|
||||
/spaceratio spaceratio cvr def
|
||||
/borderleft borderleft cvr def
|
||||
/borderright borderright cvr def
|
||||
/bordertop bordertop cvr def
|
||||
/borderbottom borderbottom cvr def
|
||||
/borderwidth borderwidth cvr def
|
||||
/guardleftpos guardleftpos cvr def
|
||||
/guardleftypos guardleftypos cvr def
|
||||
/guardrightpos guardrightpos cvr def
|
||||
/guardrightypos guardrightypos cvr def
|
||||
/guardwidth guardwidth cvr def
|
||||
/guardheight guardheight cvr def
|
||||
|
||||
% Create bar elements and put them into the bars array
|
||||
/bars sbs length 1 add 2 idiv array def
|
||||
/x 0.00 def /maxh 0 def
|
||||
0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
|
||||
/i exch def
|
||||
i 2 mod 0 eq { % i is even
|
||||
/d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
|
||||
sbs i get 0 ne {
|
||||
/h bhs i 2 idiv get 72 mul def % Height from bhs
|
||||
/c d 2 div x add def % Centre of the bar = x + d/2
|
||||
/y bbs i 2 idiv get 72 mul def % Baseline from bbs
|
||||
/w d inkspread sub def % bar width = digit - inkspread
|
||||
bars i 2 idiv [h c y w] put % Add the bar entry
|
||||
h y add maxh gt {/maxh h y add def} if
|
||||
} {
|
||||
bars i 2 idiv -1 put % Dummy entry
|
||||
} ifelse
|
||||
} {
|
||||
/d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
|
||||
} ifelse
|
||||
/x x d add def % x+=d
|
||||
} for
|
||||
|
||||
gsave
|
||||
|
||||
currentpoint translate
|
||||
|
||||
% Force symbol to given width
|
||||
width 0 ne {
|
||||
width 72 mul x div 1 scale
|
||||
} if
|
||||
|
||||
% Set RGB or CMYK color depending on length of given hex string
|
||||
/setanycolor {
|
||||
/anycolor exch def
|
||||
anycolor length 6 eq {
|
||||
(< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
|
||||
} if
|
||||
anycolor length 8 eq {
|
||||
(< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
|
||||
} if
|
||||
} bind def
|
||||
|
||||
% Display the border and background
|
||||
newpath
|
||||
borderleft neg borderbottom neg moveto
|
||||
x borderleft add borderright add 0 rlineto
|
||||
0 maxh borderbottom add bordertop add rlineto
|
||||
x borderleft add borderright add neg 0 rlineto
|
||||
0 maxh borderbottom add bordertop add neg rlineto
|
||||
closepath
|
||||
backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
|
||||
showborder {
|
||||
gsave
|
||||
bordercolor (unset) ne { bordercolor setanycolor } if
|
||||
borderwidth setlinewidth stroke
|
||||
grestore
|
||||
} if
|
||||
|
||||
% Display the bars for elements in the bars array
|
||||
gsave
|
||||
0 setlinecap
|
||||
barcolor (unset) ne { barcolor setanycolor } if
|
||||
bars {
|
||||
dup -1 ne {
|
||||
aload pop newpath setlinewidth moveto 0 exch rlineto stroke
|
||||
} {
|
||||
pop
|
||||
} ifelse
|
||||
} forall
|
||||
grestore
|
||||
|
||||
% Display the text for elements in the text array
|
||||
textcolor (unset) ne { textcolor setanycolor } if
|
||||
includetext {
|
||||
textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
|
||||
/s 0 def /f () def
|
||||
txt {
|
||||
{} forall
|
||||
2 copy s ne exch f ne or {
|
||||
2 copy /s exch def /f exch def
|
||||
exch findfont exch scalefont setfont
|
||||
} {
|
||||
pop pop
|
||||
} ifelse
|
||||
moveto show
|
||||
} forall
|
||||
} {
|
||||
textfont findfont textsize scalefont setfont
|
||||
alttext () eq {
|
||||
/txt [ txt { 0 get {} forall } forall ] def
|
||||
/tstr txt length string def
|
||||
0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
|
||||
} {
|
||||
/tstr alttext def
|
||||
} ifelse
|
||||
|
||||
% Find true ascent of font
|
||||
tstr length 0 eq {
|
||||
0
|
||||
} {
|
||||
gsave
|
||||
newpath 0 0 moveto (0) false charpath pathbbox
|
||||
4 1 roll pop pop pop
|
||||
grestore
|
||||
currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
|
||||
currentfont /StrokeWidth known and {
|
||||
currentfont /StrokeWidth get 2 div 0 exch
|
||||
currentfont /FontMatrix get dtransform
|
||||
dup mul exch dup mul add sqrt
|
||||
add
|
||||
} if
|
||||
} ifelse
|
||||
/textascent exch def
|
||||
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
|
||||
|
||||
/textxpos textxoffset x textwidth sub 2 div add def
|
||||
textxalign (left) eq { /textxpos textxoffset def } if
|
||||
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
|
||||
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
|
||||
textxalign (offright) eq { /textxpos x textxoffset add def } if
|
||||
textxalign (justify) eq textwidth x lt and {
|
||||
/textxpos 0 def
|
||||
/textgaps x textwidth sub tstr length 1 sub div def
|
||||
} if
|
||||
/textypos textyoffset textascent add 1 add neg def
|
||||
textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
|
||||
textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
|
||||
textxpos textypos moveto textgaps 0 tstr ashow
|
||||
} ifelse
|
||||
} if
|
||||
|
||||
% Display the guard elements
|
||||
guardwhitespace {
|
||||
0.75 setlinewidth
|
||||
guardleftpos 0 ne {
|
||||
newpath
|
||||
guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
guardrightpos 0 ne {
|
||||
newpath
|
||||
guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
|
||||
guardwidth guardheight -2 div rlineto
|
||||
guardwidth neg guardheight -2 div rlineto
|
||||
stroke
|
||||
} if
|
||||
} if
|
||||
|
||||
grestore
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
% --DESC: Code 93
|
||||
% --EXAM: THIS IS CODE 93
|
||||
% --EXOP: includetext includecheck
|
||||
% --RNDR: renlinear
|
||||
/setpacking where {pop currentpacking true setpacking} if
|
||||
1 dict
|
||||
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
|
||||
begin
|
||||
/code93 {
|
||||
|
||||
20 dict begin % Confine variables to local scope
|
||||
|
||||
/options exch def % We are given an option string
|
||||
/barcode exch def % We are given a barcode string
|
||||
|
||||
/dontdraw false def
|
||||
/includecheck false def % Enable/disable checkdigit
|
||||
/includetext false def % Enable/disable text
|
||||
/textfont /Courier def
|
||||
/textsize 10 def
|
||||
/textyoffset -7 def
|
||||
/height 1 def
|
||||
/parsefnc false def
|
||||
|
||||
% Parse the input options
|
||||
options type /stringtype eq {
|
||||
1 dict begin
|
||||
options {
|
||||
token false eq {exit} if dup length string cvs (=) search
|
||||
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
||||
} loop
|
||||
currentdict end /options exch def
|
||||
} if
|
||||
options {def} forall
|
||||
|
||||
/textfont textfont cvlit def
|
||||
/textsize textsize cvr def
|
||||
/textyoffset textyoffset cvr def
|
||||
/height height cvr def
|
||||
|
||||
/encs
|
||||
[ (131112) (111213) (111312) (111411) (121113)
|
||||
(121212) (121311) (111114) (131211) (141111)
|
||||
(211113) (211212) (211311) (221112) (221211)
|
||||
(231111) (112113) (112212) (112311) (122112)
|
||||
(132111) (111123) (111222) (111321) (121122)
|
||||
(131121) (212112) (212211) (211122) (211221)
|
||||
(221121) (222111) (112122) (112221) (122121)
|
||||
(123111) (121131) (311112) (311211) (321111)
|
||||
(112131) (113121) (211131) (121221) (312111)
|
||||
(311121) (122211) (111141) (1111411)
|
||||
] def
|
||||
|
||||
% Create a string of the available characters
|
||||
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
|
||||
|
||||
/barlen barcode length def
|
||||
|
||||
% Special function characters
|
||||
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
|
||||
/fncvals <<
|
||||
(SFT$) sft1
|
||||
(SFT%) sft2
|
||||
(SFT/) sft3
|
||||
(SFT+) sft4
|
||||
>> def
|
||||
|
||||
% Convert input into bytes accounting for shift characters
|
||||
/msg barlen array def
|
||||
/i 0 def /j 0 def {
|
||||
i barlen eq {exit} if
|
||||
/char barcode i get def
|
||||
parsefnc char 94 eq and i barlen 4 sub lt and {
|
||||
barcode i 1 add get 94 ne {
|
||||
/char fncvals barcode i 1 add 4 getinterval get def
|
||||
/i i 4 add def
|
||||
} {
|
||||
/i i 1 add def
|
||||
} ifelse
|
||||
} if
|
||||
msg j char put
|
||||
/i i 1 add def
|
||||
/j j 1 add def
|
||||
} loop
|
||||
/msg msg 0 j getinterval def
|
||||
/msglen msg length def
|
||||
|
||||
includecheck {
|
||||
/sbs msglen 6 mul 25 add string def
|
||||
} {
|
||||
/sbs msglen 6 mul 13 add string def
|
||||
} ifelse
|
||||
/txt msglen array def
|
||||
|
||||
% Put the start character
|
||||
sbs 0 encs 47 get putinterval
|
||||
|
||||
/checksum1 0 def /checksum2 0 def
|
||||
0 1 msglen 1 sub {
|
||||
/i exch def
|
||||
% Lookup the encoding for the each barcode character
|
||||
msg i get dup 0 lt {
|
||||
42 exch sub /indx exch def
|
||||
/char ( ) def
|
||||
} {
|
||||
1 string dup 0 4 -1 roll put /char exch def
|
||||
barchars char search
|
||||
pop % Discard true leaving pre
|
||||
length /indx exch def % indx is the length of pre
|
||||
pop pop % Discard seek and post
|
||||
} ifelse
|
||||
/enc encs indx get def % Get the indxth encoding
|
||||
sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs
|
||||
txt i [char i 9 mul 9 add textyoffset textfont textsize] put
|
||||
/checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
|
||||
/checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
|
||||
} for
|
||||
|
||||
includecheck {
|
||||
% Put the first checksum character
|
||||
/checksum1 checksum1 47 mod def
|
||||
/checksum2 checksum2 checksum1 add 47 mod def
|
||||
sbs msglen 6 mul 6 add encs checksum1 get putinterval
|
||||
sbs msglen 6 mul 12 add encs checksum2 get putinterval
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 18 add encs 48 get putinterval
|
||||
} {
|
||||
% Put the end character
|
||||
sbs msglen 6 mul 6 add encs 48 get putinterval
|
||||
} ifelse
|
||||
|
||||
% Return the arguments
|
||||
<<
|
||||
/ren //renlinear
|
||||
/sbs [sbs {48 sub} forall]
|
||||
/bhs [sbs length 1 add 2 idiv {height} repeat]
|
||||
/bbs [sbs length 1 add 2 idiv {0} repeat]
|
||||
includetext {
|
||||
/txt txt
|
||||
} if
|
||||
/opt options
|
||||
>>
|
||||
|
||||
dontdraw not //renlinear if
|
||||
|
||||
end
|
||||
|
||||
} bind def
|
||||
/code93 dup load /uk.co.terryburton.bwipp defineresource pop
|
||||
end
|
||||
/setpacking where {pop setpacking} if
|
||||
|
||||
gsave
|
||||
50 50 translate
|
||||
0 0 moveto <544f20474f2050524556> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
|
||||
grestore
|
||||
|
||||
showpage
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 157 KiB |
@ -0,0 +1,4 @@
|
||||
CFLAGS=-g -Wall
|
||||
ser: ser.c
|
||||
gcc -ggdb -Wall ser.c -o ser -lpthread
|
||||
#mipsel-linux-uclibc-gcc -o ser.mips ser.c -lpthread
|
@ -0,0 +1,320 @@
|
||||
#include <stdio.h> /* Standard input/output definitions */
|
||||
#include <string.h> /* String function definitions */
|
||||
#include <unistd.h> /* UNIX standard function definitions */
|
||||
#include <fcntl.h> /* File control definitions */
|
||||
#include <errno.h> /* Error number definitions */
|
||||
#include <termios.h> /* POSIX terminal control definitions */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h> /* Posix 1003.1c threads */
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
int fd;
|
||||
int screensaver;
|
||||
int brightness = 4;
|
||||
char *fifo;
|
||||
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_t thread1;
|
||||
|
||||
int
|
||||
initport (int fd)
|
||||
{
|
||||
struct termios options;
|
||||
// Get the current options for the port...
|
||||
tcgetattr (fd, &options);
|
||||
// Set the baud rates to 9600...
|
||||
cfsetispeed (&options, B9600);
|
||||
cfsetospeed (&options, B9600);
|
||||
// Enable the receiver and set local mode...
|
||||
options.c_cflag |= (CLOCAL | CREAD);
|
||||
|
||||
options.c_cflag &= ~PARENB;
|
||||
options.c_cflag &= ~CSTOPB;
|
||||
options.c_cflag &= ~CSIZE;
|
||||
options.c_cflag |= CS8;
|
||||
|
||||
// Set the new options for the port...
|
||||
tcsetattr (fd, TCSANOW, &options);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
char display_init[] = { 0x1b, 0x40 };
|
||||
char display_showtime[] = { 0x1F, 0x54 };
|
||||
char display_cursor_off[] = { 0x1f, 0x43, 0x0 };
|
||||
char display_cursor_on[] = { 0x1f, 0x43, 0x1 };
|
||||
|
||||
char display_on[] = { 0x1f, 0x45, 0x0 };
|
||||
char display_off[] = { 0x1f, 0x45, 0xff };
|
||||
|
||||
char display_overwrite[] = { 0x1f, 0x01 };
|
||||
char display_vscroll[] = { 0x1f, 0x02 };
|
||||
char display_hscroll[] = { 0x1f, 0x03 };
|
||||
|
||||
char display_clear_screen[] = { 0x0c };
|
||||
|
||||
char display_time[] = {0x1f,0x55};
|
||||
|
||||
#define DWC(c) display_write(c,sizeof(c))
|
||||
#define SEND_TEXT(t) display_write(t,strlen(t))
|
||||
|
||||
#define SEND_DISPLAY_INIT DWC(display_init)
|
||||
#define SEND_CURSOR_OFF DWC(display_cursor_off)
|
||||
#define SEND_CURSOR_ON DWC(display_cursor_on)
|
||||
#define SEND_DEFINE_TIMER DWC(display_showtime)
|
||||
#define SEND_SHOW_TIMER DWC(display_time)
|
||||
#define SEND_MODE_OVERWRITE DWC(display_overwrite)
|
||||
#define SEND_MODE_VSCROLL DWC(display_vscroll)
|
||||
#define SEND_MODE_HSCROLL DWC(display_hscroll)
|
||||
#define SEND_DISPLAY_OFF DWC(display_off)
|
||||
#define SEND_DISPLAY_ON DWC(display_on)
|
||||
#define SEND_CLEAR DWC(display_clear_screen);
|
||||
|
||||
#define TIME_BASE 200000
|
||||
#define TB_TO_SECS(x) (x*1000000/TIME_BASE)
|
||||
|
||||
#define TIME_CLOCK TB_TO_SECS(5)
|
||||
#define TIME_DIM TB_TO_SECS(30)
|
||||
#define TIME_OFF TB_TO_SECS(120)
|
||||
|
||||
#define DEVICE "/dev/ttyUSB0"
|
||||
|
||||
#define PAUSEMSG "Hallo, bitte melde Dich am Barcodereader an, um das Kassensystem zu benutzen *** Angebot: Die Mate heute nur 0.75 *** "
|
||||
|
||||
#define LINELEN 20
|
||||
|
||||
void
|
||||
display_write (const void *buf, size_t count)
|
||||
{
|
||||
pthread_mutex_lock (&mutex1);
|
||||
write (fd, buf, count);
|
||||
pthread_mutex_unlock (&mutex1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
display_putstring (char *s)
|
||||
{
|
||||
screensaver = 0;
|
||||
SEND_TEXT(s);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
showtime (void)
|
||||
{
|
||||
|
||||
SEND_CURSOR_OFF;
|
||||
|
||||
char c[5] = { 0x1F, 0x54, 0x00, 0x00 };
|
||||
time_t timer; // Define the timer
|
||||
struct tm *tblock; // Define a structure for time block
|
||||
|
||||
timer = time (NULL);
|
||||
tblock = localtime (&timer);
|
||||
c[2] = tblock->tm_hour;
|
||||
c[3] = tblock->tm_min;
|
||||
|
||||
display_write (&c, 4);
|
||||
|
||||
SEND_MODE_HSCROLL;
|
||||
char *msg = "Freitagsrunde 4!";
|
||||
display_write (msg, strlen (msg));
|
||||
}
|
||||
|
||||
void
|
||||
display_dim (short i)
|
||||
{
|
||||
// return;
|
||||
if (i == brightness)
|
||||
{
|
||||
|
||||
//printf ("display_dim: would not change brightness. abort.\n");
|
||||
|
||||
return;
|
||||
}
|
||||
if (i > 0 && i < 5)
|
||||
{
|
||||
int l = 0;
|
||||
char *d;
|
||||
if (brightness == 0)
|
||||
{
|
||||
SEND_CURSOR_OFF;
|
||||
// turn display on again
|
||||
SEND_DISPLAY_ON;
|
||||
SEND_MODE_OVERWRITE;
|
||||
char c[4] = { 0x1f, 0x58, 0x04, 0x00 };
|
||||
l = 6;
|
||||
//c[5]=i;
|
||||
d = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
//set brightness directly:
|
||||
char c[4] = { 0x1f, 0x58, 0x01, 0x00 };
|
||||
l = 3;
|
||||
c[2] = i;
|
||||
d = c;
|
||||
//printf ("command mode: %x \n", c[2]);
|
||||
}
|
||||
display_write (d, l);
|
||||
brightness = i;
|
||||
}
|
||||
else if (i == 0)
|
||||
{
|
||||
//turn off
|
||||
SEND_DISPLAY_OFF;
|
||||
brightness = i;
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
rthread (void *args)
|
||||
{
|
||||
|
||||
int pipe;
|
||||
char pc = ' ';
|
||||
char c = ' ';
|
||||
while (1)
|
||||
{
|
||||
pipe = open ("/tmp/display", O_RDONLY);
|
||||
int r;
|
||||
while ((r = read (pipe, &c, 1)) > 0)
|
||||
{
|
||||
|
||||
screensaver = 0;
|
||||
|
||||
if (pc == '\n')
|
||||
{
|
||||
display_write (&pc, 1);
|
||||
}
|
||||
if (c != '\n')
|
||||
{
|
||||
display_write (&c, 1);
|
||||
}
|
||||
pc = c;
|
||||
display_dim (4);
|
||||
}
|
||||
close (pipe);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sighandler (int sig)
|
||||
{
|
||||
pthread_kill (thread1, 0);
|
||||
|
||||
SEND_DISPLAY_INIT;
|
||||
SEND_MODE_OVERWRITE;
|
||||
SEND_CURSOR_OFF;
|
||||
SEND_DISPLAY_OFF;
|
||||
|
||||
close (fd);
|
||||
if (fifo) {unlink(fifo);}
|
||||
exit (0);
|
||||
//signal(sig, sighandler);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
char *devnode ;
|
||||
|
||||
//TODO: arg parser!
|
||||
fifo=strdup("/tmp/display");
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
devnode=strdup(DEVICE);
|
||||
printf ("no device specified, using default %s\n",devnode);
|
||||
}else{
|
||||
devnode=strdup(argv[1]);
|
||||
}
|
||||
fd = open (devnode, O_RDWR | O_NOCTTY | O_NDELAY);
|
||||
if (fd == -1)
|
||||
{
|
||||
perror (devnode);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fcntl (fd, F_SETFL, 0);
|
||||
}
|
||||
|
||||
initport (fd);
|
||||
|
||||
//init display, set, vertical scroll, cursor off
|
||||
SEND_DISPLAY_INIT;
|
||||
SEND_MODE_OVERWRITE;
|
||||
SEND_CURSOR_OFF;
|
||||
|
||||
pthread_create (&thread1, NULL, rthread, NULL);
|
||||
signal (SIGINT, sighandler);
|
||||
|
||||
if (mkfifo (fifo, S_IRWXU | S_IRWXG | S_IRWXO))
|
||||
{
|
||||
perror (fifo);
|
||||
if (errno != EEXIST && errno != ESPIPE)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//showtime();
|
||||
display_putstring ("Display initialized ");
|
||||
display_putstring (fifo);
|
||||
sleep (3);
|
||||
|
||||
screensaver = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
usleep(TIME_BASE);
|
||||
//printf ("screensaver = %05d brightness: %d\n", screensaver, brightness);
|
||||
if (screensaver < 10000)
|
||||
{
|
||||
screensaver++;
|
||||
}
|
||||
|
||||
if (screensaver == TIME_CLOCK)
|
||||
{
|
||||
showtime ();
|
||||
}
|
||||
if (screensaver == TIME_OFF)
|
||||
{
|
||||
display_dim (0);
|
||||
}
|
||||
|
||||
|
||||
//show a scroll text while the screensaver is active...
|
||||
if ((screensaver > (TIME_CLOCK+10)) && (screensaver < TIME_OFF)){
|
||||
char *message = calloc(LINELEN+1,sizeof(char));
|
||||
strncpy(message,PAUSEMSG+((screensaver-TIME_CLOCK-1)%strlen(PAUSEMSG)),LINELEN);
|
||||
int l = strlen(message);
|
||||
if (l<LINELEN){
|
||||
message = strncat(message, PAUSEMSG , LINELEN-l);
|
||||
}
|
||||
SEND_TEXT("\x0b");
|
||||
SEND_TEXT(message);
|
||||
free(message);
|
||||
}
|
||||
|
||||
//after some more seconds of inactivity dim display and finally turn off
|
||||
if ((screensaver > TIME_DIM) && (brightness > 1))
|
||||
{
|
||||
//printf ("dimming\n");
|
||||
display_dim (brightness - 1);
|
||||
}
|
||||
}
|
||||
|
||||
//you'll never get here
|
||||
close (fd);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in new issue