Merge branch 'master' of git.someserver.de:k4ever

This commit is contained in:
theresa 2011-10-12 18:36:23 +02:00
commit a3223e197c
9 changed files with 3161 additions and 1329 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 157 KiB

View File

@ -6,7 +6,7 @@
from __future__ import print_function
import freitagslib.network as net
from freitagslib.commands import BuyCommand, DepositCommand, ToGoCommand
from freitagslib.commands import BuyCommand, DepositCommand
import colorama
from colorama import Fore, Style
@ -19,7 +19,7 @@ import time
import urllib2
COLOR_WARN = Fore.YELLOW
COLOR_HINT = Fore.YELLOW + Style.BRIGHT
COLOR_ERROR = Fore.RED
COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT
COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT
@ -70,14 +70,19 @@ def delay(what, seconds):
def warn_balance():
print('Kontostrand im Minus, bitte Geld aufladen.')
print('Kontostand im Minus, bitte Geld aufladen.')
def error_page(message):
def error_page(error_message, hint_message=None):
clear()
print(COLOR_ERROR + message + COLOR_RESET)
print(COLOR_ERROR + error_message + COLOR_RESET)
print()
delay('Weiter', 3)
delay_seconds = 3
if hint_message is not None:
print(COLOR_HINT + hint_message + COLOR_RESET)
print()
delay_seconds += 3
delay('Weiter', delay_seconds)
class Status:
@ -98,22 +103,14 @@ class Status:
def color(amount):
return COLOR_WITHDRAW if amount < 0 else COLOR_DEPOSIT
def color_command(command):
diff = command.difference()
if diff >= 0:
return COLOR_DEPOSIT
return COLOR_TO_GO if isinstance(command, ToGoCommand) else COLOR_WITHDRAW
def show_total(balance, plus=' '):
print('%3s %-40s %s%c %6.2f Euro%s' \
% ('', '', color(balance), sign(balance, plus),
abs(balance), COLOR_RESET))
def show_item(position, command):
diff = command.difference()
label = command.label()
def show_item(position, diff, label, color):
print('%2d) %-40s %s%c %6.2f Euro%s' \
% (position, label, color_command(command), sign(diff),
% (position, label, color, sign(diff),
abs(diff), COLOR_RESET))
def show_bar():
@ -127,8 +124,18 @@ class Status:
print('Geplante Änderungen:')
show_total(initial_balance)
for i, (command, balance_backup) in enumerate(self.transfers):
show_item(i + 1, command)
i = 1
for command, dummy in self.transfers:
if isinstance(command, BuyCommand):
if (command.includes_commodity()):
show_item(i, -command.commodity_value(), command.commodity_label(), COLOR_WITHDRAW)
i += 1
if (command.includes_deposit()):
show_item(i, -command.deposit_value(), command.deposit_label(), COLOR_TO_GO)
i += 1
else:
show_item(i, command.difference(), command.label(), COLOR_DEPOSIT)
i += 1
show_bar()
if len(self.transfers) > 1:
show_total(self.balance - initial_balance, plus='+')
@ -215,109 +222,78 @@ class Status:
if scope == TO_GO_ALL:
"""
Adds a ToGoCommands for each BuyCommands with deposit > 0 lacking a pair
Makes all BuyCommands with deposit > 0 include deposit
...and updates future balance accordingly.
"""
after = list()
dummy, initial_balance = self.transfers[0]
balance_before = initial_balance
def body(prev, command, balance_before):
if isinstance(prev, BuyCommand) \
and prev.deposit() > 0 \
and (not isinstance(command, ToGoCommand) \
or (isinstance(command, ToGoCommand) \
and prev.item() != command.item())):
to_go = ToGoCommand(prev.item())
prev.set_to_go(True)
after.append((to_go, balance_before))
balance_before += to_go.difference()
if command is not None:
after.append((command, balance_before))
for command, dummy in self.transfers:
if isinstance(command, BuyCommand) \
and not command.includes_deposit() \
and command.deposit_value() > 0:
command.include_deposit(True)
balance_before += command.difference()
return balance_before
prev = None
for command, dummy in list(self.transfers):
balance_before = body(prev, command, balance_before)
prev = command
balance_before = body(prev, None, balance_before)
self.balance = balance_before
self.transfers = after
elif scope == TO_GO_NONE:
"""
Deletes all ToGoCommands
Makes all BuyCommands that include commodity
not include deposit any more
...and updates future balance accordingly.
"""
after = list()
first_command, initial_balance = self.transfers[0]
balance_before = initial_balance
for command, dummy in list(self.transfers):
for command, dummy in self.transfers:
if isinstance(command, BuyCommand) \
and command.is_to_go():
command.set_to_go(False)
elif isinstance(command, ToGoCommand):
continue
after.append((command, balance_before))
and command.includes_commodity():
command.include_deposit(False)
balance_before += command.difference()
self.balance = balance_before
self.transfers = after
elif scope == TO_GO_PREV:
"""
Adds a ToGoCommand after previous BuyCommand
Makes the last BuyCommand include deposit
...and updates future balance accordingly.
"""
prev, balance_backup = self.transfers[-1]
if not isinstance(prev, BuyCommand):
error_page(_PRODUCT_FIRST)
return
to_go = ToGoCommand(prev.item())
prev.set_to_go(True)
self.transfers.append((to_go, self.balance))
self.balance += to_go.difference()
if prev.includes_deposit():
error_page('FEHLER: Pfand für Produkt "%s" bereits aktiviert' % prev.item_name())
return
if prev.deposit_value() <= 0:
error_page('FEHLER: Produkt "%s" hat kein Pfand' % prev.item_name())
return
before = prev.difference()
prev.include_deposit(True)
after = prev.difference()
self.balance += (after - before)
elif scope == TO_GO_ONLY:
"""
Replace all BuyCommands with deposit > 0 by
a ToGoCommand. Resolve ToGoCommand duplicates.
Makes all BuyCommand that include commodity
be deposit only
...and updates future balance accordingly.
"""
after = list()
first_command, initial_balance = self.transfers[0]
dummy, initial_balance = self.transfers[0]
balance_before = initial_balance
for command, dummy in list(self.transfers):
if isinstance(command, ToGoCommand) \
and prev_item is not None \
and command.item() == prev_item:
"""
Skip this very duplicate
"""
prev_item = None
continue
elif isinstance(command, BuyCommand) \
and command.deposit() > 0:
"""
Replace by ToGoCommand
"""
item = command.item()
command = ToGoCommand(item)
prev_item = item
else:
prev_item = None
after.append((command, balance_before))
for command, dummy in self.transfers:
if isinstance(command, BuyCommand) \
and command.deposit_value() > 0 \
and command.includes_commodity():
command.include_commodity(False)
command.include_deposit(True)
balance_before += command.difference()
self.balance = balance_before
self.transfers = after
def undo(self):
assert(self.logged_in())
if self.transfers:
(last_command, balance_backup) = self.transfers[-1]
if isinstance(last_command, ToGoCommand) \
and self.transfers:
second_last_command = self.transfers[-2]
if isinstance(second_last_command, BuyCommand):
second_last_command.set_to_go(False)
dummy, balance_backup = self.transfers[-1]
self.transfers.pop()
self.balance = balance_backup
else:
@ -352,6 +328,14 @@ def handle(line, status):
else:
try:
status.login(line)
except urllib2.HTTPError as e:
if e.code == 404: # URL not found == user unknown
error_page('FEHLER: Benutzer "%s" nicht bekannt' % line,
hint_message='Ist in der WebApp unter "Einstellungen" ' \
'für Ihren Account Plugin "BarcodePlugin" ' \
'als erlaubt markiert?')
else:
error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))
except urllib2.URLError as e:
error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))

