Programma di esempio SPOOLER.PRT |
; SPOOLER
;
; Programma per Proteus
;
; (C) 2003 Simone Zanella Productions
;
; Verifica la presenza di un file; nel caso esista e sia scrivibile (quindi non bloccato per aggiornamento da altri
; processi), lo elabora inviando delle stringhe (ad esempio i comandi per produrre un'etichetta su una stampante
; per barcode) unendole con i dati disponibili nel file.
; La stampante alla quale vengono inviati i dati è specificata attraverso l'indirizzo di rete e la porta.
;
; I parametri di funzionamento si trovano all'inizio del programma e sono:
; - Filename = nome del file con i dati
; - NetAddr = indirizzo della stampante
; - NetPort = porta sulla quale la stampante attende la connessione
#!proteus -z -j
!include "win32.prt"
!include "socket.prt"
; Se eseguito come servizio, utilizza dei dati fissi; altrimenti, li preleva dalla riga di comando
!ifdef SERVICE
Filename = "c:\\spool\\DATI.TXT"
NetAddr = "172.16.0.82"
NetPort = 9090
!else
IF LT(ARGC, 7)
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " filedati indirizzo porta"
CONSOLELN ""
CONSOLELN "Scopo: utilizza il file dati per stampare etichetta sulla stampante"
CONSOLELN "all'indirizzo e alla porta specificate."
ABORT 0
FI
Filename = ARGV(5)
NetAddr = ARGV(6)
NetPort = ARGV(7)
!endif
WHILE 1
; Attende mezzo secondo
SLEEP(0.5)
IF ISFILE(Filename)
H2 = FOPEN(Filename, 4)
IF EQ(H2, -1)
; File bloccato, probabilmente lo sta ancora scrivendo
CONTINUE
FI
HSock = W32SOCKET(AF_INET, SOCK_STREAM, IPPROTO_TCP)
IF EQ(HSock, -1)
Message("Errore nella creazione del socket")
Message("Errore socket: " W32LASTSOCKETERR())
FCLOSE(H2)
CONTINUE
FI
Result = W32CONNECT(HSock, AF_INET, NetPort, NetAddr)
IF EQ(Result, -1)
Message("Errore nella connessione del socket")
Message("Errore socket: " W32LASTSOCKETERR())
W32SHUTDOWN(HSock, SD_BOTH)
W32CLOSESOCKET(HSock)
FCLOSE(H2)
CONTINUE
FI
Errore = 0
WHILE NOT(FEOF(H2))
S2 = FREADLN(H2)
IF NOT(ISEMPTY(S2))
; Suppone che il file contenga su ogni riga un codice da stampare come barcode
; e la quantità di etichette da produrre, separate da una virgola
Codice = TOKEN(S2, 1, ",")
NumEtic = TOKEN(S2, 2, ",")
IF ISEMPTY(NumEtic)
NumEtic = 1
FI
; Prepara i dati da inviare alla stampante (codice di esempio FingerPrint per stampanti Intermec)
S = "\r\nCLIP ON\r\nDIR 1\r\nAN 7\r\nPP 100, 100\r\nBT \"CODE39\"\r\n" \
"BARRATIO 2,1 : BARHEIGHT 120 : BARMAG 3 : BARFONT \"Swiss 721 BT\" ON\r\n" \
"PB \"" Codice "\"\r\nPF " NumEtic "\r\n"
Result = W32SEND(HSock, S, 0)
IF EQ(Result, -1)
Message("Errore nell'invio")
Message("Errore socket: " W32LASTSOCKETERR())
W32SHUTDOWN(HSock, SD_BOTH)
W32CLOSESOCKET(HSock)
Errore = 1
BREAK
FI
FI
LOOP
FCLOSE(H2)
IF EQ(Errore, 0)
W32SHUTDOWN(HSock, SD_BOTH)
W32CLOSESOCKET(HSock)
Message("Invio completato.")
FREMOVE(Filename)
FI
FI
LOOP
ABORT 0
FUNCTION Message(s)
; Se eseguito come servizio, salva il messaggio su un file di log;
; altrimenti, stampa il messaggio a video
!ifdef SERVICE
FAPPEND("c:\\spooler\\log.txt", s "\r\n")
!else
CONSOLELN s
!endif
RETURN