; FILEWEDG
;
; Programma per Proteus
;
; (C) 2005 Simone Zanella Productions
;
; Introduce in emulazione di tastiera i dati presenti in un file.
; Questo programma può essere installato come script associato al servizio Proteus.
;
; I parametri si trovano all'inizio del programma e sono:
; - POLLDELAY = intervallo per la verifica di presenza del file
; - KILLFILE = flag che indica se cancellare il file dopo averlo trasmesso; se 0,
; il file non viene rimosso, ma non viene più ritrasmesso finché non cambia la data/ora/dimensione;
; - PATHNAME = file da inviare
; - POSTFIX = terminatore
;
; In dettaglio, il programma esegue le seguenti operazioni:
; - verifica se c'è il file da scaricare;
; - se lo trova, lo invia in emulazione di tastiera;
; - se è richiesta la cancellazione, rimuove il file, oppure verifica la data/ora/dimensione
; e torna ad inviare il file solo quando uno di questi dati cambia.
;
; Il codice commentato più sotto permette anche in alternativa di:
; - selezionare una specifica finestra (applicativo Ultra-Edit) ed inviare il dato verbatim, seguito da Invio;
; - lanciare il blocco note (se non aperto), introdurre il dato verbatim (seguito da Invio) e tornare alla finestra
; iniziale.
#!proteus -z -j
!include "win32.prt"
CONST POLLDELAY = 3000
CONST KILLFILE = 0
CONST PATHNAME = "C:\\DATA.TXT"
CONST POSTFIX = "{ENTER}"
LASTSIZE = ""
LASTDATE = ""
LASTTIME = ""
WHILE 1
IF KILLFILE
H = FOPEN(PATHNAME, 4)
ELSE
; Verifico data/ora del file e lo invio solo se cambiate
HD = DIROPEN(PATHNAME, 1)
IF NEQ(HD, -1)
IF OR(STRNEQ(LASTSIZE, DIRLAST(HD, 2)), \
STRNEQ(LASTDATE, DIRLAST(HD, 3)), \
STRNEQ(LASTTIME, DIRLAST(HD, 4)))
H = FOPEN(PATHNAME, 4)
IF NEQ(H, -1)
DIRCLOSE(HD)
HD = DIROPEN(PATHNAME, 1)
LASTSIZE = DIRLAST(HD, 2)
LASTDATE = DIRLAST(HD, 3)
LASTTIME = DIRLAST(HD, 4)
FI
ELSE
H = -1
FI
DIRCLOSE(HD)
ELSE
H = -1
FI
FI
; Se non è un servizio e l'utente ha premuto ESC, esce
!ifndef SERVICE
IF KBDHIT()
IF EQ(GETCH(), 27)
BREAK
FI
FI
!endif
IF NEQ(H, -1)
WHILE NOT(FEOF(H))
Dato1 = FREADLN(H)
; >>> Codice di esempio commentato (funzionamento alternativo) <<<
;
; Seleziona una specifica finestra (che sappiamo essere sicuramente esistente) prima di
; inviare il dato in emulazione di tastiera, senza ulteriori elaborazioni, tranne l'aggiunta del postfisso.
;
; IF STRLEN(Dato1)
; W32SETFOCUS(W32FINDWINDOW("*ULTRAEDIT-32*"))
; W32SENDKEYS(KTrans(Dato1) POSTFIX)
; FI
; CONTINUE
; >>> Codice di esempio commentato (funzionamento alternativo) <<<
;
; Seleziona la finestra del Blocco note; se non esiste, lancia il programma, attende 2 secondi, quindi
; introduce il dato in emulazione di tastiera, senza ulteriori elaborazioni.
; Il fuoco (= finestra in primo piano) al termine torna all'applicazione precedentemente in evidenza.
;
; IF STRLEN(Dato1)
; Hold = W32GETFOCUS()
;
; HW = W32FINDWINDOW("*Blocco note*")
; IF EQ(HW, 0)
; W32SHELL("NOTEPAD.EXE")
; SLEEP(2)
; HW = W32FINDWINDOW("*Blocco note*")
; FI
; IF NEQ(HW, 0)
; W32SETFOCUS(HW)
; W32SENDKEYS(KTrans(Dato1) POSTFIX)
; ELSE
; CONSOLELN "Impossibile aprire blocco note!"
; FI
; W32SETFOCUS(Hold)
; FI
; CONTINUE
W32SENDKEYS(KTrans(Dato1) POSTFIX)
LOOP
FCLOSE(H)
IF KILLFILE
FREMOVE(PATHNAME)
FI
FI
LOOP
ABORT 0
FUNCTION KTrans(s)
; Mappatura dei caratteri speciali: caratteri che non si trovano
; sulla tastiera potrebbero richiedere l'introduzione della sequenza
; con ALT + numero
l = STRLEN(s)
r = ""
FOR x = 1 TO l
c = SUBSTR(s, x, 1)
SWITCH c STREQ
ON "~"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD6}{ALT UP}"
ON "{"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD3}{ALT UP}"
ON "}"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD5}{ALT UP}"
ON "+", "^", "%", "(", ")", "[", "]"
r = r "{" c "}"
OTHER
r = r c
OFF
NEXT
RETURN r