View File

@ -5,18 +5,16 @@
# Licensed under GPL v3 or later
import freitagslib.network as net
from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY
from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT
class Command(object):
def difference(self):
return self._difference
class DepositCommand(Command):
class DepositCommand(object):
def __init__(self, amount):
self._difference = amount
def difference(self):
self._difference
def run(self, user_name):
net.deposit(self._difference, net.DEPOSIT_CASH, user_name)
@ -24,43 +22,61 @@ class DepositCommand(Command):
return '%.2f Euro einzahlen' % self._difference
class _ItemBasedCommand(Command):
class BuyCommand(object):
def __init__(self, item):
self._item = item
self._commodity = True
self._deposit = False
def item(self):
return self._item
def _what_to_buy(self):
if self._deposit and self._commodity:
return ITEM_AND_DEPOSIT
elif self._deposit:
return DEPOSIT_ONLY
elif self._commodity:
return ITEM_ONLY
else:
raise ValueError("BuyCommand in illegal state")
class BuyCommand(_ItemBasedCommand):
def __init__(self, item):
super(BuyCommand, self).__init__(item)
self._difference = -item.price
self._to_go = False ## TODO session state, instead?
def difference(self):
if self._deposit and self._commodity:
return -(self._item.price + self._item.deposit)
elif self._deposit:
return -(self._item.deposit)
elif self._commodity:
return -(self._item.price)
else:
raise ValueError("BuyCommand in illegal state")
def run(self, user_name):
net.buy_item(self._item.id, what_about_it=ITEM_ONLY, user_name=user_name)
net.buy_item(self._item.id, what_about_it=self._what_to_buy(), user_name=user_name)
def label(self):
def item_name(self):
return self._item.name
def is_to_go(self):
return self._to_go
def commodity_label(self):
if self._deposit:
return self._item.name
else:
return "%s (exkl. Pfand)" % self._item.name
def set_to_go(self, to_go):
self._to_go = to_go
def deposit(self):
return self._item.deposit
class ToGoCommand(_ItemBasedCommand):
def __init__(self, item):
super(ToGoCommand, self).__init__(item)
self._difference = -item.deposit
def run(self, user_name):
net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name)
def label(self):
def deposit_label(self):
return '%s Pfand' % self._item.name
def includes_commodity(self):
return self._commodity
def includes_deposit(self):
return self._deposit
def include_commodity(self, commodity):
self._commodity = commodity
def include_deposit(self, deposit):
self._deposit = deposit
def commodity_value(self):
return self._item.price
def deposit_value(self):
return self._item.deposit

4
display-daemon/Makefile Normal file
View File

@ -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

320
display-daemon/ser.c Normal file
View File

@ -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;
}